Skip to main content
Know Your Business (KYB) verification is required before a business can process payments through Cadana. This page covers all requirements and the verification process.
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.
Prefer a short expiresIn when you redirect the owner straight into the form from your own product, and the default when you email the link.
Webhook events (business.kyb.reviewed, business.kyb.completed) work the same regardless of whether KYB was submitted via the hosted form or the API.

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.
Returns 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.
When updating principals in a PATCH request, every principal — including individuals nested inside an entity principal’s entity.individualsmust include its id (returned from GET KYB). PATCH can only update existing principals: a missing or unknown id fails the whole request with 400 ("principal not found"), and PATCH cannot add new principals. To add a principal, re-POST the full submission.
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 returns needs-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:
POST /kyb always writes this field, so a later POST that omits it resets it to false. PATCH changes it only when the field is present. Either include suppressEmailNotification: true in every POST, or set it once via PATCH after your final POST.

Check KYB Status

Retrieve the full KYB record at any time, including the current status 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)
At least one executive/representative is required, and ownership percentages must sum to at most 1 at each level. The following fields apply to individual principals: 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.

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: set isEntity: 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:
  1. Parse the currentlyDue array to identify required fields
  2. Check errors array for specific issues
  3. Collect the required information/documents from the business owner
  4. Resubmit KYB with corrected data
By default Cadana also emails the business owner at this point. See Business Owner Emails to suppress it and own the follow-up yourself.

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.
See Events for all event types and Webhooks to configure your endpoint.

Timeline


Sandbox Testing

Use test values to simulate different KYB outcomes without waiting for real verification.
These test values only work in the sandbox environment and are silently ignored in production. You can’t combine 000-CAD-AUTO-APPROVE with a sentinel SSN in the same submission — the request returns 400.
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