Verificación de la cuenta antes de crear payins
La cobranza autenticada requierekyc_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:
- 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.
- 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.
Pide tu link de verificación
201 (si ya tienes un link vigente, se devuelve el mismo con
200):kind sale de tu tipo de cuenta: persona ⇒ kyc, empresa ⇒ kyb. El
onboarding no tiene costo para ti.Completa el wizard
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.Espera la revisión
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.decision_source del webhook ("auto" / "admin") indica quién decidió.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.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.
Opción A — Links hosteados (recomendada)
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 valoresselfo terminados en:selfestán reservados para el onboarding de la cuenta y se rechazan con400 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,arogeneric(congeneric_countryISO alpha-2, ej."ES"). El KYC individual no lleva país.expires_in_days(opcional, 1–30): sin enviarlo, el link no vence.
201:
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:- Países en ISO alpha-3 (
CHL,USA,VEN…); fechasYYYY-MM-DD;id_type:passport | id_card | drivers_license. - KYB: body
{ external_customer_id, country?, business: {…}, ubos?, directors?, signers?, bank_info?, metadata? }enPOST /v1/kyb/submissions. - No se exige prueba de vida al crear: la submission KYC queda con
liveness_pending: truey la cierras con un liveness link. - Re-enviar con el mismo
external_customer_idmientras la submission siga abierta (pending_review,changes_requested,more_info_required) actualiza la misma submission y no cobra de nuevo.
201:
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á conmore_info_required). Flujo de 3 pasos:
Presign
identity, proofOfResidence; KYB: legalPresence,
ownershipStructure, controlStructure, companyDetails. Tipos:
application/pdf, image/png, image/jpeg; máximo 15 MB; la URL vence en
15 minutos.Upload
PUT del binario directo a upload_url con el mismo Content-Type.Confirm
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 bloquedocuments_gateresume si TODOS los documentos ya están resueltos (ok: true), conmatched/totaly la listaunresolvedde los pendientes.manual_review: presente solo cuando un administrador resolvió manualmente la validación desde el panel admin. En la vista de cuenta traeoutcomeyreviewed_at(sin la nota interna ni el revisor).
effective_outcome y manual_review, y el webhook kyc_document_validated / kyb_document_validated correspondiente.Prueba de vida (liveness link)
Las submissions KYC creadas por datos nacen conliveness_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_linkdevuelve el último link y el estado del check ({ "liveness": { "status", "outcome", "passed" } }).- Al pasar (outcome
PASSoREVIEW): la submission limpialiveness_pendingy llega el webhookkyc_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-partiesexige elverification_idde 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_synceden la respuesta). Detalle en Banking. - Tarjetas para personas designadas:
POST /v1/cardscon uncardholderde persona exigecardholder.verification_idde 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.
Informe de compliance (solo KYB)
Para cada verificación KYB puedes descargar el informe de compliance firmado (PDF, evidencia para tus propios auditores):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:
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.http y https; cualquier otro
esquema se descarta y el texto queda sin enlace.De tus terceros (cuentas empresa)
format=json (resumen del shape — el PDF sale del mismo modelo):
"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 departies[] 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.
"partial": ["party_aml_unavailable"] y el screening
faltante se ejecuta en segundo plano: la descarga siguiente ya lo trae.De tu propio onboarding
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 unverification_code (impreso en el PDF junto a un QR).
Cualquiera puede confirmar su autenticidad sin credenciales:
Webhooks
kyc_verification_status_changed):
"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)
Errores
Preguntas frecuentes
¿Por qué no puedo hacer payouts recién registrado?
¿Por qué no puedo hacer payouts recién registrado?
POST /v1/me/verification/link y complétalo — la aprobación desbloquea todo.¿Por qué la verificación me pide contactar al administrador?
¿Por qué la verificación me pide contactar al administrador?
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.¿Qué diferencia hay entre links hosteados y datos por API?
¿Qué diferencia hay entre links hosteados y datos por API?
¿Cuándo se cobra la comisión y cuándo no?
¿Cuándo se cobra la comisión y cuándo no?
¿Por qué mi cuenta persona no puede crear links?
¿Por qué mi cuenta persona no puede crear links?
/v1/me/verification.Compliance pidió más documentos, ¿cómo los mando?
Compliance pidió más documentos, ¿cómo los mando?
more_info_required con pending_documents. Usa el flujo presign
→ upload → confirm de esta página; luego la submission vuelve a revisión.¿Esto reemplaza al AML screening?
¿Esto reemplaza al AML screening?
¿Puedo reusar la verificación de un cliente en otros productos?
¿Puedo reusar la verificación de un cliente en otros productos?
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.¿Recibo un email cuando aprueban o rechazan mi verificación?
¿Recibo un email cuando aprueban o rechazan mi verificación?
kyc_status_changed/kyb_status_changed que ya
integraste.