Los webhooks te notifican los eventos de tu cuenta en un callback HTTPS
propio, firmados criptográficamente.
Crear una suscripción
event_type: uno de los eventos de la tabla siguiente, o * para todos.
callback_url: HTTPS obligatorio; se rechazan localhost e IPs
privadas — para desarrollo local usa un
túnel HTTPS.
secret: mínimo 16 caracteres; se usa para firmar cada entrega. Se
almacena cifrado y no puede recuperarse.
La suscripción recibe los eventos de tu cuenta. Puedes listar las
suscripciones activas en cualquier momento:
Eventos
Payload de cada evento
En payout_status_changed y crypto_withdrawal_status_changed, status
puede ser completed o failed (con failed el débito ya fue
reembolsado cuando recibes el evento).
Cada entrega es un POST JSON con estos headers:
Verificar la firma
Calcula el HMAC sobre el body crudo (bytes tal como llegan), no sobre el
JSON re-serializado. Rechaza timestamps muy antiguos (> 5 minutos) para
prevenir replay.
Reintentos e idempotencia
- Tu endpoint debe responder 2xx dentro del timeout; cualquier otra
respuesta se reintenta.
- Hasta 5 intentos con backoff incremental:
- Usa
X-Webhook-Event-ID para deduplicar: el mismo evento puede llegar más
de una vez (entregas at-least-once).
- Si los 5 intentos fallan, el evento no se reenvía — recupera el estado
con el
GET del recurso (por eso ningún flujo debe depender SOLO del
webhook).
Buenas prácticas
- Responde
200 de inmediato y procesa en background.
- Registra el
X-Webhook-Delivery-ID para trazabilidad.
- No dependas solo de webhooks para estados críticos: puedes consultar el
objeto por API en cualquier momento (
GET /v1/payouts/{id}, etc.).