API y webhooks de Vuelvo (v1)
API pública para integrar tu programa de fidelidad con tu POS, tu tienda en línea o herramientas como n8n, Make o Zapier. Cada negocio crea sus llaves en Panel → API y webhooks.
Especificación OpenAPI: /api/v1/openapi.json · URL base: https://vuelvo.co/api/v1
Autenticación
Cada solicitud lleva la llave del negocio. La llave se crea en el panel y se muestra una sola vez; guárdala como un secreto.
curl https://vuelvo.co/api/v1/customers -H "Authorization: Bearer vk_live_XXXXXXXX_..."Límite: 120 solicitudes por minuto por llave. Los movimientos que crea la API quedan a nombre de “API · nombre de la llave” y en la sede elegida, con los mismos límites anti-fraude del escáner.
Endpoints
GET /customers — Listar clientes
limit(query)cursor(query): next_cursor de la página anteriorphone(query): Buscar por celular
POST /customers — Crear cliente (con su autorización de datos)
Tu formulario debe mostrar el texto de autorización del negocio (Ley 1581) y enviar aquí la evidencia. Sin consent.accepted = true no se crea la tarjeta. Si el celular ya existe responde 409 con el cliente.
GET /customers/{id} — Un cliente
id(path)
GET /transactions — Listar movimientos (del más antiguo al más nuevo)
since(query)limit(query)cursor(query)
POST /transactions — Registrar una visita o un canje
visit suma un sello, usa una sesión del bono o registra la visita de la membresía, según el programa del negocio. Aplican los mismos límites anti-fraude que en el escáner.
Ejemplo: registrar una visita desde tu POS
curl -X POST https://vuelvo.co/api/v1/transactions \
-H "Authorization: Bearer vk_live_..." -H "Content-Type: application/json" \
-d '{"phone": "300 123 4567", "type": "visit"}'Ejemplo: crear un cliente con su autorización
curl -X POST https://vuelvo.co/api/v1/customers \
-H "Authorization: Bearer vk_live_..." -H "Content-Type: application/json" \
-d '{"name": "Ana Gómez", "phone": "300 123 4567", "birthday": "03-15",
"consent": {"accepted": true, "ip": "190.1.2.3", "user_agent": "Mi tienda"}}'Tu formulario debe mostrar el texto de autorización de datos del negocio y no crear el cliente si la persona no la acepta. Vuelvo guarda la evidencia con canal “api”.
Webhooks
Crea un destino en el panel (URL https) y elige los eventos. Cada evento llega en menos de un minuto como POST JSON:
{ "id": "entrega_…", "event": "transaction.created", "created_at": "2026-09-25T15:00:00.000Z", "data": { … } }card.created: Un cliente recibió su tarjeta (se inscribió o aceptó la invitación). Trae el cliente y el canal de la autorización.transaction.created: Cualquier movimiento del libro: sello, canje, sesión, anulación, ajuste…reward.redeemed: Se entregó un premio (principal o intermedio).customer.deleted: El titular pidió eliminar sus datos: bórralos también en tu sistema.
Responde con un código 2xx. Si no, se reintenta a 1 min, 5 min, 30 min, 2 h, 6 h y 24 h. Usa id para no procesar dos veces la misma entrega.
Verificar la firma
Cada entrega trae X-Vuelvo-Signature: t=<unix>,v1=<hmac>, donde hmac = HMAC-SHA256(secreto, t + "." + cuerpo). Rechaza firmas de más de 5 minutos.
import crypto from 'node:crypto'
function valida(secreto, cuerpo, encabezado) {
const { t, v1 } = Object.fromEntries(encabezado.split(',').map(p => p.split('=')))
if (Math.abs(Date.now() / 1000 - Number(t)) > 300) return false
const esperado = crypto.createHmac('sha256', secreto).update(t + '.' + cuerpo).digest('hex')
return crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(esperado))
}n8n, Make y Zapier
Usa el nodo “Webhook” (n8n), “Custom webhook” (Make) o “Webhooks by Zapier” para recibir los eventos, y el nodo HTTP con tu llave para llamar a la API. Aún no hay una app oficial en esas plataformas.
Datos personales
Los eventos de clientes incluyen nombre, celular y correo: tu negocio es el responsable del tratamiento y debe usar esos datos solo para las finalidades que el titular autorizó. Cuando llegue customer.deleted, elimina los datos también en tu sistema.