Read the status
Every KYC response is the same object with exactly onestatus:
Option A: hosted (recommended)
Whenever the status is actionable, hand the user theiframe_url. The hosted page collects whatever the verification still needs, documents, typed details, the face scan, and no identity data passes through your servers. Open it in a new tab, a WebView, or embed it.
The link is short-lived. Always surface the one from your freshest status read or identity.verification.updated event rather than storing it.
Option B: your own UI
Drive the upload endpoints from your own screens and use the hosted page only for the face scan.POST /api/v2/kyc/documents/frontandPOST /api/v2/kyc/documents/backwith the ID images. The back-of-ID response is the branch point:needs_information,requires_verification, orrejected. It also returnsextractedfields to prefill your form andwarningsyou can show the user.POST /api/v2/kyc/informationwith therequired_fieldsthe review asked for.- At
requires_verification, show theiframe_urlfor the face scan.
Learn the outcome
Subscribe toidentity.verification.updated on a webhook endpoint, or poll GET /api/v2/kyc. Treat the webhook as the record and the conversation as a claim: the user saying “done” is not approved.
Already verified them elsewhere?
If you run your own KYC on Sumsub, share the applicant with a one-time token and the user skips document capture and the face scan entirely:needs_information for a residential address. Ask us to enable sharing for your organization.
Sandbox
Sandbox verifications never reach a reviewer. They report onlyrequires_verification, pending, approved, or rejected, and the iframe_url is a test-mode chooser. Drive the outcome yourself:
outcome is approved, rejected, or requires_input (a retryable bounce back to requires_verification). Re-simulating overwrites the previous outcome, so one test user can walk every path. Live tokens are refused with 403 sandbox_only.