GET /v1/rates) y se debita usdt_amount + fee (el fijo,
si está configurado) de tu saldo.
Así se ve el ciclo completo, incluido qué pasa con tu saldo en cada paso:
1. Descubre los corredores disponibles
Los países, monedas y métodos disponibles los define CBPay. Consúltalos siempre por catálogo:
La disponibilidad puede variar; el catálogo (
GET /v1/payouts/methods) es
siempre la fuente de verdad. Si un país tiene un solo método, method es
opcional. Todos los métodos se cobran igual: tu tasa + fijo.
Para transferencias bancarias necesitas además el catálogo de bancos (de
ahí sale el bank_code del beneficiario):
2. Crea el payout
Cada payout guarda al beneficiario como contacto
automáticamente (
"save_contact": false para no guardarlo). Para repetirle
un pago sin re-tipear sus datos, envía "beneficiary_contact_id" en vez de
beneficiary — se usa su beneficiario guardado más reciente para ese país
y método (422 no_saved_destination si no tiene).202 Accepted:
total_debit pasó de
available a held (en el saldo del settlement_asset).
bank_reference — el id propio del banco para la transferencia. En US ACH,
wire y SWIFT es la referencia CBF que vuelve de inmediato al crear (el
payout sigue processing hasta que el banco confirma). En el resto de
corredores queda vacio ("") hasta completed. Mientras
el payout está en curso viene vacío (""); cuando el payout queda
completed, lleva el id de transacción asignado por el banco/rail de
destino. Es el valor que el beneficiario puede usar para cruzar el pago con
su banco, y también aparece en el webhook payout_status_changed, el
comprobante PDF, el export CSV de payouts y la cartola. Las respuestas, CSV, webhooks y comprobantes también incluyen uetr (UETR/SWIFT gpi) e imad (wire/ACH doméstico), vacíos hasta que el banco los reporte; usa el tracker público para el estado vivo y el mismo comprobante.Pagar desde otro saldo (settlement_asset)
Por defecto el débito sale de USD; usa PUT /v1/settlement para cambiarlo. Para pagar una operación
puntual desde otro saldo, agrega settlement_asset al request. Ejemplo:
un payout de 100.000 CLP pagado desde el saldo BTC pasa por cuatro
transformaciones, todas registradas en la respuesta:
- CLP → USDT a tu tasa:
100000 / 950.25 = 105.235465 USDT. - + comisión fija:
105.235465 + 0.30 = 105.535465 USDT(total_debit). - USDT → BTC al precio efectivo de settlement (
settlement_rate109029.34070000):105.535465 / 109029.3407 = 0.00096795 BTC(redondeo hacia arriba al satoshi). - Débito y hold en BTC:
settlement_amount0.00096795sale de tu saldo BTC; el beneficiario recibe sus 100.000 CLP igual que siempre.
settlement_amount exacto a tu saldo
BTC — nunca se re-cotiza. Si el precio de ejecución de BTC/GOLD/SILVER/PLATINUM no está
disponible en ese momento recibirás 503 pricing_unavailable, y los
assets volátiles tienen un límite por operación
(422 settlement_limit_exceeded; consúltalo en GET /v1/settlement).
Para settlement BOB, MXN o ARS en la misma moneda, consulta Settlement de payouts fiat.
El screening técnico puede quedar pendiente
CBPay screenea al beneficiario antes de debitar tu saldo o llamar al core. Si el servicio de screening está temporalmente no disponible y la cola técnica de screening está disponible, el payout se persiste y el create responde202 Accepted con el recurso en status: "pending":
receipt_url. El replay con la misma clave de idempotencia devuelve
el mismo payout con idempotency_hit: true; nunca crea una segunda operación.
Cuando el worker recibe process, el payout existente sigue el flujo normal de
débito y despacho. Un hold válido entra al firewall transaccional. Un
rejected posterior termina el payout en failed sin débito.
Después de aceptar process, el mismo payout puede permanecer en
status: "pending" mientras se reconcilian el débito y el despacho. La API y el
webhook payout_status_changed exponen estos códigos de transición durables:
compliance_dispatch_pending: el screening pasó, existe el débito/hold yfunds_debited: true, pero el despacho al core aún no terminó.compliance_dispatching: el claim de despacho está en curso.core_unreachable: el despacho o la liquidación local es ambiguo y espera conciliación; no crees un segundo payout.
idempotency_key, lee el payout y espera el siguiente evento de estado. Cuando
el payout termina, completed consume el hold y failed devuelve el débito
exacto. Los eventos finales usan el camino durable e incluyen los campos
normales del comprobante.
La respuesta técnica compliance_check_unavailable sigue aplicando cuando el
payout no se puede dejar en la cola pendiente y en los flujos que no tienen
esta cola. No reemplaza los contratos actuales de validación, seguridad ni
compliance_hold.
Un fallo antes del débito no es un reembolso
Si el screening o un control duro de compliance falla antes de iniciar el camino de débito, el mismo payout puede terminarfailed con
predebit_failure: true y funds_debited: false. La respuesta y su evento
payout_status_changed omiten receipt_url, porque no hubo débito, hold ni
comprobante que revertir. Es distinto de un failed posterior al débito,
donde el débito exacto se reembolsa antes del evento terminal.
Para conocer el origen de la tasa y las cotizaciones FIFO indicativas, revisa Orígenes de tasa de payouts y cotizaciones FIFO.
3. Recibe el estado final
Suscríbete al eventopayout_status_changed (webhooks):
completed: el dinero llegó; el hold se consume.failed: se reembolsa el débito completo automáticamente (payout_refunden tu ledger).
status_message es el detalle opcional y normalizado que acompaña a
status_code; puede venir vacío cuando el core no tiene un mensaje adicional.
También puedes consultar en cualquier momento:
Estados del payout
Consulta e historial
Cada payout se puede leer individualmente y el listado acepta filtros:from/to van en YYYY-MM-DD (zona horaria de tu organización, ambos inclusive); una fecha inválida
responde 400 invalid_range. method filtra por el catálogo activo de payouts y
search hace una coincidencia parcial sin distinguir mayúsculas/minúsculas sobre
el ID del payout, la referencia bancaria o la clave de idempotencia.
Ejemplos por país
Cada corredor con subeneficiary exacto, el request completo y la
respuesta real. Las tasas (fx_rate) son ilustrativas — siempre aplican
las de tu cuenta en GET /v1/rates; el débito es usdt_amount + fee
(fijo, si está configurado; aquí 0.30).
Campos del beneficiary por corredor
- Chile
- Perú
- México
- Venezuela
- Bolivia
- Brasil
- Ecuador
- Paraguay
- Argentina
- Estados Unidos
Transferencia bancaria en CLP. Requiere RUT, banco y cuenta: el peso chileno no tiene unidad menor, por lo que los montos de payouts CLP deben ser enteros (por ejemplo, El catálogo de bancos (
30000 o 30000.00).GET /v1/payouts/banks?country=CL) da los bank_code vigentes. CL/CLP/bank_transfer puede despacharse en ventanas agrupadas de cinco minutos; POST /v1/payouts sigue respondiendo 202 con status: "processing" y cada payout conserva su estado final y su webhook payout_status_changed.SEPA Instant en EUR
Consulta la guía dedicada de payouts SEPA Instant para la única fila de enrutamiento Europa (EU)/EUR/sepa; el país real del
beneficiario sale del IBAN. Los IBAN GB fallan rápido con HTTP 400 antes del
despacho; SEPA Credit Transfer para GB es alcance futuro.
Documento de respaldo obligatorio en transferencias USD
TODA transferencia saliente en USD por rail bancario (ach, wire o
swift) exige un documento de respaldo (factura o recibo) adjunto —
es un requisito del banco procesador y aplica a cualquier corredor USD,
no solo al de EE. UU. (por ejemplo, también a un SWIFT internacional como
PY/USD/swift).
1
Sube el documento
Envía el archivo con
POST /v1/payouts/documents: binario crudo un PDF (application/pdf, hasta 50 MB) y el nombre en el query
param name. La interfaz actual de payouts US/USD acepta solo PDF.2
Pásalo al crear el payout
El
document_key viaja en options.supporting_document_key. En
ach/wire puedes agregar options.document_reference_number (número
de factura o referencia del documento) — se envía al banco.- Un payout USD por rail bancario creado sin el documento se rechaza
al crear con
400 supporting_document_required(sin débito). - Una key subida por otra cuenta se rechaza con
400 invalid_document_key. - La
document_keyqueda almacenada: si el create falla por otra causa, la reutilizas en el reintento — no necesitas re-subir el archivo.
Payout QR
Pagar un QR de cobro (Bolivia, PIX de Brasil) ahora tiene su propia guía:Payout QR
Escanea el QR gratis, muestra a tu usuario los datos del destinatario y
confirma el pago en una segunda llamada — se cobra como un payout normal.
Errores frecuentes
Rechazo inmediato vs fallo posterior
Si el procesador rechaza el payout al crearlo, recibes422 con el objeto
en status: failed y el reembolso ya aplicado. Si falla después (por
ejemplo, cuenta destino inexistente detectada por el banco), te llega el
webhook con status: failed y el reembolso automático en ese momento.
Cómo leer status_code en un payout fallido
En todos los casos el reembolso ya está aplicado — verifícalo con la
entrada
payout_refund en
movimientos.
Un payout en
processing no se puede cancelar por API: el rail ya lo tiene.
Espera el estado final por webhook o GET — llega siempre, con reembolso
automático si falla.FAQ
¿Cuándo se debita mi saldo?
¿Cuándo se debita mi saldo?
Al crear: el payout debita y retiene los fondos de inmediato. Si el payout
falla, el monto exacto debitado (comisión incluida) se reembolsa
automáticamente.
¿Puedo cancelar un payout en processing?
¿Puedo cancelar un payout en processing?
No — una vez despachado al riel se resuelve solo a
completed o failed.
Suscríbete a payout_status_changed para el estado final.¿Qué tasa FX usa mi payout?
¿Qué tasa FX usa mi payout?
La tasa cotizada al crear (devuelta como
fx_rate), congelada para esa
operación. Tu spread acordado ya viene dentro de la tasa.¿Puedo pagar desde un saldo distinto de USDT?
¿Puedo pagar desde un saldo distinto de USDT?
Sí — fija un default por cuenta (
PUT /v1/settlement) o sobreescribe por
payout con settlement_asset (USDC, BTC, GOLD). Los reembolsos devuelven
el monto liquidado exacto, jamás se re-cotizan.¿Qué significa status: pending con compliance_pending: true?
¿Qué significa status: pending con compliance_pending: true?
El screening del beneficiario no está disponible temporalmente, pero CBPay
persistió el payout en su cola técnica de screening. No se debitó saldo, no
existe hold ni asiento en el ledger, no se llamó al core y todavía no hay
receipt_url. El replay con la misma idempotency key devuelve el mismo recurso.
Espera el evento payout_status_changed o consulta el payout: continuará con
process, entrará al firewall con un hold válido o terminará failed sin
débito si el resultado es rejected.¿Qué significa compliance_hold (403)?
¿Qué significa compliance_hold (403)?
El beneficiario no pasó el screening de compliance: el payout no se
creó y tu
idempotency_key no se consumió. Revisa los datos del
beneficiario o contacta a tu equipo CBPay.¿Cómo reintento sin riesgo tras un timeout o 5xx?
¿Cómo reintento sin riesgo tras un timeout o 5xx?
Reintenta con la misma
idempotency_key: recibes el payout original
(idempotency_hit: true) — jamás un duplicado. Una clave nueva es un
payout nuevo e independiente.Por que mi payout US ACH/wire/SWIFT sigue processing?
Por que mi payout US ACH/wire/SWIFT sigue processing?
Los payouts del riel bancario US los paga el operador a mano. El create
ya trae el CBF en
bank_reference y queda processing hasta que el banco
confirma. Escucha payout_status_changed para el estado final; un fallo
reembolsa el debito solo.422 destination_recently_rejected,
consulta Errores y Protección ante rechazo del destino.
Propósito y validación de pagos US/USD
En payouts bancariosUS/USD (ach, wire y swift),
options.purpose es obligatorio. La API acepta la etiqueta visible o su
código, sin distinguir mayúsculas. El catálogo aceptado es:
options.purpose_detail es obligatorio solo cuando purpose es Other y
acepta hasta 140 caracteres. Se rechaza con cualquier otro propósito. Crear
sin purpose ahora responde 400 purpose_required: es un cambio incompatible
para clientes que dependían del antiguo default Invoice_Payment.
beneficiary.account_type es obligatorio tanto para ach como para wire y
debe ser checking o savings (sin distinguir mayúsculas). swift no usa
este campo. Para wire y swift, montos menores a USD 25 responden
422 amount_below_minimum. Países del beneficiario o banco del Anexo B
(CU, IR, KP, SY) responden 422 prohibited_country. Estas validaciones
ocurren antes de debitar.
Los errores normalizados son invalid_beneficiary, invalid_amount,
amount_below_minimum, prohibited_country, purpose_required,
invalid_options y supporting_document_required. Revisa message para
corregir el campo exacto. No repitas una solicitud rechazada sin cambios; ante
timeout o 5xx, reutiliza la misma clave de idempotencia.