bank
{
"title": "Cuenta principal",
"type": "bank",
"payload": {
"beneficiary": "Ana Martínez",
"bank": "BBVA",
"clabe": "032180000118359719",
"account": "0123456789"
}
}Crea, consulta y administra recursos QR desde tu servidor. Cada creación entrega una URL pública estable, PNG y SVG; las ediciones y descargas no consumen cuota.
https://qrfolio.link/api/v1Todas las solicitudes usan una API key mediante Bearer Authentication. Crea llaves independientes por aplicación desde tu panel.
Abre /app/api, asigna un nombre y selecciona los permisos necesarios.
Copia el secreto qrf_live_…. Solo se muestra una vez.
Guárdalo en un administrador de secretos y envíalo en cada solicitud.
curl 'https://qrfolio.link/api/v1/qrs' \
+ -H 'Authorization: Bearer qrf_live_TU_LLAVE'qrs:readListar, consultar y descargar PNG/SVG.
qrs:writeCrear, editar, activar y desactivar recursos.
La cuota API es independiente de los créditos web. Solo crear un QR consume una unidad.
Crear consume cuota; leer, editar, activar y descargar no. Los planes ilimitados siguen registrando uso.
Todas las operaciones cuentan para el límite por minuto, calculado individualmente por API key.
Cada POST requiere una Idempotency-Key. Repetirla con el mismo payload devuelve el recurso original.
Cancelar el acceso bloquea operaciones API, pero no elimina los enlaces públicos ya creados.
Un administrador puede asignarte un plan Stripe no publicado. Solo aparecerá en tu panel y no habilitará acceso hasta que completes Checkout.
El campo payload depende de type. No se admiten propiedades adicionales. Las URLs deben ser públicas y usar HTTP o HTTPS.
{
"title": "Cuenta principal",
"type": "bank",
"payload": {
"beneficiary": "Ana Martínez",
"bank": "BBVA",
"clabe": "032180000118359719",
"account": "0123456789"
}
}{
"title": "Catálogo",
"type": "redirect",
"payload": {
"url": "https://example.com/catalogo"
}
}{
"title": "Horarios",
"type": "content",
"payload": {
"text": "Lunes a viernes de 9:00 a 18:00"
}
}{
"title": "Soporte",
"type": "whatsapp",
"payload": {
"phone": "+525512345678",
"message": "Hola, necesito información"
}
}{
"title": "Contacto comercial",
"type": "vcard",
"payload": {
"fullName": "Ana Martínez",
"jobTitle": "Directora comercial",
"company": "Empresa Demo",
"phones": [
"+525512345678"
],
"email": "[email protected]",
"website": "https://example.com"
}
}{
"title": "Mis enlaces",
"type": "links",
"payload": {
"links": [
{
"label": "Sitio oficial",
"url": "https://example.com"
},
{
"label": "Instagram",
"url": "https://instagram.com/example"
}
]
}
}/qrs?page=1&pageSize=20qrs:readLista exclusivamente QR creados por la API. pageSize admite de 1 a 100.
curl 'https://qrfolio.link/api/v1/qrs?page=1&pageSize=20' \
+ -H 'Authorization: Bearer qrf_live_TU_LLAVE'{
"items": [{ "id": "8a70…", "title": "Catálogo", "type": "redirect", "version": 1,
"active": true, "url": "https://qrfolio.link/q/…", "image_png_url": "https://qrfolio.link/api/v1/qrs/8a70…/image.png" }],
"total": 1, "page": 1, "pageSize": 20, "pages": 1
}/qrsqrs:writeEnvía un tipo habilitado y su payload. La respuesta incluye consumo de cuota, URL pública y descargas.
curl -X POST 'https://qrfolio.link/api/v1/qrs' \
+ -H 'Authorization: Bearer qrf_live_TU_LLAVE' \
+ -H 'Idempotency-Key: pedido-8472' \
+ -H 'Content-Type: application/json' \
+ -d '{"title":"Catálogo","type":"redirect","payload":{"url":"https://example.com/catalogo"}}'{
"id": "8a70a917-…", "slug": "c12f…", "type": "redirect", "title": "Catálogo",
"payload": { "url": "https://example.com/catalogo" }, "version": 1, "active": true,
"url": "https://qrfolio.link/q/c12f…",
"image_png_url": "https://qrfolio.link/api/v1/qrs/8a70a917-…/image.png",
"image_svg_url": "https://qrfolio.link/api/v1/qrs/8a70a917-…/image.svg",
"quota": { "quota": 1000, "used": 24, "periodEnd": "2026-11-01T00:00:00.000Z", "unlimited": false }
}/qrs/{id}qrs:readObtén el payload normalizado, estado actual, versión y URLs del recurso.
curl 'https://qrfolio.link/api/v1/qrs/ID_DEL_QR' \
+ -H 'Authorization: Bearer qrf_live_TU_LLAVE'/qrs/{id}qrs:writeConserva el tipo original y envía la versión más reciente. Una edición exitosa incrementa version; no consume cuota.
curl -X PATCH 'https://qrfolio.link/api/v1/qrs/ID_DEL_QR' \
+ -H 'Authorization: Bearer qrf_live_TU_LLAVE' \
+ -H 'Content-Type: application/json' \
+ -d '{"title":"Catálogo actualizado","payload":{"url":"https://example.com/nuevo"},"version":1}'409. Consulta el recurso otra vez y reintenta con su nueva versión./qrs/{id}/activeqrs:writeUn recurso desactivado conserva sus datos, pero su URL pública deja de resolver hasta reactivarlo.
curl -X PATCH 'https://qrfolio.link/api/v1/qrs/ID_DEL_QR/active' \
+ -H 'Authorization: Bearer qrf_live_TU_LLAVE' \
+ -H 'Content-Type: application/json' \
+ -d '{"active":false}'Las descargas requieren qrs:read, cuentan para el rate limit y no consumen cuota.
/qrs/{id}/image.pngqrs:readcurl 'https://qrfolio.link/api/v1/qrs/ID_DEL_QR/image.png' \
+ -H 'Authorization: Bearer qrf_live_TU_LLAVE' \
+ --output qr.png/qrs/{id}/image.svgqrs:readcurl 'https://qrfolio.link/api/v1/qrs/ID_DEL_QR/image.svg' \
+ -H 'Authorization: Bearer qrf_live_TU_LLAVE' \
+ --output qr.svgLos errores usan respuestas JSON de NestJS con un código HTTP y un mensaje legible.
Campos, payload, URL o Idempotency-Key inválidos.
Llave ausente, inválida, expirada o revocada.
Scope insuficiente, cuenta bloqueada o acceso API inactivo.
El recurso no existe o pertenece a otra cuenta.
Versión obsoleta o clave de idempotencia reutilizada con otros datos.
Cuota de creación agotada o demasiadas solicitudes por minuto.
{
"statusCode": 409,
"message": "El QR cambió. Consulta la versión actual antes de editarlo",
"error": "Conflict"
}