- Your own verification (onboarding) — mandatory: until approved, your account can only fund (payins, crypto deposits, incoming transfers) and read. Person ⇒ KYC; company ⇒ KYB.
- Verifying your customers (company accounts only) — generate hosted links or send data through the API to verify your own end customers, with a fixed fee per verification.
Your own verification (onboarding)
When you register, your account starts unverified (kyc_status: none) and
can only fund and read. Any outgoing-money action (payouts, transfers,
withdrawals, banking, cards) answers 403 verification_required until you
are approved.
1
Request your verification link
201 response (if you already have an open link, the same one is returned
with 200):kind derives from your account type: person ⇒ kyc, company ⇒
kyb. Onboarding is free for you.2
Complete the wizard
Open the
url: the hosted wizard guides you through the form, document
uploads (identity, proof of residence; corporate documents for companies)
and — for KYC — the camera liveness check.3
Wait for review
Check your state any time:When compliance approves, your
kyc_status becomes approved
automatically and every service unlocks (you receive the
kyc_verification_status_changed webhook with self_onboarding: true).The approval also backfills your account profile with the verified
identity: display_name (person = first + last name; company = legal
name), tax_id and country are taken from the verification and from then
on are immutable via PATCH /v1/me (409 identity_locked) — the
verified identity is the source of truth.While you wait you can fund normally: payins on every method, crypto
deposits and incoming transfers work from day one. If your verification is
rejected (
kyc_status: rejected), contact your operator — they may ask you
to retry with a new link.Verifying your customers (company accounts only)
A verified company account can verify its own end customers. Each created verification bills the configured fixed fee (kyc_verification /
kyb_verification; 0 = free), automatically refunded if creation
fails. Person accounts receive 403 company_account_required.
Option A — Hosted links (recommended)
Your customer completes EVERYTHING in the white-label wizard: form, documents and liveness. You only generate the link and wait for the webhook.external_customer_id(required): YOUR reference for the verified customer — echoed back on every webhook and query. Values equal toselfor ending in:selfare reserved for account onboarding and are rejected with400 invalid_payload.idempotency_key(required): a retry with the same key returns the original link and never double-charges.country(KYB only):us,cl,ve,br,mx,co,pe,bo,py,arorgeneric(withgeneric_countryISO alpha-2, e.g."ES"). Individual KYC takes no country.expires_in_days(optional, 1–30): omitted, the link never expires.
201 response:
Option B — Data through the API
If you already hold the customer’s data, create the verification directly (no wizard). The submission enters the same review queue:- Countries in ISO alpha-3 (
CHL,USA,VEN…); datesYYYY-MM-DD;id_type:passport | id_card | drivers_license. - KYB: body
{ external_customer_id, country?, business: {…}, ubos?, directors?, signers?, bank_info?, metadata? }onPOST /v1/kyb/submissions. - No liveness is required at creation: the KYC submission carries
liveness_pending: true; close it with a liveness link. - Re-sending with the same
external_customer_idwhile the submission is open (pending_review,changes_requested,more_info_required) updates the same submission and does not charge again.
201 response:
pending_documents,
rejection_reason, changes_requested_comments; on KYC also
liveness_pending and documents_received; on KYB aml_decision.
Documents through the API
Documents are optional at creation (if missing, compliance will request them viamore_info_required). 3-step flow:
1
Presign
identity, proofOfResidence; KYB: legalPresence,
ownershipStructure, controlStructure, companyDetails. Types:
application/pdf, image/png, image/jpeg; 15 MB max; the upload URL
expires in 15 minutes.2
Upload
PUT the binary straight to upload_url with the same Content-Type.3
Confirm
kyc_document_validated / kyb_document_validated webhook and is
queryable with GET:outcome: MATCH, REVIEW (manual review), NO_MATCH.Liveness check (liveness link)
KYC submissions created through the API are born withliveness_pending: true (the liveness check is a browser camera flow).
Generate a minimal hosted link for your customer to complete it:
- Free (the service was billed when the submission was created). If an
open link exists, the POST returns the same one; if the check already
passed,
400 liveness_already_completed. GET .../liveness_linkreturns the latest link and the current check state ({ "liveness": { "status", "outcome", "passed" } }).- On pass (outcome
PASSorREVIEW): the submission clearsliveness_pendingand thekyc_liveness_completedwebhook fires.
One verification for everything (reusable identity)
A customer’s approved verification is their single identity inside CBPay: you never re-type their data or re-upload their documents in any other product.- Third-party banking:
POST /v1/banking/third-partiesrequires theverification_idof an approved verification of the third party. The type (INDIVIDUAL/COMPANY) comes from the kind (KYC ⇒ person, KYB ⇒ company), the data (name, email, address) auto-fills from the verified profile, and the already-validated documents are re-delivered automatically to the banking provider (documents_syncedin the response). Details in Banking. - Cards for designated persons:
POST /v1/cardswith a personcardholderrequirescardholder.verification_idof that person’s approved KYC. The cardholder’s identity and documents come from the verification; you only add the issuer-specific fields (occupation,salary_usd). Details in Cards. - Your own account: your approved onboarding is reused too — when creating your banking customer or your first card, missing data and documents auto-fill from your verification.
Compliance report (KYB only)
For every KYB verification you can download the signed compliance report (PDF, evidence for your own auditors):Webhooks
Example payload (
kyc_verification_status_changed):
"self_onboarding": true instead of
external_customer_id. Subscribe like every other event (see
Webhooks).
Costs (configured by your operator, can be 0)
The charge comes out of your default settlement balance, is refunded if
creation fails, and your own onboarding never bills. Re-sends of an
open submission and liveness links do not charge again.
Errors
FAQ
Why can't I create payouts right after registering?
Why can't I create payouts right after registering?
Every account must approve its identity verification before moving money
out (a regulatory requirement). Meanwhile you can fund (payins, crypto
deposits, incoming transfers) and explore the API. Request your link with
POST /v1/me/verification/link and complete it — approval unlocks
everything automatically.Hosted links vs data through the API — which one?
Hosted links vs data through the API — which one?
With links, your customer completes everything in the wizard (form +
documents + liveness) and you never handle sensitive data. With API data
you send the fields and upload documents via presign — useful if you have
your own form — but the liveness check still needs a liveness link (it is
a camera flow, impossible server-to-server).
When is the fee billed and when not?
When is the fee billed and when not?
It bills when CREATING a third-party link or submission (live mode). Not
billed: your own onboarding, re-sends of an open submission (same
external_customer_id), liveness links, queries and documents. If creation
fails, the fee is refunded automatically.
Why can't my person account create links?
Why can't my person account create links?
Third-party verification is a B2B tool for integrators (company accounts).
A person account only needs its own onboarding, which is free and lives at
/v1/me/verification.
Compliance asked for more documents — how do I send them?
Compliance asked for more documents — how do I send them?
You will receive
more_info_required with pending_documents in the
submission detail. Upload each document with this page’s presign → upload →
confirm flow; on confirmation the submission returns to the review queue.Does this replace AML screening?
Does this replace AML screening?
No: they complement each other. Verification proves identity with evidence
(documents, video); AML screening checks the identity
against sanctions/PEP/adverse-media lists and can watch it continuously.
Can I reuse a customer's verification in other products?
Can I reuse a customer's verification in other products?
Yes — that is the design: an approved verification works as the single
identity. Pass its
submission_id as verification_id when registering a
third-party banking user or issuing a card for a designated person: data
and documents auto-fill. See
reusable identity.