Rechazos y webhook de alertas
Cuando un payout entra y choca con tu payout_filter_mode, Shinkansen devuelve un rechazo en la respuesta HTTP y además persiste una alerta que puedes ver en el dashboard o recibir en tu propio sistema por webhook.
Semántica del rechazo en el payout receive
El filtro corre sobre todas las transacciones del PayoutMessage como una unidad. Si al menos una transacción es rechazada, la payout order completa se rechaza — no hay aceptación parcial.
Respuesta HTTP:
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"errors": [
{
"error_code": "payout.account_blocked",
"error_message": "Account 00987654321 at SANTANDER_CL is in your blocklist (fraud_reported)",
"transaction_id": "e3b0c442-98fc-4c14-9b1a-aaaaaaaaaaaa"
}
]
}
Códigos de error que puede devolver el filtro:
error_code |
Cuándo se emite |
|---|---|
payout.account_blocked |
La cuenta destino está en tu blocklist. Mode: blocklist o controlled. |
payout.account_not_allowlisted |
La cuenta destino no está en tu allowlist. Mode: controlled. |
payout.filter_check_unavailable |
El filtro no pudo correr (fallo infra). Fail-closed: rechaza todas las tx. |
Fail-closed sobre fail-open. Si Shinkansen no puede leer tu configuración por una falla de infra, el filtro rechaza todos los pagos del request en lugar de dejarlos pasar en silencio. Es un control de riesgo: preferimos un rechazo visible a un bypass invisible. Si recibes payout.filter_check_unavailable revisa el estado de Shinkansen en status.shinkansen.tech y reintenta.
Webhook payout_filter_alert
Opcional. Si quieres recibir las rejections del filtro en tu propio sistema (para alertar a un equipo de riesgo, levantar un ticket, etc.), registra un endpoint en la fin property payout_filter_alert_webhook_endpoint.
Configuración
Desde el dashboard: Settings → Webhooks → Payout filter list → Payout filter alert endpoint.
El campo acepta una URL o una lista de URLs. Cada rejection produce un POST por URL registrada; una falla en una URL no afecta a las otras.
Payload
{
"shinkansen_alert_id": 12345,
"fin_id": "ACME_CL",
"transaction_id": "e3b0c442-98fc-4c14-9b1a-aaaaaaaaaaaa",
"account_type": "current_account",
"creditor_fin": "SANTANDER_CL",
"account": "00987654321",
"reason": "blocked",
"filter_reason": "fraud_reported",
"filter_reason_text": "Reportado por el usuario el 2026-10-20",
"mode_at_check": "blocklist",
"inserted_at": "2026-10-29T15:42:11Z"
}
Notas sobre los campos:
shinkansen_alert_ides el id interno del registro en Shinkansen. Es tu clave de deduplicación: dos entregas con el mismoshinkansen_alert_idson el mismo evento.reasontoma uno deblocked,not_allowlisted,filter_check_unavailable(mismo set que elerror_codedel rechazo HTTP, sin el prefijopayout.).filter_reasonyfilter_reason_textvienen de la entry que generó el match. Ennot_allowlistedyfilter_check_unavailablellegan comonull(no hay entry que haya hecho match).mode_at_checkregistra el modo del Fin al momento del check —blocklist,controlledonull(este último solo en el fail-closed path).
Verificación de firma
El payload va firmado JWS en el header shinkansen-jws-signature (formato detached: <protected>..<signature>), con el certificado público de Shinkansen que ya usas para los otros webhooks que te envía la plataforma. Si todavía no verificas firmas, revisa la guía de seguridad de webhooks.
Entrega y reintentos
- Shinkansen reintenta hasta 5 veces con backoff exponencial ante fallas de transporte o respuestas 5xx.
- Respuestas 2xx y 409 se tratan como entrega exitosa. Usa 409 cuando tu sistema ya tiene el
shinkansen_alert_idregistrado. - Después del 5º intento fallido el delivery queda en estado
discarded. La alerta sigue visible en el dashboard — el webhook no es la única fuente de verdad.
El webhook solo se dispara para alertas nuevas, no hay backfill cuando activas el endpoint por primera vez. Si configuras el webhook un mes después de haber activado el filtro, las rejections históricas quedan solo en el dashboard — descárgalas con la API o la UI si las necesitas.
Dónde ver las alertas en el dashboard
Payouts → Alertas de filtro. El listado tiene filtros por fecha, por reason, por cuenta (búsqueda substring) y paginación. Cada fila muestra el detalle completo que llega en el webhook.
