KYB vs KYC: KYB verifies business entities. KYC verifies individual users. See KYC Verification for user verification.
KYB Process Flow
KYB Statuses
| Status | Description | Can Process Payments? |
|---|---|---|
initialized | KYB record created (e.g. by generating a hosted link), nothing submitted yet | No |
incomplete | Partially submitted — required fields are still outstanding (see requirements.currentlyDue) | No |
pending-review | All requirements submitted, under review | No |
awaiting-principal-kyc | Submitted, waiting on one or more principals to complete identity verification | No |
needs-additional-info | Review complete, more information required | No |
rejected | Business verification rejected (terminal) | No |
complete | Business verified | Yes |
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:| Field | Description |
|---|---|
id | Unique identifier for the KYB link |
url | The hosted form URL — send this to the business owner. White-label platforms get the link on their own domain. |
expiresAt | Unix timestamp when the link expires |
Links expire 6 hours after creation (
expiresAt). If the business owner visits an expired link, they are redirected to your refreshURL where you can generate a new link. 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 using the PATCH endpoint.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. Use PATCH /v1/businesses/{businessId}/kyb to fill in scalar fields, but note that PATCH cannot add principals — to add a principal, re-POST the full submission (allowed while the status is initialized, incomplete, awaiting-principal-kyc, or needs-additional-info). A re-POST replaces the entire principal list.204 on success. The business is now under review.
Updating KYB Information
Use PATCH to add or correct fields after the initial submission. 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.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
| Requirement | API Field | Rules |
|---|---|---|
| Legal business name | entityName | Must exactly match the registered name on government records |
| Entity type | entityType | corporation, c-corporation, s-corporation, partnership, sole proprietorship, limited liability company, non profit, other |
| Business address | address | Must be a valid physical address; PO Boxes not allowed |
| Phone number | phoneNumber | Must be a reachable business phone |
| EIN / Tax ID | taxIdentificationNumber | Must be a valid IRS-issued EIN |
| Incorporation address | incorporation.address | Must match corporate records |
| Incorporation date | incorporation.date | Must be a valid date |
| Website URL | websiteURL | Must be a valid website |
Principal / UBO Requirements
You must provide information for individuals who:- Own 25% or more of the business (
ownershipPercentage >= 0.25), or - Hold significant managerial responsibility (
isExecutive: true)
| Requirement | API Field | Rules |
|---|---|---|
| First name | principals[].firstName | Must match ID document |
| Last name | principals[].lastName | Must match ID document |
| Date of birth | principals[].dateOfBirth | Must be valid and 18+ |
principals[].email | Valid email address | |
| Phone number | principals[].phoneNumber | Reachable phone |
| Residential address | principals[].address | Physical address; PO Boxes not allowed |
| Identifier | principals[].identifier | Type: ssn or passport |
| Ownership % | principals[].ownershipPercentage | 0-1 scale (1 = 100%) |
| Executive flag | principals[].isExecutive | Required for control person |
| Executive title | principals[].title | Required for control person |
| ID document (front) | principals[].identifier.identityFileId | Required if SSN verification fails |
| ID document (back) | principals[].identifier.identityBackPageFileId | Required if SSN verification fails |
| Address proof | principals[].identifier.addressFileId | Required if address verification fails |
fileId values.
Required Documents (Conditional)
These documents are only required when automated verification fails.| Verification failure | Required upload | Accepted documents |
|---|---|---|
| EIN / Tax ID unverified | taxDocuments | IRS EIN confirmation letter (SS-4 or 147C) — must show exact legal name + EIN |
| Business registration mismatch | articlesOfIncorporation | Articles of Incorporation or Certificate of Formation |
| Business address unverified | proofOfAddress | Utility bill, lease, or bank statement |
| Principal identity unverified | principals[].identifier.identityFileId and principals[].identifier.identityBackPageFileId | Government-issued photo ID (front and back) |
| Principal address unverified | principals[].identifier.addressFileId | Utility bill, lease, or bank statement |
| Compliance review | bankStatements | Recent bank statements (if requested by Compliance) |
Webhook Events
business.kyb.reviewed
Sent after KYB has been reviewed. May indicate approval or that additional information is needed.| Field | Description |
|---|---|
status | Current KYB status |
requirements.currentlyDue | Fields that need to be submitted or corrected |
requirements.errors | Specific validation errors with reasons |
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
| Step | Duration |
|---|---|
| Submit KYB | Immediate |
| Review (once all requirements provided) | Up to 3 business days |
Sandbox Testing
Use test values to simulate different KYB outcomes without waiting for real verification.| Test value | Field | Result |
|---|---|---|
000-CAD-AUTO-APPROVE | taxIdentificationNumber | KYB automatically approved |
000-CAD-AUTO-REJECT | taxIdentificationNumber | KYB automatically rejected (terminal) |
000-CAD-AUTO-FLAG | taxIdentificationNumber | Status set to needs-additional-info, requests all business documents |
000-11-2222 | principals[].identifier.value (SSN) | Requires identity documents and address files for the principal |
000-11-3333 | principals[].identifier.value (SSN) | Status set to needs-additional-info, principal receives KYC requirement email |
Next Steps
KYC Verification
User identity verification
Multi-Tenant Setup
Platform integration guide
Webhooks
Configure webhook endpoints
Sandbox & Testing
Test values and simulated scenarios