Documentación de la API
Crea, gestiona y consulta la analítica de tus enlaces de forma programática con la REST API de Quik.mn.
Todos los servicios
Todos los productos de la plataforma Quik.mn: por REST API y en la web.
URL base
Todos los endpoints parten de la siguiente URL base:
Autenticación
En cada solicitud, incluye la clave de API de tu panel en la cabecera Authorization de la siguiente forma:
No compartas tu clave con nadie. Si se filtra, vuelve a generarla desde el panel.
Lista de endpoints
Parámetros
POST /api/v1/links — campos del body:
GET /api/v1/links — parámetros de query:
Formato de error
Cada error devuelve un código de estado HTTP (401, 404, 409, 422, 429) y una estructura JSON uniforme:
{ "error": "alias_taken", "message": "Ese alias está reservado o ya está en uso." }
Códigos habituales: unauthorized (401), not_found (404), alias_taken (409), invalid_url / invalid_alias / invalid_expires_at / invalid_starts_at (422), rate_limited (429).
Límites de uso
Ejemplo de solicitud
Ejemplo en cURL para crear un enlace corto:
curl -X POST https://quik.mn/api/v1/links \
-H "Authorization: Bearer qk_live_xxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://ejemplo.com/ruta/muy/larga",
"alias": "promo",
"title": "Campaña de primavera",
"expires_at": "2026-12-31 23:59:59"
}'
Webhook
Registra un endpoint en la sección Webhook del panel y enviaremos un POST con JSON a tu URL cada vez que ocurra un evento seleccionado. Una respuesta 2xx cuenta como éxito; si no, lo reintentamos hasta 3 veces con esperas de 1 min a 10 min. Tras 10 fallos seguidos, el webhook se desactiva automáticamente.
Estructura de cada envío (ejemplo):
{
"event": "link.created",
"created_at": "2026-07-18T09:30:00+00:00",
"data": {
"link": {
"id": 42, "slug": "promo", "short_url": "https://quik.mn/promo",
"long_url": "https://ejemplo.com/ruta/muy/larga", "title": "Campaña de primavera",
"clicks": 0, "active": true, "state": "ok",
"created_at": "2026-07-18 09:30:00", "expires_at": "2027-07-18 09:30:00"
}
}
}
Verificar la firma
Cada envío llega con estas cabeceras: X-Quik-Event (el nombre del evento), X-Quik-Signature — sha256=HMAC_SHA256(body, secret). El secret se muestra una sola vez, al crear el webhook. Verifica SIEMPRE la firma sobre el body sin procesar (raw) y con una comparación de tiempo constante:
<?php
// PHP — verifica la firma sobre el cuerpo (raw) de la petición
$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_QUIK_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $payload, $secret);
if (!hash_equals($expected, $signature)) {
http_response_code(401);
exit('invalid signature');
}
$event = json_decode($payload, true);
// $event['event'], $event['data'] ...
http_response_code(200);
// Node.js (Express) — verifica la firma sobre el cuerpo (raw) de la petición
const crypto = require('crypto');
app.post('/quik-webhook', express.raw({ type: 'application/json' }), (req, res) => {
const signature = req.get('X-Quik-Signature') || '';
const expected = 'sha256=' +
crypto.createHmac('sha256', secret).update(req.body).digest('hex');
const a = Buffer.from(expected), b = Buffer.from(signature);
if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
return res.status(401).send('invalid signature');
}
const event = JSON.parse(req.body); // event.event, event.data ...
res.sendStatus(200);
});
Límites: 1 webhook en Free, 3 en Pro y 10 en Business. El endpoint debe ser una URL http/https accesible públicamente (las direcciones de red interna están bloqueadas).