Skip to main content
POST
/
marketplace
/
merchants
/
{merchantId}
/
kyc
curl -X POST "https://api.khaime.com/api/v1/partner/marketplace/merchants/123/kyc" \
  -H "X-API-Key: pk_sandbox_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "id_country": "NG",
    "account_type": "individual",
    "owner": {
      "first_name": "Amara",
      "last_name": "Osei",
      "date_of_birth": "1990-05-15",
      "phone_number": "+2348012345678",
      "email": "amara@example.com",
      "id_type": "national_id",
      "id_number": "12345678901",
      "id_document_url": "https://cdn.example.com/docs/amara-id.jpg",
      "selfie_url": "https://cdn.example.com/docs/amara-selfie.jpg",
      "address": {
        "street": "12 Victoria Island",
        "city": "Lagos",
        "state": "Lagos",
        "postal_code": "101001",
        "country": "NG"
      }
    },
    "bank_account": {
      "country": "NG",
      "bank_name": "Access Bank",
      "account_number": "0123456789",
      "account_name": "Amara Osei"
    }
  }'

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:
CountryKYC ProviderVerificationData Collection
NG, GH, ZA, KEKhaime KYCManual review within 24 hoursYou submit documents via API
US, GB, CA, EU, etc.Stripe ConnectAutomated via StripeMerchant completes Stripe’s hosted flow
For African markets (NG, GH, ZA, KE): You submit identity documents, business info, and bank details directly. Khaime reviews and approves. For other markets: The merchant completes Stripe’s hosted onboarding flow. You receive a URL to redirect them — Stripe collects all identity and business information directly.

Path Parameters

merchantId
number
required
The ID of the sub-merchant.

Request Body

For African Countries (Khaime KYC)

You can submit KYC data in two formats:
  1. Structured format (recommended) — Uses owner, business, and bank_account objects
  2. Flat format (legacy) — Individual fields at the root level

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.
country
string
required
ISO 3166-1 alpha-2 country code (e.g. US, GB, CA, DE, FR, AU).
business_type
string
The type of business. One of: individual, registered_business. Defaults to individual.
preferred_currency
string
Settlement currency for payouts. Automatically derived from country — you typically don’t need to specify this.
CountryDefault Currency
USUSD
GBGBP
CACAD
EU countriesEUR
AUAUD
return_url
string
required
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).
refresh_url
string
required
URL to redirect the merchant if the Stripe onboarding link expires or they need to restart. Typically the same page that initiates KYC.
Redirect URLs are required for Stripe Connect. When merchants complete Stripe’s onboarding flow, they need to be redirected back to your platform — not Khaime’s dashboard. This ensures a seamless white-label experience.

Stripe Onboarding Flow

1. You call POST /kyc with country + redirect URLs
2. API returns onboarding_url and client_secret
3. Redirect merchant to onboarding_url (or use embedded components with client_secret)
4. Merchant completes identity verification on Stripe
5. Stripe redirects to your return_url
6. Use GET /kyc/status to check verification result
7. Webhooks notify you when status changes

Response

African Countries (Khaime KYC)

{
  "success": true,
  "message": "KYC submitted for review. We will notify you within 24 hours.",
  "data": {
    "provider": "khaime",
    "id": 42,
    "status": "pending_review",
    "business_type": "individual",
    "legal_name": "Amara Osei",
    "id_country": "NG",
    "bank_name": "Access Bank",
    "bank_account_number": "0123456789",
    "bank_account_name": "Amara Osei",
    "settlement_currency": "NGN",
    "country_mismatch": false,
    "submitted_at": "2026-04-10T12:00:00.000Z",
    "reviewed_at": null,
    "rejection_reason": null
  }
}

Other Countries (Stripe Connect)

{
  "success": true,
  "message": "Stripe Connect onboarding initiated. Complete verification on Stripe.",
  "data": {
    "provider": "stripe",
    "submission_id": 43,
    "stripe_account_id": "acct_1234567890",
    "onboarding_url": "https://connect.stripe.com/setup/s/abc123",
    "client_secret": "accs_1234567890_secret_xyz",
    "settlement_currency": "USD",
    "stripe_region": "US"
  }
}
FieldDescription
onboarding_urlRedirect the merchant here to complete Stripe’s hosted onboarding
client_secretUse with Stripe Connect Embedded Components for in-app onboarding
stripe_account_idThe Stripe Connect account ID for this merchant
stripe_regionWhich Stripe region handles this account (US or EU)
Embedded vs Redirect: Use onboarding_url for a simple redirect flow. Use client_secret with Stripe.js for embedded onboarding that keeps users on your site.

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.
FieldTypeDescription
idnumberKYC submission ID
statusstringCurrent status: pending_review, approved, rejected, additional_info_requested, revoked
business_typestringindividual or registered_business
legal_namestringLegal name provided
id_countrystringCountry of identity document
bank_namestring | nullBank name
bank_account_numberstring | nullAccount number
bank_account_namestring | nullAccount holder name
bank_sort_codestring | nullSort code if applicable
settlement_currencystringCurrency locked for payouts (derived from bank_country)
country_mismatchbooleantrue if id_country and bank_country differ — flags for manual review
submitted_atstringISO 8601 timestamp of submission
reviewed_atstring | nullISO 8601 timestamp of review, or null if pending
rejection_reasonstring | nullReason for rejection if status is rejected

KYC Status Flow

not_started → pending_review → approved
                            ↘ rejected → (resubmit) → pending_review
                            ↘ additional_info_requested → (resubmit) → pending_review
approved → revoked (admin action)
Auto-approval: For African markets with valid Nigerian bank details and no country mismatch, KYC may be auto-approved immediately (status approved in the response).

Error Codes

StatusErrorFix
400country or id_country is requiredInclude the country field
400account_type is requiredInclude account_type for African markets
400owner object is required for African marketsInclude the owner object with required fields
400business object is required for registered businessesInclude business object when account_type is registered_business
400return_url and refresh_url are required for Stripe Connect onboardingInclude both redirect URLs for non-African countries
401UnauthorizedInclude a valid X-API-Key header
403This endpoint is restricted to marketplace operatorsYour API key must belong to a marketplace operator account
404Active merchant relationship not foundThe merchant is not linked to your marketplace

curl -X POST "https://api.khaime.com/api/v1/partner/marketplace/merchants/123/kyc" \
  -H "X-API-Key: pk_sandbox_your_key" \
  -H "Content-Type: application/json" \
  -d '{
    "id_country": "NG",
    "account_type": "individual",
    "owner": {
      "first_name": "Amara",
      "last_name": "Osei",
      "date_of_birth": "1990-05-15",
      "phone_number": "+2348012345678",
      "email": "amara@example.com",
      "id_type": "national_id",
      "id_number": "12345678901",
      "id_document_url": "https://cdn.example.com/docs/amara-id.jpg",
      "selfie_url": "https://cdn.example.com/docs/amara-selfie.jpg",
      "address": {
        "street": "12 Victoria Island",
        "city": "Lagos",
        "state": "Lagos",
        "postal_code": "101001",
        "country": "NG"
      }
    },
    "bank_account": {
      "country": "NG",
      "bank_name": "Access Bank",
      "account_number": "0123456789",
      "account_name": "Amara Osei"
    }
  }'

Next Steps