Enqre

API de códigos QR

Crea códigos desde tu propio backend, lee sus escaneos y recibe un webhook en el momento en que alguien escanea. Esta página no requiere cuenta.

La API forma parte del plan Business. Las claves se crean en el panel, en «API y webhooks», y se muestran una sola vez: una clave perdida se revoca y se sustituye, nunca se recupera.

URL base

https://enqre.com/api/v1

Autenticación

Cada petición lleva la clave como token bearer. Sin clave válida: 401. Con clave válida en un plan sin API: 403.

curl https://enqre.com/api/v1/qrcodes \
  -H "Authorization: Bearer $ENQRE_API_KEY"

Endpoints

GET/api/v1/qrcodes?limit=50&cursor=<id>

Lista tus códigos, del más reciente al más antiguo. Paginación por cursor: envía el nextCursor recibido para la página siguiente.

{
  "data": [
    {
      "id": "clx…", "name": "Table tent", "type": "URL",
      "slug": "a1b2c3", "destinationUrl": "https://example.com/menu",
      "scanCount": 128, "active": true, "createdAt": "2026-09-01T10:00:00.000Z",
      "shortUrl": "https://enqre.com/r/a1b2c3"
    }
  ],
  "nextCursor": "clx…"
}

POST/api/v1/qrcodes

Crea un código URL dinámico. La respuesta incluye la URL corta que vas a imprimir.

{ "name": "Table tent", "url": "https://example.com/menu" }
201 Created
{
  "data": {
    "id": "clx…", "name": "Table tent", "slug": "a1b2c3",
    "destinationUrl": "https://example.com/menu",
    "shortUrl": "https://enqre.com/r/a1b2c3"
  }
}

GET/api/v1/qrcodes/{id}

Lee un código.

PATCH/api/v1/qrcodes/{id}

Modifica un código, incluido su destino. Para eso existe un código dinámico: la copia impresa sigue funcionando y apunta a otro sitio.

{ "url": "https://example.com/autumn-menu", "name": "Autumn menu", "active": true }

DELETE/api/v1/qrcodes/{id}

Elimina un código. Las copias impresas dejan de resolver, así que no es la forma de pausar una campaña: pon active en false.

GET/api/v1/qrcodes/{id}/scans

Los últimos 1.000 escaneos de un código, del más reciente al más antiguo, más el total histórico.

{
  "total": 128,
  "data": [
    { "createdAt": "2026-09-06T18:12:03.000Z", "device": "mobile", "os": "iOS", "browser": "Safari" }
  ]
}

Errores

Los errores son JSON con un código estable legible por máquina. Ramifica por el código, no por el mensaje: los mensajes pueden reescribirse, los códigos no.

401invalid_api_keyNo key, a revoked key, or one that does not exist.
403api_not_available_on_planThe key is valid; the account is not on Business.
400invalid_bodyThe JSON body failed validation.
402plan_limit_reachedThe account is at its dynamic-code limit.
404not_foundNo code with that id on this account.
429rate_limitedMore than 60 writes in a minute.

Límite de peticiones

60 escrituras por minuto y cuenta; por encima, 429. Las lecturas hoy no están limitadas, y eso no es una promesa sobre la que construir.

Webhooks

Registra una URL en «API y webhooks» y cada escaneo se envía allí al instante: tu sistema se entera sin consultar nada.

POST your-endpoint
X-Enqre-Event: scan.created
X-Enqre-Signature: <hex hmac-sha256 of the raw body>
Content-Type: application/json

{
  "event": "scan.created",
  "qrCodeId": "clx…",
  "slug": "a1b2c3",
  "name": "Table tent",
  "device": "mobile",
  "os": "iOS",
  "browser": "Safari"
}

Verifica la firma

Calcula el HMAC-SHA256 del cuerpo bruto de la petición con tu secreto de webhook y compáralo con la cabecera. Rechaza lo que no coincida, y compara en tiempo constante.

import crypto from "node:crypto";

const raw = await req.text(); // the raw body, before JSON.parse
const expected = crypto
  .createHmac("sha256", process.env.ENQRE_WEBHOOK_SECRET)
  .update(raw)
  .digest("hex");

const given = req.headers.get("x-enqre-signature") ?? "";
const ok =
  given.length === expected.length &&
  crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected));

Colección de Postman

Todos los endpoints de esta página, listos para ejecutar: importa la colección, define la variable apiKey y envía.

Descargar la colección

Lo que la API todavía no hace

Los códigos creados por la API son códigos URL con el diseño por defecto. Los otros dieciséis tipos, los campos de diseño y la importación masiva siguen siendo cosa del panel. Lo que la API crea es un código normal y corriente: editable, medible e imprimible como cualquier otro.

Consigue una clave

API, webhooks, GS1 Digital Link, marca blanca y dominio propio están en Business, 39 € al mes.

Ver los planes