Skip to main content
Before you can issue a card, every applicant must pass two checks. Apocor orchestrates both — you never integrate with the card program or identity vendors directly.
status: APPROVED alone is not enough to issue cards. You must also wait for issuerKycReady: true. Card issuance returns ISSUER_KYC_INCOMPLETE otherwise.

Choose an integration

Options A and B never send passports or selfies to Apocor. The identity provider issues a share token; Apocor forwards that token to the card program. Option C is the exception: you upload JPEG/PNG/WEBP/PDF images to a short-lived URL. Apocor stores them only long enough to submit them to the card program.

Get your integration settings

cURL
Test vs live (same host): both use https://api.apocor.ai. Test keys get sumsubWebhookUrl/v1/webhooks/sumsub-sandbox; live keys → /v1/webhooks/sumsub. Register the Sumsub sandbox app against the sandbox path and the Sumsub production app against the live path.
Sumsub webhooks: use the URL from GET /v1/kyc/config (sumsubWebhookUrl). After the hosted widget completes, Sumsub webhooks update tenant status and queue issuer handoff automatically; POST /v1/applicants/{id}/submit is a fallback. Poll GET …/kyc-status for issuer progress. See Webhooks.

Option A — Apocor-hosted verification

Best when you don’t run your own Sumsub (or similar) account. Apocor hosts the widget and handles issuer handoff automatically.
1

Create an applicant

cURL
2

Start a verification session

cURL
Response includes accessToken (for embedding the WebSDK) and verificationUrl (a direct Sumsub link you can email or open in a browser). externalUserId is the Apocor applicant id.
3

User completes the widget

When verification succeeds in the widget, call POST /v1/applicants/{id}/submit to sync tenant status and queue issuer handoff (returns immediately — no long HTTP wait). With SUMSUB_WEBHOOK_MODE=apocor, Sumsub also posts to POST /v1/webhooks/sumsub, which triggers the same background handoff when review is GREEN.
4

Confirm issuer readiness

cURL
Poll until issuerKycReady is true (issuer handoff runs in the background worker; issuer webhooks can also advance status). Then create a cardholder and issue a card.
POST /v1/applicants/{id}/submit returns as soon as tenant KYC is synced. Do not expect issuerKycReady: true in the same response — poll GET …/kyc-status every few seconds until ready.

Option B — Bring your own identity provider (BYOK)

Best for regulated companies that already run their own Sumsub (or compatible) environment. You never use Apocor’s hosted widget.
1

Create an applicant in Apocor

Save the returned id — you will use it as externalUserId in your identity provider.
2

Verify the user in your provider

Run your existing KYC flow. Set externalUserId to the Apocor applicant id so records stay linked.
3

Generate a share token

Call your provider’s share-token API with:
  • Applicant id — from your provider
  • RecipientshareRecipientId from GET /v1/kyc/config (Apocor’s id, not the card issuer)
Example (Sumsub):
Apocor imports the shared verification and forwards it to the card program internally. The token expires quickly (typically ~10 minutes). Generate it immediately before calling Apocor.
4

Submit the token to Apocor

cURL
5

Poll until ready

cURL
Issue cards only when issuerKycReady is true.
BYOK tenants do not need Apocor-hosted verification credentials. They only need an Apocor API key and the shareRecipientId from /v1/kyc/config.

Option C — Direct document upload

Best when you already collect ID images in your own app and do not run an identity-provider widget. Confirm issuerDirectAvailable is true on GET /v1/kyc/config before starting.
Direct KYC requires a live card-program environment and document storage. It is not available on mock/sandbox-only keys. Check issuerDirectAvailable first.
Required documents: Accepted files: JPEG, PNG, WEBP, or PDF, 8 MB or smaller. The PUT URL expires in 300 seconds.
1

Create an applicant

The applicant must have an email. Save the returned id.
2

Presign each document

cURL
Response includes uploadUrl and key. Repeat for selfie and id_back (if required).
3

PUT the file to the presigned URL

cURL
Content-Type on the PUT must match the contentType you presigned.
4

Confirm the upload

cURL
5

Submit identity fields

cURL
idType must be one of: CN-RIC, PASSPORT, HK-HKID, DLN, Government-Issued ID Card, EU Residency Permit, UAE Residency Permit. gender is M or F. Dates are YYYY-MM-DD. US addresses require a 9-digit ssn.
6

Poll until ready

cURL
Issue cards only when issuerKycReady is true.

Applicant response fields

Every applicant includes white-labeled issuer fields:

Endpoints summary


Troubleshooting

See Error codes for the full list of error.code values.

Next steps

Applicants

Applicant lifecycle and statuses

Cards

Issue cards after issuer KYC is ready

Quickstart

End-to-end sandbox walkthrough

API Reference

Try endpoints in the playground