Payouts

MODO PRUEBA

Un payout es el riel inverso del cobro: en vez de que el dinero entre a la cuenta del comercio, POST /v1/payouts ordena que salga de ella hacia una CLABE por SPEI — pagar a un proveedor, dispersar una nómina, o liquidar a un sub-comercio de Winal Connect. Mismo principio sin custodia que el resto de la API (ADR-0001): el dinero sale de la cuenta STP del propio comercio, firmado con su propia llave; Winal solo orquesta la orden y lleva el ledger.

Ordena un payout

bash
curl -s https://api.winal.com.mx/v1/payouts \
  -H "Authorization: Bearer $SK" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "clabe": "646180157000000004",
    "beneficiary_name": "Proveedor Docs SA de CV",
    "amount_minor": 250000,
    "currency": "MXN",
    "concepto": "pago de prueba docs"
  }'
201 · respuesta real
{
  "id": "b4e5115a-e401-48b6-9b4d-e80b7a915748",
  "object": "payout",
  "clabe": "646180157000000004",
  "beneficiary_name": "Proveedor Docs SA de CV",
  "amount_minor": 250000,
  "currency": "MXN",
  "concepto": "pago de prueba docs",
  "reference": "2441786",
  "status": "processing",
  "connector_key": "sim",
  "livemode": false,
  "created_at": "2026-07-08T06:46:43.157657+00:00"
}

Idempotency-Key es obligatorio (regla 8: un reintento sin la llave, tras un timeout de red, dispersaría el dinero DOS veces). reference es opcional — si lo omites, Winal genera un folio numérico corto. beneficiary_rfc es opcional. connector_key también es opcional: por defecto stp (el riel de producción); usa "connector_key": "sim" mientras pruebas sin cuenta STP. provider_ref, tracking_key y failure_reason no aparecen todavía en esta respuesta — Winal omite los campos en null — y se llenan cuando el Worker ejecuta la orden contra el conector, segundos después.

Estados de un payout

processing se resuelve solo con evidencia del proveedor (regla 5): una confirmación en línea al ordenar, o la consulta de estado del poller — nunca por timeout local. En Sim, una CLABE cualquiera queda processing indefinidamente (esperando evidencia real); dos CLABEs reservadas existen para ejercitar los desenlaces sin esperar:

EstadoEs terminalQué significa
processingNoLa orden se aceptó y está en curso; sin evidencia todavía del riel SPEI.
paidEl proveedor confirmó que el beneficiario recibió el dinero.
failedEl proveedor rechazó la orden (cuenta sin fondos, CLABE inexistente, credenciales inválidas) — el detalle va en failure_reason.
returnedEl banco beneficiario devolvió el dinero después de aceptarlo (cuenta cancelada, titular no coincide, etc.).
CLABEs reservadas del conector Sim (para probar cada desenlace sin esperar)
002180000000000009 el conector la rechaza al ordenar → failed en segundos, con failure_reason: "SIM_PAYOUT_REJECTED: El proveedor simulado rechazó la dispersión (CLABE reservada de rechazo).". Cualquier otra CLABE válida (18 dígitos con dígito de control correcto, p. ej. 646180157000000004) queda processing — es el comportamiento correcto de "esperando evidencia", igual que processing en un cobro SPEI/CoDi/DiMo/OXXO.

Errores de payouts

HTTPcodeCausa
400payout.missing_fieldsFalta clabe, beneficiary_name o concepto.
400payout.invalid_amountFalta amount_minor positivo o currency.
400payout.invalid_currencycurrency no es un código ISO 4217 parseable.
400payout.unsupported_currencyLa moneda es ISO 4217 válida pero no es MXN — las dispersiones SPEI solo operan en pesos.
400payout.invalid_clabeLa CLABE no son 18 dígitos, o su dígito de control es incorrecto (mismo algoritmo Banxico que valida onboarding_application.clabe_liquidacion).
404payout.not_foundEl id no existe o es de otro tenant.

Idempotencia: mismos códigos y comportamiento que el resto de la API — ver Errores.

STP real vs. Sim

El conector STP (el riel de producción — Sistema de Transferencias y Pagos, participante directo de SPEI) está construido contra la forma documentada de su API: registro de orden firmado con RSA-SHA256, consulta de estado, y reporte de conciliación. Está gated por trámite del dueño: contrato con STP, alta de la cuenta empresa del comercio y su llave privada. Sin esas credenciales, cualquier payout con connector_key: "stp" (el default) falla de inmediato con failure_reason: "STP_MISSING_CREDENTIALS: Faltan credenciales STP del comercio...". Usa "connector_key": "sim" para probar el ciclo completo hoy, sin cuenta STP.

Endpoints

MétodoRutaNotas
POST/v1/payoutsRequiere Idempotency-Key.
GET/v1/payouts?limit= opcional (default 100, máx. 500).
GET/v1/payouts/{id}404 payout.not_found si no existe.