Skip to main content

KYB Compliance Flow

This guide explains how to integrate the KYB (Know Your Business) compliance system using both webhooks (push) and the Business Compliance Status API (pull).

Prerequisite: Related persons (UBOs, shareholders, representatives) must complete individual KYC before KYB can be finalized. See KYC Compliance Flow for the individual KYC integration guide.

Overview

The KYB system provides two complementary mechanisms:

  1. Webhooks (Push): Real-time notifications when KYB state changes
  2. Business Compliance Status API (Pull): On-demand status with actionable guidance

Use webhooks for real-time updates; use the API to get current state and determine next steps.

Integration Paths

Connect Financial supports two KYB integration strategies:

StrategyDescriptionAvailability
External KYBYou handle business verification with your own KYB process; Connect Financial stores documents and manages compliance gatesAvailable now
Standard (CF_KYB)Business verification via Connect Financial's identity platformComing soon

This guide covers the External KYB flow. Standard KYB documentation will be published when that integration path is available.

Note: Your integration strategy is pre-configured at the account level by your Connect Financial account representative. It is not selected at runtime.


Webhook Events

Subscribe to these events via the Webhook API:

EventWhen it firesWhat it means
CUSTOMER_KYB_STARTEDPOST /v1/compliance/kyb calledKYB process initiated
CUSTOMER_KYB_FINISHEDAll compliance gates passKYB approved or denied (check status field)

Webhook Payload

{
"eventType": "CUSTOMER_KYB_FINISHED",
"data": {
"customerId": "uuid",
"status": "APPROVED",
"businessOnboardingId": "uuid"
}
}

Possible status values for CUSTOMER_KYB_FINISHED:

StatusMeaning
APPROVEDBusiness is fully compliant
DENIED_COMPLIANCEBusiness failed compliance checks (e.g., a UBO's individual KYC was denied)

Business Compliance Status API

Endpoint: GET /v1/compliance/business/status/:customerId

Returns actionable business compliance data without requiring message parsing.

Response Structure

{
"isCompliant": false,
"onboardingStatus": "PROCESSING",
"nextAction": "UPLOAD_BUSINESS_DOCUMENT",
"checks": [
{
"type": "KYB_DATA_PRESENT",
"passed": true,
"required": true
},
{
"type": "BUSINESS_DATA_COMPLETE",
"passed": true,
"required": true
},
{
"type": "PERSON_RELATIONS_SHAREHOLDERS",
"passed": true,
"required": true
},
{
"type": "UBO_KYC_COMPLETED",
"passed": true,
"required": true
},
{
"type": "KYB_STARTED",
"passed": true,
"required": true
},
{
"type": "SDK_VERIFICATION_COMPLETED",
"passed": true,
"required": false
},
{
"type": "KYB_STATUS",
"passed": false,
"required": true,
"suggestedAction": "UPLOAD_BUSINESS_DOCUMENT"
},
{
"type": "DOC_CERTIF_INCORPORATION_REG",
"passed": false,
"required": true,
"suggestedAction": "UPLOAD_BUSINESS_DOCUMENT"
}
],
"summary": {
"passed": 15,
"failed": 5,
"requiredFailed": ["KYB_STATUS", "DOC_CERTIF_INCORPORATION_REG", "DOC_FATCA"]
}
}

Suggested Action Values

ActionWhat to do
UPDATE_BUSINESS_DATAUpdate business profile via PATCH /v1/customers/business/:id — check which data checks failed to determine what to update
ADD_PERSON_RELATIONSAdd shareholders or representatives via the person relations endpoints
COMPLETE_UBO_KYCRelated persons need individual KYC approval — see KYC Compliance Flow
START_KYBInitiate KYB process via POST /v1/compliance/kyb
UPLOAD_BUSINESS_DOCUMENTUpload required documents via POST /v1/compliance/business/upload-document
WAITNo user action needed — system is processing
CONTACT_SUPPORTTerminal failure (business denied, UBO KYC denied) — contact Connect Financial support
NONEFully compliant, no action needed

Check Types

Data & Person Checks

CheckDescriptionRequired
KYB_DATA_PRESENTCustomer has KYB data submittedAlways
BUSINESS_DATA_COMPLETERequired business fields present (legal name, tax number, tax country, address)Always
PERSON_RELATIONS_SHAREHOLDERSAt least 1 shareholder with combined ownership ≥ 51%Always
PERSON_RELATIONS_REPRESENTATIVESAt least 1 representativeAlways
UBO_KYC_COMPLETEDAll related persons have individual KYC approvedAlways

KYB Process Checks

CheckDescriptionRequired
KYB_STARTEDKYB process initiated via POST /v1/compliance/kybAlways
SDK_VERIFICATION_COMPLETEDIdentity verification completedExternal KYB: not required (auto-passes)
KYB_STATUSOverall KYB approvedAlways

Document Checks — Corporate Account (10 required)

CheckDocumentDescription
DOC_CERTIF_INCORPORATION_REGCertificate of Incorporation/RegistrationProof of business formation
DOC_CORPORATE_RECORDSCorporate RecordsArticles of association, organizational documents
DOC_CORPORATE_RESOLUTIONCorporate ResolutionBoard resolution authorizing account opening
DOC_COMPANY_FISCAL_REG_CERTIFCompany Fiscal Registration CertificateTax registration certificate
DOC_FATCAFATCA DeclarationW-8BEN-E (non-US) or W-9 (US) based on tax jurisdiction
DOC_FINANCIAL_STATEMENTSFinancial StatementsRecent financial statements or bank statement
DOC_GOV_COMPANY_REG_NUMBERGovernment Company Registration NumberGovernment-issued business license/registration
DOC_PROOF_OF_ADDRESSProof of AddressUtility bill, bank statement, or similar
DOC_SOURCE_OF_FUNDSSource of FundsDeclaration of business fund origins
DOC_TAX_ID_NUMBERTax ID NumberTax identification document

Document Checks — Financial Institution Additional (15 required)

These additional documents are required only if the business is classified as a Financial Institution based on its NAICS sector code.

CheckDocumentDescription
DOC_AML_CFT_SANCTIONS_IND_AUDITAML/CFT Sanctions Independent AuditIndependent audit of AML/CFT sanctions compliance
DOC_AML_CTF_SANCTIONS_POLICYAML/CTF Sanctions PolicyAnti-money laundering and counter-terrorism financing policy
DOC_AML_CTF_TRAINING_PROGRAMAML/CTF Training ProgramStaff training program for AML/CTF compliance
DOC_AUTHORIZED_SIGNATURE_FORMAuthorized Signature FormAuthorized signatory specimen card
DOC_BANKING_LICENSEBanking LicenseBanking or financial services license
DOC_BANKING_REFERENCEBanking ReferenceReference from existing banking relationship
DOC_COMPLIANCE_DEPARTMENTCompliance DepartmentCompliance department organizational chart and procedures
DOC_COMPLIANCE_OFFICER_RESUMECompliance Officer ResumeCompliance officer qualifications and experience
DOC_FI_CORPORATE_STAMPFI Corporate StampFinancial institution corporate seal/stamp
DOC_FI_LICENSEFI LicenseFinancial institution regulatory license
DOC_FINCEN_CERTIF_CORRESP_ACC_FIFinCEN Certification (Correspondent Account)FinCEN certification for correspondent accounts
DOC_GOOD_STANDING_CERTIFICATIONGood Standing CertificationCertificate of good standing
DOC_ML_TF_RISK_ASSESSMENTML/TF Risk AssessmentMoney laundering and terrorist financing risk assessment
DOC_SHARE_CERTIFICATEShare CertificateShare certificate documenting ownership structure
DOC_WOLFSBERG_GCBDDQWolfsberg GCBDDQWolfsberg Group Correspondent Banking Due Diligence Questionnaire

Handling UPDATE_BUSINESS_DATA

When nextAction is UPDATE_BUSINESS_DATA, one or more business data checks have failed. The checks array tells you exactly what is missing:

Failed CheckWhat to update via PATCH /v1/customers/business/:id
KYB_DATA_PRESENTProvide the kyb object — legal name, tax information, identification, and address
BUSINESS_DATA_COMPLETEProvide missing fields in the kyb object — check that legalName, taxInformation, identification, and mainAddress are all present

To determine what needs updating:

  1. Call GET /v1/compliance/business/status/:customerId
  2. Find checks where passed: false and suggestedAction: "UPDATE_BUSINESS_DATA"
  3. Call PATCH /v1/customers/business/:id with the missing data
// Example: compliance status shows BUSINESS_DATA_COMPLETE failed
{
"checks": [
{
"type": "BUSINESS_DATA_COMPLETE",
"passed": false,
"required": true,
"suggestedAction": "UPDATE_BUSINESS_DATA"
}
]
}

// Fix: PATCH /v1/customers/business/:id
{
"kyb": {
"legalName": "Acme Corporation",
"legalStructureType": "LLC",
"counterpartySectorCode": "541511",
"industryDescription": "Custom Computer Programming Services",
"taxInformation": {
"number": "12-3456789",
"taxNumberType": "TAX_IDENTIFICATION_NUMBER",
"taxIdCountry": "US"
},
"identification": {
"code": "BUS123456",
"registrationDate": "2020-01-15",
"documentIdCountry": "US"
},
"mainAddress": {
"street1": "123 Business Ave",
"street2": "Suite 100",
"cityCounty": "New York",
"stateRegion": "NY",
"zip": "10001",
"countryCode": "US"
}
}
}

Financial Institution Classification

A business is classified as a Financial Institution when its NAICS sector code matches any of the following. Financial Institutions must provide 25 documents (10 corporate + 15 additional) instead of the standard 10.

NAICS CodeDescription
522 — Credit Intermediation
522110Commercial Banking
522120Savings Institutions
522130Credit Unions
522190Other Depository Credit Intermediation
522210Credit Card Issuing
522220Sales Financing
522291Consumer Lending
522292Real Estate Credit
522293International Trade Financing
522294Secondary Market Financing
522298All Other Nondepository Credit Intermediation
522310Mortgage and Nonmortgage Loan Brokers
522320Financial Transactions Processing, Reserve, and Clearinghouse Activities
522390Other Activities Related to Credit Intermediation
523 — Securities & Investments
523110Investment Banking and Securities Dealing
523120Securities Brokerage
523130Commodity Contracts Dealing
523140Commodity Contracts Brokerage
523150Investment Banking and Securities Intermediation
523210Securities and Commodity Exchanges
523910Miscellaneous Intermediation
523920Portfolio Management
523930Investment Advice
523991Trust, Fiduciary, and Custody Activities
523999Miscellaneous Financial Investment Activities
524 — Insurance (select)
524113Direct Life Insurance Carriers
524114Direct Health and Medical Insurance Carriers
524126Direct Property and Casualty Insurance Carriers
524127Direct Title Insurance Carriers

If your business NAICS code does not appear in this list, you are classified as a Corporate Account and only the 10 baseline documents are required.


Person Relations

Person relations represent the individuals connected to the business — shareholders and representatives.

Constraints

The following constraints are evaluated during the auto-approval check (not at KYB start time):

ConstraintRequirement
ShareholdersAt least 1 shareholder required
Ownership totalShareholders' combined ownership must be ≥ 51%
RepresentativesAt least 1 representative required

Dual Roles

A single person can hold multiple roles simultaneously. For example, a CEO who is also the majority shareholder would be added twice — once as SHAREHOLDER with their ownership percentage, and once as REPRESENTATIVE.

Available Roles

RoleDescriptionOwnership Required
SHAREHOLDEROwner/shareholder of the businessYes (ownershipPercentage required)
REPRESENTATIVEAuthorized representativeNo

Note: Only SHAREHOLDER and REPRESENTATIVE are valid roles. The API will reject any other role value (e.g., DIRECTOR) with a validation error.

Person Relations Endpoints

MethodEndpointPurpose
POST/v1/customers/business/:id/related-personsAdd a person relation
GET/v1/customers/business/:id/related-personsList all person relations
PATCH/v1/customers/business/:id/related-personsUpdate a person relation
DELETE/v1/customers/business/:id/related-personsRemove a person relation

Important: Each related person must be created as an individual customer first via POST /v1/customers and must complete individual KYC before the business KYB can be finalized. See KYC Compliance Flow for the individual KYC process.

Individual KYC Requirement

All persons referenced in person relations must have approved individual KYC before the business can be approved. The system validates this at two points:

  1. During auto-approval evaluation — the UBO_KYC_COMPLETED gate blocks approval if any UBO's KYC is not approved
  2. When adding relations post-approval — once a business is APPROVED, adding a person whose individual KYC is not approved is rejected with HTTP 400: "Given that your KYB is approved, a related person must have approved individual KYC before being added as a related person"

Pre-approval note: Before KYB approval (PENDING or PROCESSING state), adding a person as a relation does NOT require their KYC to be approved. KYB start also does not require UBO KYC — you can start KYB and upload documents while individual KYC is still in progress. This allows parallel workflows and flexible profile building.

If a related person's individual KYC is denied, the business KYB is automatically set to DENIED_COMPLIANCE.


Source of Funds Declaration

The DOC_SOURCE_OF_FUNDS document can be satisfied in two ways:

Option 1: Upload your own document

Upload a Source of Funds declaration document directly:

POST /v1/compliance/business/upload-document
Headers:
X-document-type: SOURCE_OF_FUNDS
X-file-name: source-of-funds.pdf
X-customer-id: {customerId}
Body: multipart/form-data with file

Option 2: Generate a declaration PDF

Use the built-in PDF generator to create a declaration from predefined source categories:

POST /v1/compliance/business/onboardings/:onboardingId/source-of-funds
Body:
{
"sourcesOfFunds": ["income", "savings", "investments"]
}

This generates a PDF declaration, uploads it to the compliance system, and satisfies the DOC_SOURCE_OF_FUNDS requirement automatically.


Automatic Completion Triggers

The system continuously evaluates whether all compliance gates are met. Completion checks are automatically triggered after any of the following actions:

TriggerWhat happens
Business data updated (PATCH /v1/customers/business/:id)System re-checks all gates
Document uploaded (POST /v1/compliance/business/upload-document)System re-checks all gates
Source of Funds PDF generatedSystem re-checks all gates
KYB started (POST /v1/compliance/kyb)System re-checks all gates
UBO individual KYC approvedSystem automatically re-checks all non-terminal business onboardings referencing that person

Key insight: When a related person completes their individual KYC, the system automatically evaluates all business customers that reference them (both PENDING and PROCESSING states). If all gates pass (KYB started, documents uploaded, UBO KYC complete, shareholder %, representative present), the business is auto-approved.

When all gates pass (including KYB started and all documents uploaded), the business is automatically approved and a CUSTOMER_KYB_FINISHED webhook is fired with status: APPROVED.


Complete Integration Flow (External KYB)

┌───────────────────────────────────────────────────────────────────────────────────────┐
│ PHASE 1: Create Individual Persons (UBOs) + Start Individual KYC │
├───────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ Client API Webhook │
│ │ │ │ │
│ │ For each person (shareholder, │ │ │
│ │ representative ): │ │ │
│ │ │ │ │
│ │──POST /v1/customers────────────▶│ (create individual customer) │ │
│ │◀─────────────────────────────────│ { id: "person-uuid-1" } │ │
│ │◀───────────────────────────────────────────────────CUSTOMER_CREATED─────│ │
│ │ │ │ │
│ │ (Complete individual KYC for │ │ │
│ │ each person — see KYC guide) │ │ │
│ │ │ │ │
│ │──POST /v1/compliance/kyc────────▶│ │ │
│ │◀──────────────────────────────────────────────CUSTOMER_KYC_STARTED──────│ │
│ │ ...Individual KYC flow ... │ │ │
│ │◀──────────────────────────────────────────────CUSTOMER_KYC_FINISHED─────│ │
│ │ │ (status: APPROVED) │ │
│ │ │ │ │
│ │ Repeat for all related persons │ │ │
│ │
└───────────────────────────────────────────────────────────────────────────────────────┘

┌───────────────────────────────────────────────────────────────────────────────────────┐
│ PHASE 2: Create Business Customer │
├───────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ Client API Webhook │
│ │ │ │ │
│ │──POST /v1/customers/business────▶│ (with KYB data) │ │
│ │◀─────────────────────────────────│ { id: "business-uuid" } │ │
│ │◀───────────────────────────────────────────────────CUSTOMER_CREATED─────│ │
│ │ │ │ │
│ │──GET /compliance/business/status▶│ │ │
│ │◀─────────────────────────────────│ │ │
│ │ KYB_DATA_PRESENT: true │ │ │
│ │ BUSINESS_DATA_COMPLETE: true │ │ │
│ │ PERSON_RELATIONS_*: false │ │ │
│ │ nextAction: ADD_PERSON_RELATIONS│ │ │
│ │
└───────────────────────────────────────────────────────────────────────────────────────┘

┌───────────────────────────────────────────────────────────────────────────────────────┐
│ PHASE 3: Add Person Relations │
├───────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ Client API Webhook │
│ │ │ │ │
│ │──POST /customers/business/:id/──▶│ (shareholder with 51%) │ │
│ │ related-persons │ │ │
│ │◀─────────────────────────────────│ │ │
│ │ │ │ │
│ │──POST /customers/business/:id/──▶│ (same person as representative) │ │
│ │ related-persons │ │ │
│ │◀─────────────────────────────────│ │ │
│ │ │ │ │
│ │──GET /compliance/business/status▶│ │ │
│ │◀─────────────────────────────────│ │ │
│ │ PERSON_RELATIONS_*: true │ │ │
│ │ UBO_KYC_COMPLETED: true │ (persons already KYC approved) │ │
│ │ nextAction: START_KYB │ │ │
│ │
└───────────────────────────────────────────────────────────────────────────────────────┘

┌───────────────────────────────────────────────────────────────────────────────────────┐
│ PHASE 4: Start KYB │
├───────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ Client API Webhook │
│ │ │ │ │
│ │──POST /v1/compliance/kyb────────▶│ { customerId: "business-uuid" } │ │
│ │◀─────────────────────────────────│ { onboardingId, status } │ │
│ │◀──────────────────────────────────────────────CUSTOMER_KYB_STARTED──────│ │
│ │ │ │ │
│ │──GET /compliance/business/status▶│ │ │
│ │◀─────────────────────────────────│ │ │
│ │ KYB_STARTED: true │ │ │
│ │ SDK_VERIFICATION_COMPLETED: │ │ │
│ │ passed: true, required: false │ ← Auto-passes for External KYB │ │
│ │ DOC_* checks: false │ │ │
│ │ nextAction: UPLOAD_BUSINESS_DOC │ │ │
│ │
└───────────────────────────────────────────────────────────────────────────────────────┘

┌───────────────────────────────────────────────────────────────────────────────────────┐
│ PHASE 5: Upload Documents │
├───────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ Client API Webhook │
│ │ │ │ │
│ │──POST /compliance/business/─────▶│ (Certificate of Incorporation) │ │
│ │ upload-document │ │ │
│ │◀─────────────────────────────────│ │ │
│ │ │ │ │
│ │──POST /compliance/business/─────▶│ (Certificate of Good Standing) │ │
│ │ upload-document │ │ │
│ │◀─────────────────────────────────│ │ │
│ │ │ │ │
│ │ ...upload remaining documents...│ │ │
│ │ │ │ │
│ │──POST /compliance/business/─────▶│ (Source of Funds - upload or │ │
│ │ onboardings/:id/source-of- │ generate via PDF endpoint) │ │
│ │ funds │ │ │
│ │◀─────────────────────────────────│ │ │
│ │ │ │ │
│ │──GET /compliance/business/status▶│ │ │
│ │◀─────────────────────────────────│ │ │
│ │ All DOC_* checks: ✓ │ │ │
│ │ KYB_STATUS: false │ │ │
│ │ nextAction: WAIT │ (system processing) │ │
│ │
└───────────────────────────────────────────────────────────────────────────────────────┘

┌───────────────────────────────────────────────────────────────────────────────────────┐
│ PHASE 6: Automatic Approval │
├───────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ Client API Webhook │
│ │ │ │ │
│ │ (System auto-approves when │ │ │
│ │ all gates pass: data complete, │ │ │
│ │ persons valid, UBO KYC done, │ │ │
│ │ all docs uploaded) │ │ │
│ │ │ │ │
│ │◀──────────────────────────────────────────────CUSTOMER_KYB_FINISHED─────│ │
│ │ │ (status: APPROVED) │ │
│ │ │ │ │
│ │──GET /compliance/business/status▶│ │ │
│ │◀─────────────────────────────────│ │ │
│ │ isCompliant: true │ │ │
│ │ onboardingStatus: APPROVED │ │ │
│ │ nextAction: null │ │ │
│ │ │ │ │
│ │ Business customer ready for │ │ │
│ │ virtual account creation │ │ │
│ │
└───────────────────────────────────────────────────────────────────────────────────────┘

Alternative Phase Ordering

The phases above show the recommended sequential order, but some phases can be performed in parallel or in different order:

  • Phase 1 and Phase 2 can happen in any order. You can create the business customer before or after creating the individual persons. What matters is that person relations reference valid individual customer IDs.
  • Person relations can be added at any time before starting KYB. You can add them immediately after creating the business customer or gradually over multiple API calls.
  • Documents must be uploaded after starting KYB (POST /v1/compliance/kyb). Attempting to upload documents before KYB is started returns HTTP 400 with "Customer's KYB needs to be started for upload to proceed".
  • Individual KYC must complete before KYB can be approved. You can start KYB and upload documents while individual KYC is still in progress. The auto-approval check will wait until all UBOs have approved KYC before approving the business.

Standard KYB Integration (Coming Soon)

Connect Financial will offer a Standard (CF_KYB) integration path where business identity verification is handled through Connect Financial's identity platform. This will include:

  • Identity verification SDK for business entities
  • Additional webhook events (CUSTOMER_KYB_SDK_FLOW_REQUIRED, CUSTOMER_KYB_SDK_EXPIRED, CUSTOMER_KYB_ERROR)
  • KYB rerun capability for expired or errored verifications

Contact your Connect Financial account representative for updates on availability.


Edge Case Flows

UBO Individual KYC Denied

When a related person's individual KYC is denied, the business KYB is automatically denied.

Webhook: CUSTOMER_KYC_FINISHED (for related person)
│ (status: DENIED_COMPLIANCE)


System auto-denies business KYB


Webhook: CUSTOMER_KYB_FINISHED
│ (status: DENIED_COMPLIANCE)


GET /compliance/business/status

├─ onboardingStatus: DENIED_COMPLIANCE
├─ UBO_KYC_COMPLETED: false
├─ KYB_STATUS: false
└─ nextAction: CONTACT_SUPPORT


Contact Connect Financial support

Note: Before KYB approval, adding a person as a relation does NOT require their KYC to be approved — the system allows adding non-KYC-approved persons during PENDING and PROCESSING states. No compliance constraints block KYB start — only business data completeness is validated. All compliance constraints (UBO KYC, shareholder %, representative) are enforced at auto-approval time. After KYB approval, adding a non-KYC-approved person is rejected (HTTP 400). Document uploads are also blocked while the business is in PENDING status — the upload endpoint returns HTTP 400 with "Customer's KYB needs to be started for upload to proceed".


Business Data Incomplete at KYB Start

If required business fields are missing when you call POST /v1/compliance/kyb, the request will fail.

POST /v1/compliance/kyb
│ { customerId: "business-uuid" }


Error: Business data incomplete


GET /compliance/business/status

├─ BUSINESS_DATA_COMPLETE: false
└─ nextAction: UPDATE_BUSINESS_DATA


PATCH /v1/customers/business/:id
│ (provide missing KYB fields)


GET /compliance/business/status

├─ BUSINESS_DATA_COMPLETE: true
└─ nextAction: START_KYB (or next required action)


(Continue from Phase 4)

Person Relations Constraints Not Met

If person relations don't satisfy constraints when starting KYB:

GET /compliance/business/status

├─ PERSON_RELATIONS_SHAREHOLDERS: false
│ suggestedAction: ADD_PERSON_RELATIONS

├─ Possible reasons:
│ • No shareholders added yet
│ • Shareholders' combined ownership < 51%
│ • No representatives added yet

└─ nextAction: ADD_PERSON_RELATIONS


Add/update person relations:
POST /v1/customers/business/:id/related-persons


(Continue when constraints met)

Important: No compliance constraints block KYB start — only business data completeness is validated. If you call POST /v1/compliance/kyb with insufficient shareholders, missing representatives, or unapproved UBO KYC, KYB will start (status: PROCESSING) but will not auto-approve until all constraints are met. Compliance constraints (UBO KYC, shareholder %, representative) are enforced at auto-approval time.

Adding Unapproved Person During PROCESSING

If a non-KYC-approved person is added as a relation while the business is in PROCESSING state (after KYB start), the add succeeds but the business cannot auto-approve:

Business status: PROCESSING


POST /customers/business/:id/related-persons
│ (add person without approved KYC)


HTTP 201 — Relation added successfully


GET /compliance/business/status

├─ UBO_KYC_COMPLETED: false
└─ nextAction: COMPLETE_UBO_KYC


Complete individual KYC for the new person
(or remove the unapproved person)


Auto-approval re-evaluates when UBO KYC passes

Note: Adding an unapproved person during PROCESSING causes the UBO_KYC_COMPLETED check to regress to false. The business remains in PROCESSING and cannot approve until the new person completes KYC or is removed. The compliance status endpoint is the client's mechanism to detect this.

Duplicate Person Relations

The system prevents adding duplicate person relations (same user ID + same role):

POST /customers/business/:id/related-persons
│ (userId: "abc", role: SHAREHOLDER — already exists)


HTTP 400: "Person relation already exists for userId=abc with role=SHAREHOLDER"

This applies in both pre-approval and post-approval states. The same person CAN hold multiple roles (e.g., SHAREHOLDER and REPRESENTATIVE) — see the Dual Roles section above.

Partial Document Upload

Documents can be uploaded incrementally. Each upload triggers an automatic completion check.

POST /compliance/business/upload-document
│ (3 of 10 documents uploaded)


GET /compliance/business/status

├─ DOC_CERTIF_INCORPORATION_REG: ✓
├─ DOC_CORPORATE_RECORDS: ✓
├─ DOC_CORPORATE_RESOLUTION: ✓
├─ DOC_COMPANY_FISCAL_REG_CERTIF: ✗
├─ ... (remaining unchecked)
└─ nextAction: UPLOAD_BUSINESS_DOCUMENT


Continue uploading remaining documents


When last required document uploaded:
System auto-triggers approval check
→ If all other gates pass → APPROVED
→ Webhook: CUSTOMER_KYB_FINISHED (status: APPROVED)