curl -X POST "https://api.khaime.com/api/v1/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"
}
}'
curl -X POST "https://api.khaime.com/api/v1/merchants/456/kyc/resubmit" \
-H "X-API-Key: pk_sandbox_your_key" \
-H "Content-Type: application/json" \
-d '{
"return_url": "https://yourplatform.com/merchants/456/kyc-complete",
"refresh_url": "https://yourplatform.com/merchants/456/kyc"
}'
curl -X POST "https://api.khaime.com/api/v1/merchants/789/kyc/resubmit" \
-H "X-API-Key: pk_sandbox_your_key" \
-H "Content-Type: application/json" \
-d '{
"return_url": "https://yourplatform.com/merchants/789/kyc-complete",
"refresh_url": "https://yourplatform.com/merchants/789/kyc"
}'
Marketplace
Resubmit Merchant KYC
Resubmit a KYC application after rejection or resume Connect onboarding.
POST
/
merchants
/
{merchantId}
/
kyc
/
resubmit
curl -X POST "https://api.khaime.com/api/v1/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"
}
}'
curl -X POST "https://api.khaime.com/api/v1/merchants/456/kyc/resubmit" \
-H "X-API-Key: pk_sandbox_your_key" \
-H "Content-Type: application/json" \
-d '{
"return_url": "https://yourplatform.com/merchants/456/kyc-complete",
"refresh_url": "https://yourplatform.com/merchants/456/kyc"
}'
curl -X POST "https://api.khaime.com/api/v1/merchants/789/kyc/resubmit" \
-H "X-API-Key: pk_sandbox_your_key" \
-H "Content-Type: application/json" \
-d '{
"return_url": "https://yourplatform.com/merchants/789/kyc-complete",
"refresh_url": "https://yourplatform.com/merchants/789/kyc"
}'
Intro
Resubmits a KYC application for a sub-merchant after rejection, or hands back a fresh onboarding session for a merchant still completing Stripe Connect — one endpoint for both providers, mirroring Submit KYC.Context
This is the recovery path in the KYC lifecycle:submit → pending_review → rejected → resubmit → pending_review (or additional_info_requested → resubmit). Check Get KYC Status first so you know which branch applies before calling this endpoint.
| Provider | When it’s allowed | What happens |
|---|---|---|
| Khaime KYC | Status is rejected or additional_info_requested | Submits corrected documents; the same underlying record is updated in place |
| Stripe Connect | Any time there’s an existing Stripe account on file | Returns a new onboarding_url/client_secret to resume or update verification |
Hows
Path parameters
number
required
The ID of the sub-merchant.
Request body — Khaime KYC (African countries)
The shape mirrors Submit KYC’s structured format:id_country, account_type, owner, business (for registered businesses), and bank_account. Unlike submission, every field on resubmit is technically optional at the request-validation layer — but resubmission overwrites the stored record with whatever you send, so a partial owner object can leave previously-approved fields blank. Always send the complete corrected owner (and business, if applicable) object, not just the field the reviewer flagged.
Include
id_country in the body — it’s what signals this is a Khaime KYC resubmission rather than a Stripe resume request. Omitting it (even if you send owner/bank_account) can cause the request to be treated as a Stripe resume instead.Request body — Stripe Connect (everywhere else)
string
Where the merchant lands after completing Stripe onboarding. Optional — if omitted, Stripe falls back to its default session behavior. Still recommended so the merchant returns to your platform, not Khaime’s.
string
Where the merchant lands if the session expires or they exit early. Optional, for the same reason.
Unlike the initial Submit KYC call — where
return_url and refresh_url are required — they’re optional here. You don’t need to re-send country or any other Stripe fields; the existing submission on file drives the new session.Response — 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
}
}
Response — Stripe Connect
{
"success": true,
"message": "Continue your verification on the hosted flow.",
"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",
"publishable_key": "pk_test_..."
}
}
| Field | Description |
|---|---|
onboarding_url | Fresh URL to redirect the merchant to Stripe’s hosted onboarding |
client_secret + publishable_key | Fresh credentials for Stripe Connect Embedded Components |
stripe_account_id | The existing Stripe Connect account ID — resubmission never creates a new one |
Error cases
| Status | Error | Fix |
|---|---|---|
400 | No KYC submission found. Use /kyc/submit to start. | Use Submit KYC for first-time submission |
400 | KYC is already approved. | No resubmission needed — the merchant is already verified |
400 | Can only resubmit after rejection or when additional info is requested. | Only Khaime KYC in rejected or additional_info_requested status can resubmit — check status first |
400 | New KYC documents are required for resubmission. | Include the corrected KYC data in the body |
400 | Stripe account not found. Please contact support. | The merchant has no Stripe Connect account on file — contact support |
401 | Missing or invalid X-API-Key header | Include a valid Partner API key |
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 |
400 business-rule errors above are surfaced with error_code: INTERNAL_ERROR today, regardless of the underlying cause — don’t rely on error_code alone to distinguish between them; match on the message text as well until this API area’s error codes are refined further.
curl -X POST "https://api.khaime.com/api/v1/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"
}
}'
curl -X POST "https://api.khaime.com/api/v1/merchants/456/kyc/resubmit" \
-H "X-API-Key: pk_sandbox_your_key" \
-H "Content-Type: application/json" \
-d '{
"return_url": "https://yourplatform.com/merchants/456/kyc-complete",
"refresh_url": "https://yourplatform.com/merchants/456/kyc"
}'
curl -X POST "https://api.khaime.com/api/v1/merchants/789/kyc/resubmit" \
-H "X-API-Key: pk_sandbox_your_key" \
-H "Content-Type: application/json" \
-d '{
"return_url": "https://yourplatform.com/merchants/789/kyc-complete",
"refresh_url": "https://yourplatform.com/merchants/789/kyc"
}'
Whys
One resubmit endpoint instead of separate rejection-fix and Stripe-resume routes. Both cases are “the merchant needs another pass at verification” — collapsing them keeps your integration from needing to track which provider a merchant is on before deciding which endpoint to call. Resubmission updates a record in place rather than creating a fresh one for Khaime KYC. A rejected submission’s row is reused when you resubmit, so the merchant keeps one continuous verification history (with the rejection reason preserved) rather than accumulating disconnected rows per attempt. Stripe resumes reuse the same connected account. Recreating a Stripe Connect account on every resume would orphan the original account and lose any progress the merchant already made — the resume path always targets the existingstripe_account_id.
Why nots
- Not for approved merchants. If KYC is already
approved, this endpoint refuses the request — use Update Merchant Payout to change bank details on an approved merchant instead. - Not for first-time submissions. If there’s no submission on file yet, this returns an error telling you to use Submit KYC.
- Partial payloads are risky, not recommended. The API doesn’t enforce a fully-populated
owner/businessobject on resubmit the way it does on initial submission, but omitting fields doesn’t necessarily preserve the previous values. Treat resubmission as “send the complete, corrected record,” not “send a diff.” - Doesn’t retry review automatically. A resubmission goes back into the same queue as a fresh submission — there’s no fast-track for merchants who’ve been rejected before.
