Alcance
Este corredor se limita acountry=EC, currency=USD y
method=bank_transfer. Usa el modo de despacho manual: el payout queda en
processing con status_code=manual_dispatch hasta que un operador autorizado
lo pague en el portal bancario y confirme el resultado. CBPay no llama ni
concilia automáticamente un banco en esta ruta.
La selección del proveedor y sus credenciales son asuntos de despliegue; no
forman parte del contrato público de CBPay.
Ambientes
Prueba primero en staging, con rieles simulados y beneficiarios sintéticos. Verifica staging antes de probar producción. Las verificaciones en producción requieren datos operativos y autorización explícita del ambiente y del alcance.Flujo
Crear y leer un payout
Usa los endpoints normales de payouts con un beneficiario sintético:1.00 a 10000.00, inclusive, con máximo dos
decimales por valor. Usa strings decimales, nunca floating point.
ECM
seguido de 13 dígitos secuenciales. Es un formato propio de este corredor, no
una restricción general para todas las referencias bancarias. La respuesta
inicial normalmente incluye:
Confirmar el pago bancario
El operador del core confirma el payout pagado manualmente:bank_reference, paid_amount y reason. La confirmación
mediante POST /v1/ops/payouts/{payoutID}/confirm-manual-paid exige
Idempotency-Key; se recomienda enviarla en el header, o puedes incluir
idempotency_key en el JSON. Sin una key, el endpoint responde 400 idempotency_key_required. La confirmación es idempotente: después de un
timeout, vuelve a leer el payout primero. Si el resultado sigue incierto,
reintenta la misma confirmación con la misma key y evidencia idéntica. El
replay devuelve el original con idempotency_hit: true; una evidencia
distinta devuelve 409 idempotency_conflict. Nunca uses una key nueva para la
misma acción bancaria.
Payins manuales
Confirmar la recepción de un payin ya anunciadoEC/USD/push/bank_transfer
es una operación de dos personas (maker-checker). No se mueve dinero hasta la
segunda aprobación. Ningún paso usa clave de idempotencia del cliente: la
llamada identifica la operación por el payin ID y la evidencia bancaria, y los
replays honestos devuelven el original con idempotency_hit: true.
Paso 1 — solicitud (maker). Un operador autorizado de la organización
con org_operations/ops:write y una sesión admin humana registra la
evidencia bancaria. El payin sigue pending; nada se acredita aún:
id, status,
bank_reference, received_amount, account_id, maker, created_at).
Reintentar la misma solicitud del maker con evidencia idéntica reproduce la
solicitud original con un hit; una evidencia distinta devuelve
409 invalid_state. La solicitud no expira: queda abierta hasta que un
checker la apruebe o el maker (o un admin god) la cancele.
Paso 2 — aprobación (checker). Un segundo admin god nombrado, distinto
del maker, aprueba la solicitud abierta. La solicitud no lleva body:
409 second_approver_required). Si los datos del payin cambiaron
desde la solicitud (confirm_account_mismatch, bank_ref_conflict), o la
referencia pertenece a una liquidación de tesorería
(deposit_settled_treasury_trade), la aprobación falla de forma honesta y el
payin sigue pending; lee ambos recursos antes de reintentar.
Cancelación. El maker o cualquier admin god puede cancelar una solicitud
abierta con POST /v1/payins/{payinID}/confirm-cancel (también sin body).
Una solicitud cancelada nunca acredita; para confirmar se necesita una
solicitud nueva.
Tras cualquier timeout, lee primero el payin. Si ya está acreditado con la
misma evidencia, el replay devuelve el resultado original; si sigue
pendiente, vuelve a leer la solicitud de confirmación y reintenta el mismo
paso. Nunca intentes una confirmación con una evidencia distinta para
“empujarla”.
Instrucciones de depósito
Lee las instrucciones del instrumento payin existente:{ "items": [{ "code": "...", "name": "..." }], "meta": { "retrieved": 1 } }, donde retrieved es el número de elementos devueltos.
Usa un code devuelto por el catálogo como beneficiary.bank_code.
Reglas operativas
- El operador paga en el portal bancario y registra la referencia bancaria.
- No reenvíes una acción bancaria ambigua con una key nueva.
- Para la confirmación de payins manuales, la solicitud y la aprobación son dos pasos separados de dos admins distintos; tras un timeout, lee el payin y la solicitud de confirmación antes de reintentar el mismo paso.
- Los ejemplos son sintéticos; reemplaza placeholders solo con datos operativos autorizados.
Estados y errores
Consulta el catálogo completo de errores para el formato común
de respuestas y las reglas de manejo.
Preguntas frecuentes
¿CBPay envía automáticamente la transferencia de Ecuador?
¿CBPay envía automáticamente la transferencia de Ecuador?
No. El operador completa la acción bancaria y confirma el payout existente
en CBPay.
¿Qué significa manual_dispatch?
¿Qué significa manual_dispatch?
Significa que el payout sigue en procesamiento y espera que un operador
autorizado complete y confirme la acción bancaria.
¿Qué hago después de un timeout?
¿Qué hago después de un timeout?
Lee primero el recurso correspondiente. Para un payout, reintenta la misma
solicitud con la misma key de idempotencia. Para
confirm-received, lee primero el payin y no reenvíes la confirmación con
una nueva key sin verificar qué ocurrió en el banco.