Skip to main content
POST
/
marketplace
/
merchants
/
{merchantId}
/
kyc
/
resubmit
curl -X POST "https://api.khaime.com/api/v1/partner/marketplace/merchants/123/kyc/resubmit" \
  -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",
      "id_type": "passport",
      "id_number": "A12345678",
      "id_document_url": "https://cdn.example.com/docs/amara-passport-v2.jpg",
      "selfie_url": "https://cdn.example.com/docs/amara-selfie-v2.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.

Resubmit Merchant KYC

Resubmits a KYC application for a sub-merchant. This endpoint handles both Khaime KYC (African markets) and Stripe Connect (other markets) based on the merchant’s existing submission.
For Khaime KYC: This endpoint will fail if the merchant’s KYC status is pending_review or approved. Check the current status with Get KYC Status first.For Stripe Connect: You can call this anytime to get a fresh onboarding URL to resume or update verification.

How Resubmission Works

ProviderWhen AllowedWhat Happens
Khaime KYCStatus is rejected or additional_info_requestedSubmit new documents; creates new submission
Stripe ConnectAnytime (with existing Stripe account)Returns new onboarding_url to resume/update verification

Path Parameters

merchantId
number
required
The ID of the sub-merchant.

Request Body

For African Countries (Khaime KYC)

Same fields as Submit KYC. You can use either the structured format or legacy flat format. Provide complete data, not just changed fields.

For Other Countries (Stripe Connect)

For Stripe Connect merchants, call this endpoint to get a fresh onboarding session. The merchant can then resume or update their verification on Stripe.
When to use this: If the merchant didn’t complete onboarding, if their session expired, or if Stripe requires additional information.
return_url
string
required
URL to redirect the merchant after they complete Stripe onboarding. This should be a page on your platform.
refresh_url
string
required
URL to redirect the merchant if the Stripe onboarding link expires. Typically the same page that initiates KYC.
You don’t need to pass country or other fields — the system uses the existing submission data to generate a new onboarding session.

Response

African Countries (Khaime KYC)

{
  "success": true,
  "message": "KYC resubmitted for review.",
  "data": {
    "provider": "khaime",
    "id": 47,
    "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-10T14:30:00.000Z",
    "reviewed_at": null,
    "rejection_reason": null
  }
}

Other Countries (Stripe Connect)

{
  "success": true,
  "message": "Continue your 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"
  }
}
FieldDescription
onboarding_urlFresh URL to redirect the merchant to Stripe’s hosted onboarding
client_secretFresh secret for Stripe Connect Embedded Components
stripe_account_idThe existing Stripe Connect account ID
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.

Data Storage

All resubmitted KYC data is stored in the KycSubmissions table:
FieldStorage Location
KYC documentsKycSubmissions.id_document_url, selfie_url, etc.
Owner infoKycSubmissions.owner_info (JSON)
Business infoKycSubmissions.business_info (JSON)
Bank detailsKycSubmissions.bank_info (JSON) + flat fields
StatusKycSubmissions.status
Stripe accountKycSubmissions.stripe_account_id
Important: The KycSubmissions table is the single source of truth. Legacy fields in Educatorportfolio are deprecated.

Error Codes

StatusErrorFix
400Can only resubmit after rejection or additional info requestCheck status first — only Khaime KYC with rejected or additional_info_requested status can resubmit
400No KYC submission foundUse Submit KYC for first-time submission
400KYC is already approvedNo resubmission needed — merchant is already verified
400New KYC documents are required for resubmissionInclude complete KYC data for Khaime KYC resubmit
400Stripe account not foundContact support — the Stripe Connect account is missing
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/resubmit" \
  -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",
      "id_type": "passport",
      "id_number": "A12345678",
      "id_document_url": "https://cdn.example.com/docs/amara-passport-v2.jpg",
      "selfie_url": "https://cdn.example.com/docs/amara-selfie-v2.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"
    }
  }'