Skip to main content
CBPay expone al dueño del pago la información de casos de disputa y fraude. La cuenta puede leer el caso, seguir su timeline inmutable, subir evidencia y descargar el pack generado por la organización. Solo administradores de la organización pueden abrir, enviar o resolver un caso.
La API de cuenta es de solo lectura para decisiones. Una subida exitosa no cambia el resultado: agrega una versión inmutable de evidencia.

Contenido del pack de evidencia

Cuando la organización genera un pack, la cuenta puede descargar el mismo PDF privado y autenticado asociado al caso. Incluye campos tipados del payin, evidencia de ledger/FIFO y referencias externas del gasto. Para payins con tarjeta, el pack incluye la operación que se presenta al procesador (referencias de transacción, aprobación, monto/moneda/fecha, detalles enmascarados de la tarjeta, emisor/país, 3DS, AVS/CVV, resultado del motor de decisión, fingerprint del dispositivo y contexto enmascarado del pagador). Los gastos FIFO incluyen el ID del retiro o payout, activo/moneda, estado, dirección de destino o referencia bancaria y hash de transacción si existe. La identidad verificada KYB/KYC del comercio se incluye completa para representarlo ante el procesador; el pagador permanece enmascarado. Se excluyen los payloads crudos y los campos adyacentes al PAN.

Abrir casos por identificadores

Los administradores de la organización pueden abrir varios casos desde una lista pegada de identificadores. El flujo acepta entre 1 y 100 valores únicos y no vacíos después de quitar espacios y duplicados exactos. Un identificador puede ser el ID del payin, una clave de idempotencia, una referencia corta, qbank_reference o qbank_payin_id. Ambas llamadas exigen el permiso de organización disputes:write. El preview es de solo lectura: no crea casos, no retiene fondos ni envía webhooks.

1. Previsualizar la lista

La respuesta separa las coincidencias exactas de los valores que no se pueden resolver a un único payin. Un valor ambiguous incluye hasta cinco candidatos; cada candidato trae payin_id, currency, local_amount y credited_at.
El preview también puede mostrar un payin que todavía no es elegible para abrir. Revisa status y has_open_case antes de confirmar: batch-open solo abre payins acreditados que no tengan un caso abierto. La apertura individual y la vinculación manual de una fila importada también exigen un payin credited. Si no lo está, responden 409 payin_not_credited y no crean una retención; batch e importación lo reportan por ítem o fila.

2. Confirmar la apertura

Envía los mismos identificadores, o la lista completa, con una clave de idempotencia del batch. kind por defecto es dispute y también acepta fraud_hold.
El servidor vuelve a resolver cada identificador. Nunca confía en un payin o cuenta enviado por el cliente. Cada payin acreditado que calza se abre con una clave idempotente propia derivada de la clave del batch y el ID del payin.
La respuesta del batch es 200 cuando la solicitud es válida. case_already_open, not_found, ambiguous y not_credited son resultados skipped por ítem; un monto inválido o un fallo de apertura es un resultado failed por ítem. Repetir la misma clave devuelve el ítem original como opened con idempotency_hit: true y no crea otra retención. La API devuelve invalid_payload para una lista vacía, valores vacíos, un kind inválido o más de 100 identificadores únicos. No existe un código superior separado too_many. Si falta la idempotencia devuelve idempotency_key_required; si falta el scope de organización devuelve org_required.

Ciclo de vida

Un caso vencido mantiene su retención preventiva. Vencer es una señal operativa, no un movimiento automático de dinero.

Lista tus casos

El alcance de cuenta se aplica en el servidor. Los filtros son status, kind, from, to, page y page_size.

Detalle y evidencia

GET /v1/disputes/{id} agrega items, timeline y evidence al caso. El payload crudo de los cobros nunca se incrusta en la respuesta.
Sube PDF, PNG o JPG (máximo 10 MB) como multipart con el campo file:
Descarga una versión como binario autenticado:

Webhook

Suscríbete a dispute_status_changed mediante el flujo normal de webhooks:
Deduplica por el ID del evento del webhook. El evento informa una transición; no aprueba ni rechaza un caso.

Errores

Consulta el catálogo de errores.

FAQ

No. Son acciones de organización, protegidas por disputes:write y maker-checker.
No. El worker solo cambia el caso a expired y registra el evento.
Sí. open, evidence y submitted aceptan evidencia de cuenta. Los casos won, lost y expired quedan cerrados.

Fiat local retenido

Un payin con credit_asset BOB, MXN o ARS devuelve 409 dispute_fiat_unsupported sin crear caso ni hold. Batch lo omite como fiat_unsupported e import lo marca payin holds local fiat (unsupported).

USD como activo principal del ledger

Las cuentas usan USD como valor predeterminado de settlement_asset y payin_settlement_asset; cámbialo cuando quieras con PUT /v1/settlement. Las operaciones en vuelo nunca se vuelven a cotizar. Los montos del ledger en USD usan centavos (dos decimales). Los créditos y los débitos directos, las comisiones y los flujos de payout, checkout, POS y tarjetas usan USD solo cuando el campo de activo de ese flujo lo acepta. Los swaps entre USD y USDT usan paridad 1:1 y no consultan un oráculo FX. BOB, MXN y ARS siguen siendo activos fiat separados del ledger; en v1 el pricing de money-out para esos activos sigue no disponible. Un payin acreditado directamente a una cuenta USD-principal expone credit_asset: USD y el monto fiat acreditado en centavos; usdt_credited sigue siendo el equivalente USD para reportes. El hold de una controversia sigue el activo acreditado: los créditos USD usan hold_asset: USD. disputed y held usan las unidades del activo retenido; disputed_usdt y held_usdt son equivalentes normalizados.
Última modificación el 4 de octubre de 2026