Skip to main content

Verificación de la cuenta antes de crear payins

La cobranza autenticada requiere kyc_status: approved en personas y KYB aprobado en empresas; mientras tanto, POST /v1/payins (QR/card/checkout/bank_transfer/fintoc), OTP/collect, cuentas de depósito dedicadas, cobros con tarjeta guardada y suscripciones responden 403 verification_required. Los links públicos, abonos pasivos, asignación de org-admin e instrumentos del sistema siguen disponibles; solicita POST /v1/me/verification/link y reintenta después de aprobar. La verificación de identidad comprueba que una persona (KYC) o empresa (KYB) es quien dice ser, con evidencia real: formulario completo, subida de documentos validados por OCR y prueba de vida en video. Tiene dos caras:
  1. Tu propia verificación (onboarding) — obligatoria: hasta aprobarla, tu cuenta solo puede fondear (payins, depósitos crypto, recibir transferencias) y consultar. Persona ⇒ KYC; empresa ⇒ KYB.
  2. Verificación de tus clientes (solo cuentas empresa) — generas links hosteados o envías los datos por API para verificar a tus propios clientes finales, con una comisión fija por verificación.

Tu propia verificación (onboarding)

Al registrarte, tu cuenta nace sin verificar (kyc_status: none) y solo puede fondear y leer. Cualquier acción de dinero saliente (payouts, transferencias, retiros, banking, tarjetas) responde 403 verification_required hasta que apruebes.
Las solicitudes nuevas exigen TOTP confirmado o passkey registrado; revisa Perfil y seguridad para enrolar uno y reintenta. Los links abiertos se re-sirven antes del gate; la automatización con API key sigue exenta.
1

Pide tu link de verificación

Respuesta 201 (si ya tienes un link vigente, se devuelve el mismo con 200):
El kind sale de tu tipo de cuenta: persona ⇒ kyc, empresa ⇒ kyb. El onboarding no tiene costo para ti.
2

Completa el wizard

Abre la url: el wizard hosteado te guía por el formulario, la subida de documentos (identidad, comprobante de domicilio; societarios para empresas) y — en KYC — la prueba de vida en video frente a la cámara.
3

Espera la revisión

Consulta tu estado cuando quieras:
Los cuatro campos opcionales de submission aparecen cuando están disponibles: pending_documents, changes_requested_comments, documents_received y documents_gate; rejection_reason no se expone y una falla temporal del core puede omitirlos.Cuando compliance aprueba, tu kyc_status pasa a approved automáticamente, todos los servicios se desbloquean y recibes el webhook kyc_verification_status_changed con self_onboarding: true.
Motor de decisión automática: un expediente completamente limpio (documentos legibles, liveness aprobado, sin sanciones ni coincidencias PEP y sin señales de riesgo) se aprueba en segundos y sin intervención humana. Las zonas grises pasan a la cola humana del operador. Las sanciones AML severas (incluida una parte KYB), los países prohibidos, el fraude/expiración documental explícita y los rechazos explícitos del proveedor también pasan a la cola humana con sus razones preservadas; el motor ya no auto-rechaza. El campo decision_source del webhook ("auto" / "admin") indica quién decidió.
La aprobación además rellena el perfil de tu cuenta con la identidad verificada: display_name (persona = nombre + apellido; empresa = razón social), tax_id y country se toman de la verificación y desde ese momento quedan inmutables vía PATCH /v1/me (409 identity_locked) — la identidad verificada es la fuente de verdad.
Mientras esperas puedes fondear normalmente: payins, depósitos crypto y transferencias entrantes funcionan desde el día uno. Si la verificación es rechazada (kyc_status: rejected), contacta a tu operador por un link nuevo.

Verificar a tus clientes (solo cuentas empresa)

Una cuenta empresa verificada puede verificar a sus propios clientes finales. Cada verificación creada cobra la comisión fija configurada (kyc_verification / kyb_verification; 0 = gratis), que se reembolsa automáticamente si la creación falla. Las cuentas persona reciben 403 company_account_required. Tu cliente completa TODO en el wizard de marca blanca: formulario, documentos y prueba de vida. Tú solo generas el link y esperas el webhook.
  • external_customer_id (obligatorio): TU referencia del cliente verificado — la recibes de vuelta en cada webhook y consulta. Los valores self o terminados en :self están reservados para el onboarding de la cuenta y se rechazan con 400 invalid_payload.
  • idempotency_key (obligatoria): un retry con la misma clave devuelve el link original y nunca cobra dos veces.
  • country (solo KYB): us, cl, ve, br, mx, co, pe, bo, py, ar o generic (con generic_country ISO alpha-2, ej. "ES"). El KYC individual no lleva país.
  • expires_in_days (opcional, 1–30): sin enviarlo, el link no vence.
Respuesta 201:
Consulta e historial (todo POST tiene su GET):

Opción B — Datos por API

Si ya tienes los datos del cliente en tu sistema, créale la verificación directo (sin wizard). La submission entra al mismo queue de revisión:
Notas del modo datos:
  • Países en ISO alpha-3 (CHL, USA, VEN…); fechas YYYY-MM-DD; id_type: passport | id_card | drivers_license.
  • KYB: body { external_customer_id, country?, business: {…}, ubos?, directors?, signers?, bank_info?, metadata? } en POST /v1/kyb/submissions.
  • No se exige prueba de vida al crear: la submission KYC queda con liveness_pending: true y la cierras con un liveness link.
  • Re-enviar con el mismo external_customer_id mientras la submission siga abierta (pending_review, changes_requested, more_info_required) actualiza la misma submission y no cobra de nuevo.
Respuesta 201:
Consulta e historial:
El detalle agrega pending_documents, rejection_reason, changes_requested_comments, documents_received, documents_gate y aml_decision para KYB.

Documentos por API

Los documentos son opcionales al crear (si faltan, compliance los pedirá con more_info_required). Flujo de 3 pasos:
1

Presign

Categorías — KYC: identity, proofOfResidence; KYB: legalPresence, ownershipStructure, controlStructure, companyDetails. Tipos: application/pdf, image/png, image/jpeg; máximo 15 MB; la URL vence en 15 minutos.
2

Upload

PUT del binario directo a upload_url con el mismo Content-Type.
3

Confirm

Al confirmar se dispara la validación OCR; el resultado llega por el webhook kyc_document_validated / kyb_document_validated y se consulta con GET:
outcome: MATCH (coincide), REVIEW (revisión manual), NO_MATCH. Cada item expone además:
  • id: identificador de la validación (lo usa el equipo de cumplimiento para revisarla).
  • effective_outcome: el resultado que rige hoy — si un administrador resolvió la validación manualmente desde el panel admin, ese resultado; si no, el del motor OCR. En el detalle de la submission (GET /v1/kyc/submissions/{id}) el bloque documents_gate resume si TODOS los documentos ya están resueltos (ok: true), con matched/total y la lista unresolved de los pendientes.
  • manual_review: presente solo cuando un administrador resolvió manualmente la validación desde el panel admin. En la vista de cuenta trae outcome y reviewed_at (sin la nota interna ni el revisor).
La revisión manual de una validación de documento es una operación exclusiva del panel de administración (CBPay Admin); no se expone por API pública. Cuando el equipo de cumplimiento la aplica, tu cuenta ve el resultado actualizado en effective_outcome y manual_review, y el webhook kyc_document_validated / kyb_document_validated correspondiente.
Las submissions KYC creadas por datos nacen con liveness_pending: true (la prueba de vida es un flujo de cámara en browser). Genera un link mínimo hosteado para que tu cliente la complete:
  • No cobra (el servicio se cobró al crear la submission). Si ya hay un link vigente, el POST devuelve el mismo; si la prueba ya fue superada, 400 liveness_already_completed.
  • GET .../liveness_link devuelve el último link y el estado del check ({ "liveness": { "status", "outcome", "passed" } }).
  • Al pasar (outcome PASS o REVIEW): la submission limpia liveness_pending y llega el webhook kyc_liveness_completed.

Una sola verificación para todo (identidad reutilizable)

La verificación aprobada de un cliente es su identidad única dentro de CBPay: no vuelves a tipear sus datos ni a subir sus documentos en ningún otro producto.
  • Banking para terceros: POST /v1/banking/third-parties exige el verification_id de una verificación aprobada del tercero. El tipo (INDIVIDUAL/COMPANY) sale del kind (KYC ⇒ persona, KYB ⇒ empresa), los datos (nombre, email, dirección) se completan solos desde el perfil verificado, y los documentos ya validados se re-entregan automáticamente al proveedor bancario (documents_synced en la respuesta). Detalle en Banking.
  • Tarjetas para personas designadas: POST /v1/cards con un cardholder de persona exige cardholder.verification_id de un KYC aprobado de esa persona. Identidad y documentos del titular salen de la verificación; solo agregas los campos propios del emisor (occupation, salary_usd). Detalle en Tarjetas.
  • Tu propia cuenta: tu onboarding aprobado también se reutiliza — al crear tu banking customer o tu primera tarjeta, los datos y documentos faltantes se completan desde tu verificación.
Los campos explícitos de tu request siempre ganan sobre el autofill.
Sin una verificación aprobada del tercero, el alta banking y la emisión de tarjetas designadas responden 422 verification_required. Verifica primero (links hosteados o datos por API) y usa el submission_id aprobado como verification_id.

Informe de compliance (solo KYB)

Para cada verificación KYB puedes descargar el informe de compliance firmado (PDF, evidencia para tus propios auditores):
Es gratuito (el servicio se cobró al crear la verificación).

Informe de verificación (PDF + JSON)

Además del informe del procesador, cada submission KYC o KYB decidida tiene su informe de verificación generado por la plataforma. Es el expediente completo, no un resumen: identidad verificada (persona o empresa), perfil económico declarado, declaraciones de riesgo, cuenta bancaria enmascarada, ciclo de vida de la decisión, documentos con su validación documental, prueba de vida, partes relacionadas con su propio screening (KYB) y screening AML con el detalle de cada coincidencia — todo con hash de integridad y código de verificación pública. Dos formatos (?format=pdf|json, default pdf) y tres idiomas (?lang=en|es|zh, default en). Es gratuito: es la lectura de una verificación ya pagada. Secciones del informe:
La prueba de vida trae una fila por sesión, no una por sujeto. La sesión gate es el check que habilitó el onboarding — normalmente trae solo la selfie. La sesión media_recapture es una captura de evidencia posterior y es la que trae el paquete completo (selfie + un frame por gesto solicitado + video). Una media_recapture que terminó en outcome: "FAIL" sigue importando — puede ser la única sesión con video utilizable — así que recorre todo el array liveness[] en vez de leer liveness[0]; el veredicto vigente del sujeto es siempre el outcome de la sesión gate. En un KYB, parties[].liveness (singular) se conserva por compatibilidad y siempre apunta a la sesión gate de esa parte, mientras parties[].liveness_sessions[] trae todas las sesiones de esa parte.
Cómo se lee el PDF. El informe abre con una portada navegable: un índice de tarjetas con icono, título y número de página que son clicables y saltan a su sección. Cada sección lleva su propio icono y barra de acento (el mismo lenguaje visual del informe AML), las fotos del documento y de la prueba de vida conservan su proporción real, y ningún encabezado queda solo al pie de una página. Los medios adversos del anexo AML llevan un chip “ver fuente” y la URL de verificación pública del cierre es clicable — por seguridad solo se embeben enlaces http y https; cualquier otro esquema se descarta y el texto queda sin enlace.

De tus terceros (cuentas empresa)

El informe de un tercero es completo: la sección AML incluye nivel de riesgo, indicadores y coincidencias (nombres, listas de sanciones, PEP, medios adversos). Tú realizas la diligencia sobre tu cliente y este informe es tu evidencia. Respuesta format=json (resumen del shape — el PDF sale del mismo modelo):
Si la verificación aún no tiene screening AML enlazado (verificaciones antiguas), la primera descarga lo ejecuta automáticamente sin costo. Si el screening no está disponible en ese momento, el informe sale igual con "partial": ["aml_unavailable"] — la sección jamás se inventa.

Partes relacionadas y su screening (KYB)

En una verificación de empresa, cada UBO, persona de control y firmante del expediente sale como una entrada de parties[] con su identidad completa, su participación, los documentos y la prueba de vida que le corresponden, y su propio screening AML con monitoreo continuo activado. El par (source, index) es la identidad estable de la parte dentro del expediente: es lo que enlaza sus documentos (uboIdentity:0) y lo que hace que su screening sea siempre el mismo, sin importar cuántas veces descargues el informe. El screening de las partes es gratuito (es una obligación de diligencia, no un producto facturable) y queda bajo monitoreo: si un UBO entra a una lista de sanciones después del alta, la alerta aparece sola.
Si alguna parte todavía no tiene su screening al momento de la descarga, el informe sale con "partial": ["party_aml_unavailable"] y el screening faltante se ejecuta en segundo plano: la descarga siguiente ya lo trae.

De tu propio onboarding

En el informe de tu propia verificación la sección AML va agregada (aml_detail: false): verás el estado por categoría — sanctions, pep y adverse_media como clear o under_review — sin el detalle de coincidencias. Lo mismo aplica al screening de tus partes relacionadas: sus secciones AML también van agregadas. El resto del expediente (identidad, perfil económico, documentos, prueba de vida, partes) sale completo.

Verificación pública del informe

Todo informe lleva un verification_code (impreso en el PDF junto a un QR). Cualquiera puede confirmar su autenticidad sin credenciales:
La página pública confirma solo el tipo, el estado vigente de la decisión, la fecha y la marca emisora — nunca datos del sujeto. En un navegador responde una página HTML con tu marca.

Webhooks

Payload de ejemplo (kyc_verification_status_changed):
Tu propio onboarding llega con "self_onboarding": true en vez de external_customer_id. Suscríbete igual que al resto de eventos (ver Webhooks).

Costos (configurados por tu operador, pueden ser 0)

El cargo sale de tu saldo de settlement predeterminado, se reembolsa si la creación falla, y tu propio onboarding nunca cobra. Re-envíos de una submission abierta y liveness links no cobran de nuevo.

Errores

Preguntas frecuentes

Toda cuenta debe aprobar su verificación antes de mover dinero hacia afuera. Mientras tanto puedes fondear y explorar la API. Pide el link con POST /v1/me/verification/link y complétalo — la aprobación desbloquea todo.
Un administrador pudo haber desactivado o cerrado la cuenta, o rechazado su KYC/KYB. En esos estados, POST /v1/me/verification/link no vuelve a servir ni crea un link self-service. Primero el administrador debe restaurar la cuenta o reabrir la verificación.
Se cobra al CREAR un link o una submission de terceros (modo live). Tu onboarding, re-envíos abiertos, liveness links, consultas y documentos son gratis; si falla la creación, la comisión se reembolsa sola.
Recibirás more_info_required con pending_documents. Usa el flujo presign → upload → confirm de esta página; luego la submission vuelve a revisión.
No: son complementarios. La verificación prueba la identidad con evidencia; el AML screening consulta listas de sanciones/PEP/prensa adversa y puede vigilar la identidad de forma continua.
Sí — una verificación aprobada es la identidad reutilizable. Pasa su submission_id como verification_id al dar de alta un usuario banking o emitir una tarjeta para una persona designada; los datos y documentos se completan solos. Ver identidad reutilizable.
Si es tu propia cuenta (no una empresa verificando a un tercero), recibirás un email brandeado cuando la decisión sea aprobada, rechazada o pida cambios. Nunca incluirá el motivo detallado del rechazo. Los terceros no reciben este email; reciben el webhook kyc_status_changed/kyb_status_changed que ya integraste.
Última modificación el 3 de octubre de 2026