Webhooks
PagoFast envía eventos normalizados a la URL configurada por el integrador. La entrega es asíncrona: puede ocurrir después de la respuesta REST y no reemplaza la consulta del recurso para reconciliación.
Configuración del destino
Cuando POST /v1/payments admite webhook_url, esa URL recibe los eventos del pago. Si el ambiente ofrece endpoints de webhook a nivel cuenta, su configuración se administra por separado. No asumas que ambos mecanismos existen: confirmalo en el OpenAPI desplegado.
Usá HTTPS, evitá redirects y no incluyas secretos en la query string. El endpoint debe aceptar el body JSON crudo y los headers de firma.
Eventos
payment.pending
payment.approved
payment.declined
payment.failed
payment.expired
payment.canceled
payment.refundedLos clientes deben aceptar tipos nuevos sin fallar todo el endpoint. Registrá de manera segura un tipo desconocido y respondé según la política acordada, sin aplicar un cambio de negocio que no comprendés.
Payload
{
"id": "evt_019f7067f8b47b4e",
"type": "payment.approved",
"created_at": "2026-07-17T13:15:08.500Z",
"data": {
"payment": {
"id": "019f7061-2010-7698-8827-e32f86e14298",
"status": "approved",
"amount": {
"value": "12500.00",
"currency": "ARS"
},
"external_reference": "order-9821",
"payment_method": "019f704f-89d7-7e83-b3e1-f07c33801024",
"processor_reference": "trx_739204",
"updated_at": "2026-07-17T13:15:08.441Z"
}
}
}id identifica el evento y se mantiene en reintentos o replay. created_at es la creación del evento; payment.updated_at indica la versión temporal del recurso.
Headers
Cada delivery incluye como mínimo los headers usados para identificación y firma:
OrderFast-Event-Id: evt_019f7067f8b47b4e
OrderFast-Timestamp: 1784294108
OrderFast-Signature: v1=0c240b7f...El nombre histórico de los headers es parte del contrato y puede diferir del nombre comercial PagoFast. Verificá siempre la firma antes de procesar el payload.
Handler recomendado
- Leer el body crudo sin modificarlo.
- Validar timestamp y firma.
- Parsear JSON y verificar su estructura.
- Iniciar una transacción local.
- Insertar
event.idcon una restricción única. - Si ya existe, responder
2xxsin repetir efectos. - Aplicar una transición válida usando
payment.updated_at. - Persistir y confirmar.
- Responder
2xxrápidamente. - Ejecutar trabajo lento de forma asíncrona en tu sistema.
Ejemplo conceptual:
if !valid_signature(raw_body, headers): return 401
event = parse(raw_body)
if events.exists(event.id): return 204
save_event_and_apply_valid_transition(event)
return 204Duplicados y orden
La entrega es al menos una vez: el mismo evento puede llegar varias veces. Eventos distintos pueden llegar fuera de orden. No deduzcas el estado solo por type; compará la versión del recurso y evitá retroceder desde un estado final.
Si no podés decidir una transición con seguridad, conservá el evento y consultá GET /v1/payments/{payment_id}.
Respuestas
Cualquier status 2xx confirma recepción y detiene los reintentos de esa entrega. Respondé 4xx para requests inválidos y 5xx cuando una falla temporal impida persistirlos, teniendo en cuenta la política de reintentos.
No devuelvas información sensible ni detalles internos en el body de respuesta.