KYB vs KYC: KYB verifies business entities. KYC verifies individual users. See KYC Verification for user verification.
KYB Process Flow
KYB Statuses
Before the first submission (or hosted-link generation),
GET /v1/businesses/{businessId}/kyb returns 404.
Submit KYB
You can submit KYB in two ways:- Hosted form — generate a branded link and send it to your customer. The business owner completes KYB through a hosted UI — no need to build your own collection form.
- API submission — collect the verification data in your own UI and submit it directly via API.
Hosted KYB Form
If you prefer to delegate KYB data collection to the business owner, generate a hosted form link and share it with them. The business owner visits the link and completes verification through a branded UI. Response:Links expire 24 hours after creation by default; pass
expiresIn (seconds, maximum 72 hours) to choose a different lifetime. The resolved expiry is returned as expiresAt. If the owner visits an expired link, they are redirected to your refreshURL where you can generate a new one. Progress is saved as the owner completes each step, so a new link resumes where they left off.API Submission
Submit business and principal information for verification. You can submit all data at once or start with a partial submission and add more information later. The two write endpoints have distinct roles:Incremental submission: You can start with just the business name and address and submit the rest over time. The status stays
incomplete — with the outstanding fields listed in requirements.currentlyDue — until all requirements are met, then moves to pending-review.204 on success. The business is now under review.
Updating KYB Information
Use PATCH to update information already provided — filling in outstanding fields or correcting flagged ones. Only the fields you include are updated — everything else is left unchanged. Document arrays (articlesOfIncorporation, bankStatements, etc.) are appended to, not replaced.
PATCH is also how you respond after a review returns needs-additional-info. Parse the currentlyDue array from the business.kyb.reviewed webhook, collect the required data or documents, and PATCH them in. The status automatically moves back to review once all requirements are satisfied.
You cannot POST or PATCH while the KYB is in
pending-review, complete, or rejected status — the request returns 400.Business Owner Emails
When a review returnsneeds-additional-info, Cadana emails the business’s admin users with a link back to the hosted form so they can supply what is outstanding. The link expires 24 hours after the review. Unlike a link you generate yourself, it carries no refreshURL, so an admin who arrives after it has expired has to come back through you.
If your platform owns the customer relationship, suppress that email and drive the follow-up yourself from the business.kyb.reviewed webhook. Generating the hosted link at the moment your customer is ready to act on it keeps the link fresh, and keeps every message to your customer in your own product’s voice.
Set suppressEmailNotification on either write endpoint:
Check KYB Status
Retrieve the full KYB record at any time, including the currentstatus and any outstanding requirements. requirements.currentlyDue lists the exact field paths still needed — the same paths used in the business.kyb.reviewed webhook — so you can poll this endpoint instead of (or in addition to) listening for webhooks.
Response (truncated):
Business Requirements
Principal / UBO Requirements
A principal can be an individual or a business entity (see Entity Principals below). You must provide information for principals who:- Own 25% or more of the business (
ownershipPercentage >= 0.25), or - Hold significant managerial responsibility (
isExecutive: true)
Upload documents using the file upload flow and pass the returned
fileId values.
Providing a principal ID
Which ID a principal can provide depends on their country. Follow this flow: Fields for each outcome:On a PATCH, the passport fallback lets you supply either half — the number now if the image is already stored, or the image now if the number is already stored.
Supported ID types by country
Supported ID types by country
Entity Principals
When a stake of 25% or more is held by another company rather than a person, submit that company as an entity principal: setisEntity: true and provide the entity object instead of the individual fields (firstName, lastName, dateOfBirth, and identifier do not apply).
The ownership document is the only document required by default — a certificate of incorporation (
certificateOfIncorporationFileId) and proof of address (proofOfAddressFileId) can also be attached; see the API reference. Unlike individual principals, no phone number is collected for an entity principal.
entity.individuals lists the entity’s own principals, in the same shape as top-level principals: everyone holding 25% or more of that entity, plus at least one controlling person — an executive such as the CEO, submitted with isExecutive: true and a title. If no individual crosses the 25% ownership threshold, the controlling person alone satisfies the requirement. An owner that is itself a company is another entity principal — nesting continues as deep as the ownership chain requires, until every branch ends at individuals. Identity verification (KYC) runs against those individuals, not the entity itself.
Entity principals follow the same POST vs PATCH rules as individuals: add or remove them by re-
POSTing the full principals list, and update them via PATCH by referencing their id — including the id of each nested individual inside entity.individuals.Required Documents (Conditional)
These documents are only required when automated verification fails.Webhook Events
business.kyb.reviewed
Sent after KYB has been reviewed. May indicate approval or that additional information is needed.
When you receive
needs-additional-info:
- Parse the
currentlyDuearray to identify required fields - Check
errorsarray for specific issues - Collect the required information/documents from the business owner
- Resubmit KYB with corrected data
business.kyb.rejected
Sent when a KYB submission has been permanently rejected. This is a terminal state — the business cannot resubmit.business.kyb.completed
Sent when business verification is successful. After receiving this event, the business can process payments.Timeline
Sandbox Testing
Use test values to simulate different KYB outcomes without waiting for real verification.
See Sandbox & Testing for all test values.
Next Steps
KYC Verification
User identity verification
Multi-Tenant Setup
Platform integration guide
Webhooks
Configure webhook endpoints
Sandbox & Testing
Test values and simulated scenarios