Descripción general de los webhooks
Recibe eventos de pago normalizados y firmados de Tokeflow en tiempo real: configura endpoints, comprende el envoltorio de eventos y gestiona la entrega y los reintentos.
Los webhooks permiten que tu plataforma reaccione a la actividad de pagos en el momento en que ocurre. A medida que las transacciones, reembolsos, disputas y suscripciones cambian de estado en los proveedores conectados, Tokeflow envía por POST un evento JSON normalizado al endpoint (o endpoints) HTTPS que configures.
En lugar de consultar la API mediante polling, te suscribes una sola vez y dejas que los eventos lleguen a ti. Como Tokeflow normaliza los webhooks de todos los proveedores que orquestas, escribes un único handler —no uno por proveedor— y la forma del evento se mantiene igual sin importar qué adquirente procesó el cargo.
Tokeflow es infraestructura de orquestación de pagos. Los webhooks describen el ciclo de vida de las operaciones que Tokeflow coordina; el procesamiento y la liquidación subyacentes los realizan tus proveedores de pago conectados.
Por qué usar webhooks
| Resultado | Cómo ayudan los webhooks |
|---|---|
| Reacciona en tiempo real | Cumple pedidos, otorga acceso o notifica a los clientes en el instante en que se autoriza un pago, sin bucle de polling. |
| Un handler, todos los proveedores | Los eventos se normalizan a un único esquema, de modo que las cargas útiles específicas de cada proveedor nunca se filtran a tu código. |
| Entrega confiable | Las entregas fallidas se reintentan con backoff exponencial y se registran, así que una breve interrupción de tu lado no descarta eventos. |
| Autenticidad verificable | Cada solicitud se firma con HMAC-SHA256 para que puedas confirmar que proviene de Tokeflow y no fue alterada en tránsito. |
| Registro de auditoría | Cada intento de entrega se persiste y puede inspeccionarse, lo que te brinda trazabilidad para la conciliación y la depuración. |
Cómo funciona la entrega
- Ocurre un evento. Una transacción, reembolso, disputa, método de pago o suscripción cambia de estado.
- Tokeflow construye un evento normalizado y lo firma con el secreto de firma de tu endpoint.
- Tokeflow envía por POST el evento a cada endpoint coincidente como cuerpo de una solicitud JSON.
- Tu endpoint responde. Un estado
2xx(devuelto rápidamente) marca la entrega como exitosa. Cualquier otra cosa desencadena un reintento.
Configura tus endpoints
Registras los endpoints de webhook en el Dashboard de Tokeflow durante el onboarding (y en cualquier momento posterior). Para cada endpoint proporcionas:
| Configuración | Descripción |
|---|---|
| URL del endpoint | Una URL HTTPS accesible públicamente que acepta solicitudes POST. Puedes registrar más de una. |
| Filtro de eventos | Una lista de permitidos opcional de tipos de evento. Omítela para recibir todos los tipos de evento. |
| Secreto de firma | Se genera cuando se crea el endpoint: un valor con el prefijo whsec_. Úsalo para verificar firmas. |
Registra endpoints separados para preocupaciones separadas; por ejemplo, una URL para los eventos transaction.* que alimente el cumplimiento y otra para los eventos subscription.* que alimente tu sistema de facturación. Cada endpoint lleva su propio filtro y su propio secreto de firma.
El secreto de firma se muestra cuando se crea el endpoint. Guárdalo de forma segura (solo del lado del servidor): lo necesitarás para verificar cada evento entrante. Trátalo como cualquier otra credencial.
El envoltorio de eventos
El cuerpo de toda solicitud de webhook comparte la misma forma de nivel superior. El campo data.object lleva el recurso sobre el que trata el evento (una transacción, reembolso, suscripción, etc.).
{
"id": "evt_8f3c2a1b9d7e4f60",
"type": "transaction.authorized",
"created_at": "2026-01-15T12:30:00.000Z",
"data": {
"object": {
"id": "tx_3n8Q2k1p7w",
"merchant_id": "mrc_7Yh2Kd9",
"external_order_id": "order-2026-0042",
"customer": {
"id": "cust_5Tg8Lp2",
"email": "buyer@example.com"
},
"previous_status": "pre_authorized",
"current_status": "authorized",
"amount_authorized": 15000,
"amount_captured": 15000,
"currency": "BRL",
"changed_at": "2026-01-15T12:30:00.000Z"
}
}
}| Field | Type | Descripción |
|---|---|---|
id | string | Identificador único del evento (prefijo evt_). Úsalo para deduplicar. |
type | string | El tipo de evento, p. ej. transaction.authorized. |
created_at | string | Marca de tiempo ISO 8601 UTC de cuándo se generó el evento. |
data.object | object | La instantánea del recurso para este evento. Sus campos dependen de type. |
Los importes monetarios son enteros en unidades menores (centavos). 15000 con currency: "BRL" significa R$150.00. Empareja siempre un importe con su currency ISO 4217.
Qué contiene data.object
La forma de data.object depende de la familia del evento. Consulta Tipos de evento para ver el catálogo completo y los campos por recurso.
| Familia de eventos | data.object representa | Tipos de ejemplo |
|---|---|---|
| Transacciones | Una transacción de pago | transaction.authorized, transaction.failed, transaction.voided |
| Reembolsos | Un reembolso | transaction.refunded, transaction.partially_refunded, transaction.refund_failed |
| Disputas | Un chargeback / disputa | transaction.dispute_created, transaction.dispute_won, transaction.dispute_lost |
| Métodos de pago | Un instrumento de pago almacenado | payment_method.action_required |
| Suscripciones | Una suscripción | subscription.created, subscription.dunning, subscription.cancelled |
Encabezados de la solicitud
Cada entrega es un POST HTTP con un cuerpo JSON y estos encabezados destacados:
| Header | Descripción |
|---|---|
Content-Type | Siempre application/json. |
X-Tokeflow-Signature | Firma HMAC del evento, con la forma t=<unix-seconds>,v1=<hex>. |
User-Agent | Identifica la solicitud como originada por el sistema de entrega de webhooks de Tokeflow. |
Verifica siempre X-Tokeflow-Signature antes de confiar en un evento. La firma se calcula sobre los bytes crudos del cuerpo de la solicitud: lee y verifica el cuerpo antes de que cualquier análisis de JSON o middleware lo vuelva a serializar. Consulta Verificar firmas.
Responder a los eventos
Tu endpoint debe acusar recibo rápidamente y hacer el trabajo real después.
- Responde
2xxen pocos segundos. Devuelve la respuesta tan pronto como hayas persistido el evento de forma segura (por ejemplo, encolándolo). Tokeflow trata cualquier2xxcomo éxito. - Procesa de forma asíncrona. Realiza el trabajo lento —cumplimiento, correos, llamadas descendentes— fuera del ciclo de solicitud/respuesta para no arriesgar nunca un timeout.
- Deduplica por
id. Los reintentos y la entrega al menos una vez implican que el mismoidde evento puede llegar más de una vez. Haz que el manejo sea idempotente: registra los IDs de eventos procesados y omite los duplicados. - No dependas del orden. Los eventos pueden llegar desordenados, especialmente después de un reintento. Usa los campos de estado del recurso (y
changed_at) en lugar de asumir que el orden de llegada refleja la secuencia real.
// Express example — acknowledge fast, process async.
// Use a raw body parser on this route so signature verification sees exact bytes.
import express from "express";
const app = express();
app.post(
"/webhooks/tokeflow",
express.raw({ type: "application/json" }),
(req, res) => {
// 1. Verify the signature against the raw body (see Verifying signatures).
if (!verifyTokeflowSignature(req)) {
return res.status(400).send("invalid signature");
}
const event = JSON.parse(req.body.toString("utf8"));
// 2. Deduplicate and enqueue for async processing.
enqueueForProcessing(event); // your job queue
// 3. Acknowledge immediately.
return res.status(200).send("ok");
},
);Entrega, fallos y reintentos
Tokeflow registra cada intento de entrega para cada endpoint, de modo que puedas auditar exactamente qué se envió y cómo respondió tu endpoint.
Una entrega se considera exitosa solo cuando tu endpoint devuelve un HTTP 2xx. Una entrega falla cuando devuelve un estado distinto de 2xx, agota el tiempo de espera o es inalcanzable. Cada solicitud tiene un timeout de entrega de 30 segundos: mantén los handlers muy por debajo de ese límite.
Cuando una entrega falla, Tokeflow reintenta con backoff exponencial:
| Intento | Retraso tras el intento anterior |
|---|---|
| 1 | Inmediato (entrega inicial) |
| 2 | 1 minuto |
| 3 | 5 minutos |
| 4 | 30 minutos |
| 5 | 2 horas |
| (final) | 24 horas |
Una vez agotado el calendario de reintentos, la entrega se abandona y no se realizan más intentos. Se conserva el historial completo de entrega —códigos de estado, fragmentos de respuesta, recuentos de intentos y próxima hora de reintento— para su inspección. En total, un endpoint que falla en todos los intentos se reintenta a lo largo de aproximadamente 26 horas antes de que la entrega se abandone. Cada registro de entrega se marca en el momento en que se resolvió —en caso de éxito o de abandono— y conserva el código de estado HTTP final y el fragmento de respuesta, de modo que el registro siempre refleja cuándo concluyó realmente la entrega, y no cuándo comenzó.
Como una única interrupción del endpoint puede producir una ráfaga de reintentos una vez que te recuperas, diseña tu consumidor para absorber los picos: devuelve 2xx rápidamente, encola y procesa desde la cola. La idempotencia sobre el id del evento evita que los eventos reintentados se apliquen dos veces.
Un endpoint que falla de forma persistente se reintentará hasta el límite indicado arriba y luego se abandonará para ese evento. Si tu endpoint está caído durante un período prolongado, podrías perder eventos; concilia contra la API una vez que te recuperes y mantén tu handler idempotente para que las repeticiones sean seguras.
Lista de verificación de seguridad
- Verifica cada firma. Rechaza las solicitudes cuya
X-Tokeflow-Signatureno valide contra el cuerpo crudo y tu secretowhsec_. - Aplica una tolerancia de marca de tiempo. Rechaza los eventos cuya marca de tiempo de la firma esté fuera de una ventana pequeña (por ejemplo, 5 minutos) para mitigar los ataques de repetición.
- Usa solo HTTPS. Los endpoints deben ser HTTPS para que las cargas útiles y las firmas estén protegidas en tránsito.
- Mantén los secretos del lado del servidor. El secreto de firma del webhook, al igual que tus claves de API
sk_*, nunca debe aparecer en el navegador ni en el código del cliente.
Próximos pasos
- Tipos de evento — el catálogo completo de tipos de evento y el recurso que lleva
data.object. - Verificar firmas — valida
X-Tokeflow-Signaturepaso a paso. - Autenticación — cómo funcionan las claves de API, los scopes y los entornos.