Marketplace
Submit Merchant KYC
Submit a KYC application on behalf of a sub-merchant.
POST
Documentation Index
Fetch the complete documentation index at: https://docs.khaime.com/llms.txt
Use this file to discover all available pages before exploring further.
Submit Merchant KYC
Submits a Know Your Customer (KYC) application for a sub-merchant in your marketplace. This is required before a merchant can receive payouts.The merchant must already exist in your marketplace. Create or link them first via Create Merchant before submitting KYC.
How KYC Works
Khaime uses a unified KYC system that routes to the appropriate provider based on the merchant’s country:| Country | KYC Provider | Verification | Data Collection |
|---|---|---|---|
| NG, GH, ZA, KE | Khaime KYC | Manual review within 24 hours | You submit documents via API |
| US, GB, CA, EU, etc. | Stripe Connect | Automated via Stripe | Merchant completes Stripe’s hosted flow |
Path Parameters
The ID of the sub-merchant.
Request Body
For African Countries (Khaime KYC)
You can submit KYC data in two formats:- Structured format (recommended) — Uses
owner,business, andbank_accountobjects - Flat format (legacy) — Individual fields at the root level
- Structured Format (Recommended)
- Flat Format (Legacy)
Core Fields
ISO 3166-1 alpha-2 country code. Must be one of:
NG, GH, ZA, KE.Type of account. One of:
individual, registered_business.Owner Object (Required)
Theowner object contains information about the business owner or individual.Owner/individual information.
| Field | Type | Required | Description |
|---|---|---|---|
first_name | string | Yes | Owner’s first name |
last_name | string | Yes | Owner’s last name |
date_of_birth | string | No | Date of birth in YYYY-MM-DD format |
phone_number | string | No | Contact phone number |
email | string | No | Contact email address |
id_type | string | Yes | Document type: passport, national_id, drivers_license |
id_number | string | Yes | ID number (BVN, NIN, or passport number) |
id_document_url | string | Yes | URL to uploaded identity document image |
selfie_url | string | No | URL to selfie photo for liveness verification |
address | object | Yes | Owner’s residential address (see Address Object) |
Business Object (Required for registered_business)
Required when
account_type is registered_business.| Field | Type | Required | Description |
|---|---|---|---|
legal_name | string | Yes | Registered business name |
trading_name | string | No | Trading/DBA name if different |
registration_number | string | Yes | Business registration number (e.g., CAC number) |
tax_id | string | No | Tax identification number |
business_type | string | No | One of: sole_proprietorship, partnership, llc, corporation, ngo, other |
website | string | No | Business website URL |
phone_number | string | No | Business phone number |
registration_document_url | string | Yes | URL to certificate of incorporation |
additional_document_url | string | No | URL to additional supporting document |
address | object | Yes | Business address (see Address Object) |
Bank Account Object (Optional)
Bank details can be submitted with KYC or added later via Add Bank Account.Payout bank account details.
*Either
| Field | Type | Required | Description |
|---|---|---|---|
country | string | Yes | Bank country code (e.g., NG, GH) |
bank_name | string | Yes* | Bank name from Get Supported Banks |
bank_id | string | Yes* | Bank UUID from Get Supported Banks |
account_number | string | Yes | Bank account number |
account_name | string | Yes | Name on the bank account |
bank_code | string | No | Bank code (if applicable) |
sort_code | string | No | Sort code (required for UK accounts) |
routing_number | string | No | Routing number (for US accounts) |
bank_name or bank_id is required.Address Object
Used in bothowner.address and business.address.| Field | Type | Required | Description |
|---|---|---|---|
street | string | Yes | Street address |
city | string | Yes | City or town |
state | string | Yes | State, province, or region |
postal_code | string | No | Postal or ZIP code |
country | string | Yes | ISO 3166-1 alpha-2 country code |
For Other Countries (Stripe Connect)
For non-African countries, Khaime uses Stripe Connect for identity verification. You only need to provide minimal information — Stripe collects everything else directly from the merchant through their secure hosted onboarding flow.What Stripe Collects: Personal information, government ID, business details, bank account for payouts, and tax information. All data is collected securely by Stripe — it never passes through your servers.
ISO 3166-1 alpha-2 country code (e.g.
US, GB, CA, DE, FR, AU).The type of business. One of:
individual, registered_business. Defaults to individual.Settlement currency for payouts. Automatically derived from country — you typically don’t need to specify this.
| Country | Default Currency |
|---|---|
| US | USD |
| GB | GBP |
| CA | CAD |
| EU countries | EUR |
| AU | AUD |
URL to redirect the merchant after they complete Stripe onboarding. This should be a page on your platform that handles the post-onboarding flow (e.g., shows a success message or redirects to their dashboard).
URL to redirect the merchant if the Stripe onboarding link expires or they need to restart. Typically the same page that initiates KYC.
Stripe Onboarding Flow
Response
African Countries (Khaime KYC)
Other Countries (Stripe Connect)
| Field | Description |
|---|---|
onboarding_url | Redirect the merchant here to complete Stripe’s hosted onboarding |
client_secret | Use with Stripe Connect Embedded Components for in-app onboarding |
stripe_account_id | The Stripe Connect account ID for this merchant |
stripe_region | Which Stripe region handles this account (US or EU) |
Response Fields
KycSubmission Object (Source of Truth)
All KYC and bank data is stored in the KycSubmissions table. This is the single source of truth.| Field | Type | Description |
|---|---|---|
id | number | KYC submission ID |
status | string | Current status: pending_review, approved, rejected, additional_info_requested, revoked |
business_type | string | individual or registered_business |
legal_name | string | Legal name provided |
id_country | string | Country of identity document |
bank_name | string | null | Bank name |
bank_account_number | string | null | Account number |
bank_account_name | string | null | Account holder name |
bank_sort_code | string | null | Sort code if applicable |
settlement_currency | string | Currency locked for payouts (derived from bank_country) |
country_mismatch | boolean | true if id_country and bank_country differ — flags for manual review |
submitted_at | string | ISO 8601 timestamp of submission |
reviewed_at | string | null | ISO 8601 timestamp of review, or null if pending |
rejection_reason | string | null | Reason for rejection if status is rejected |
KYC Status Flow
approved in the response).
Error Codes
| Status | Error | Fix |
|---|---|---|
400 | country or id_country is required | Include the country field |
400 | account_type is required | Include account_type for African markets |
400 | owner object is required for African markets | Include the owner object with required fields |
400 | business object is required for registered businesses | Include business object when account_type is registered_business |
400 | return_url and refresh_url are required for Stripe Connect onboarding | Include both redirect URLs for non-African countries |
401 | Unauthorized | Include a valid X-API-Key header |
403 | This endpoint is restricted to marketplace operators | Your API key must belong to a marketplace operator account |
404 | Active merchant relationship not found | The merchant is not linked to your marketplace |
Next Steps
- Check the submission outcome with Get KYC Status
- If rejected, use Resubmit KYC with corrected documents
- Add bank details later with Add Bank Account if not provided at submission
