Documentación de la API REST

API REST para clientes con plan pago vigente: crear, editar, listar y descargar QR dinámicos y consultar sus escaneos desde kioscos, supermercados y cajas. Los QR creados por API llevan el logo y los colores del diseño por defecto de tu cuenta. Límite: 60 pedidos por minuto por clave.

Autenticación

Generá tu clave en Mi cuenta (plan pago vigente). Se muestra una sola vez; se puede regenerar o revocar. Enviala en el encabezado Authorization: Bearer. Todas las respuestas son JSON, salvo las imágenes.

Authorization: Bearer q4u_<40 hex>
Base URL: https://qr4u.cloud/api/v1

Endpoints

EndpointDescripción
POST /api/v1/qrsCrea un QR dinámico con el diseño por defecto de la cuenta. Cuerpo JSON: {"url": "https://..."}. Responde 201 con el QR.
GET /api/v1/qrsLista tus QR (más nuevos primero). Parámetros: limit (1-100, por defecto 50) y offset.
GET /api/v1/qrs/{code}Devuelve un QR: code, url (enlace corto), destination, status, scans, last_scan, created_at.
PATCH /api/v1/qrs/{code}Cambia el destino. Cuerpo JSON: {"url": "https://..."}. El QR impreso sigue igual.
GET /api/v1/qrs/{code}/statsEscaneos totales y fecha del último escaneo.
GET /api/v1/qrs/{code}.pngImagen PNG del QR con su diseño (ECC H).
GET /api/v1/qrs/{code}.svgImagen SVG del QR con su diseño, logo incrustado.

Ejemplo

curl -X POST https://qr4u.cloud/api/v1/qrs \
  -H "Authorization: Bearer $QR4U_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://example.com/menu"}'

HTTP/1.1 201 Created
{
  "code": "k3m9pqx",
  "url": "https://qr4u.cloud/k3m9pqx",
  "destination": "https://example.com/menu",
  "status": "active",
  "scans": 0,
  "last_scan": null,
  "created_at": "2026-10-18T12:00:00Z",
  "kind": "qr",
  "mode": "dynamic",
  "has_design": true,
  "png": "https://qr4u.cloud/api/v1/qrs/k3m9pqx.png",
  "svg": "https://qr4u.cloud/api/v1/qrs/k3m9pqx.svg"
}

Límites

60 pedidos por minuto por clave (ventana deslizante). Al excederlo responde 429 con el encabezado Retry-After (segundos).

Errores

Los errores devuelven JSON con el mismo formato y el código HTTP correspondiente:

{"error": {"code": "invalid_url", "message": "Field \"url\" must be a valid http or https URL."}}
CódigoDescripción
400 invalid_json / invalid_urlCuerpo no válido o URL que no es http/https.
401 unauthorizedFalta la clave o es inválida.
402 plan_requiredEl plan pago venció.
404 not_foundEl QR no existe o no es tuyo.
405 method_not_allowedMétodo no permitido (ver encabezado Allow).
422 unsafe_url / design_unreadableDestino marcado como peligroso por Safe Browsing, o el diseño por defecto no genera un QR legible.
429 rate_limitedMás de 60 pedidos por minuto.

Los QR creados por API usan el diseño por defecto de la cuenta, que se define en el panel. Si el diseño no produce un QR legible, la creación se rechaza.