Para desarrolladores

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.

Enlace corto
REST API
Código QR
REST API
Email Counter
REST API
Countdown
REST API
Quik Bio
REST API
Menú QR
REST API
Firmas de correo
REST API
UTM builder
Herramientas gratuitas

URL base

Todos los endpoints parten de la siguiente URL base:

https://quik.mn/api/v1

Autenticación

En cada solicitud, incluye la clave de API de tu panel en la cabecera Authorization de la siguiente forma:

Authorization: Bearer qk_live_...

No compartas tu clave con nadie. Si se filtra, vuelve a generarla desde el panel.

Lista de endpoints

Enlace corto
POST /api/v1/links Crear un enlace corto nuevo
GET /api/v1/links Obtener la lista de enlaces
GET /api/v1/links/{id} Datos de un enlace
PATCH /api/v1/links/{id} Editar un enlace
DELETE /api/v1/links/{id} Eliminar un enlace
POST /api/v1/links/{id}/extend Ampliar la caducidad — body: {"days": 365}
Código QR
GET /api/v1/links/{id}/qr Obtener un código QR — ?format=png|svg&size=300&fg=241210&bg=FFFFFF
Email Counter
POST /api/v1/timers Crear un Email Counter — respuesta: gif_url + embed_html
GET /api/v1/timers Lista de contadores
GET /api/v1/timers/{id} Detalles del contador
PATCH /api/v1/timers/{id} Editar contador
DELETE /api/v1/timers/{id} Eliminar contador
Página de cuenta atrás
POST /api/v1/countdowns Crear una página Countdown — respuesta: page_url
GET /api/v1/countdowns Lista de páginas
GET /api/v1/countdowns/{id} Detalles de la página
PATCH /api/v1/countdowns/{id} Editar página
DELETE /api/v1/countdowns/{id} Eliminar página
Quik Bio
POST /api/v1/bio-pages Crear una página Bio — respuesta: page_url (el avatar solo se sube desde la web)
GET /api/v1/bio-pages Lista de tus páginas Bio
GET /api/v1/bio-pages/{id} Obtener una página Bio — con sus enlaces
PATCH /api/v1/bio-pages/{id} Actualizar una página Bio
DELETE /api/v1/bio-pages/{id} Eliminar una página Bio
GET /api/v1/bio-pages/{id}/stats Estadísticas de Bio — visitas y clics
GET /api/v1/bio-pages/{id}/links Lista de enlaces de una página Bio
POST /api/v1/bio-pages/{id}/links Añadir un enlace Bio
PATCH /api/v1/bio-pages/{id}/links/{lid} Actualizar un enlace Bio
DELETE /api/v1/bio-pages/{id}/links/{lid} Eliminar un enlace Bio
Menú QR
POST /api/v1/menus Crear un menú — respuesta: page_url
GET /api/v1/menus Lista de tus menús
GET /api/v1/menus/{id} Obtener un menú — con sus platos
PATCH /api/v1/menus/{id} Actualizar un menú
DELETE /api/v1/menus/{id} Eliminar un menú
GET /api/v1/menus/{id}/stats Estadísticas de escaneos — total, 30 días, por mesa
GET /api/v1/menus/{id}/items Lista de platos
POST /api/v1/menus/{id}/items Añadir un plato — la foto solo se sube desde la web
PATCH /api/v1/menus/{id}/items/{iid} Actualizar un plato
DELETE /api/v1/menus/{id}/items/{iid} Eliminar un plato
Firmas de correo
POST /api/v1/signatures Crear una firma — el logo solo se acepta como URL
GET /api/v1/signatures Lista de tus firmas
GET /api/v1/signatures/{id} Obtener una firma — incluye signature_html
PATCH /api/v1/signatures/{id} Actualizar una firma
DELETE /api/v1/signatures/{id} Eliminar una firma
Cuenta
GET /api/v1/me Información de la cuenta actual

Parámetros

POST /api/v1/links — campos del body:

url required URL de destino (http/https).
alias optional Nombre corto personalizado (letras, números, - y _; 1–64 caracteres). También se acepta si lo envías como «slug».
title optional Título (hasta 200 caracteres).
expires_at optional Fecha de caducidad: una fecha futura (p. ej. 2026-12-31 23:59:59). Máximo 1 año; si se omite, 1 año. Enviar null en PATCH la restablece a 1 año.
expire_days optional O en días: 1/7/30/90/180/365. Más sencillo que expires_at.
starts_at optional Hora de activación: fecha y hora UTC (p. ej. 2026-08-01 02:00:00). Hasta ese momento los visitantes ven un countdown; debe ser anterior a expires_at. Envía null en PATCH para activarlo de inmediato.
on_duplicate optional Cuando ya existe un enlace activo a la misma URL: "reuse" (por defecto: devuelve el enlace existente con el campo reused:true) o "create" (crea uno nuevo). Si indicas un alias, siempre se crea uno nuevo.

GET /api/v1/links — parámetros de query:

limit Número de elementos por página (1–100, valor por defecto 25).
offset Número de filas que se omiten (paginación).
q Búsqueda: busca en el slug, el título y la URL de destino.

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

60 solicitudes por minuto por clave de API
Si lo superas, se devuelve un 429 rate_limited como respuesta: espera un momento y vuelve a intentarlo.

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.

link.created Se dispara al crear un enlace corto nuevo (web + API)
link.deleted Se dispara al eliminar un enlace
link.expired Se dispara cuando un enlace caduca o alcanza su límite de clics (revisión diaria)
link.clicks.milestone Se dispara cuando los clics superan el umbral de 100 / 1.000 / 10.000: el payload incluye el campo milestone
timer.expired Se dispara cuando termina un contador de email
countdown.expired Se dispara cuando termina una página countdown
webhook.ping Evento de prueba enviado con el botón «Probar»

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-Signaturesha256=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).

Consigue tu clave de API
Crea una clave en la sección API del panel y empieza ahora mismo.
Obtener clave de API