Submit a participant for KYC and handle each of the four outcomes: instant approval, document verification, manual review, and rejection.
BETA — SUBJECT TO CHANGE. This API is in beta and may change without notice.
POST /v1/kyc/start is the primary endpoint for onboarding. You submit the participant’s identity data (optionally with a Socure Digital Intelligencesession_token), and the response tells you which of the four outcomes applies.
The response’s status object carries decision, status, subStatus, and externalId. Together with the presence of a docv object, the synchronous response indicates the path:
decision
docv present
Meaning
ACCEPT / APPROVED
No
Approved — provisioning runs (often asynchronously; see below)
REVIEW
Yes
Document verification — direct the participant to docv.url or the SDK
REVIEW
No
Manual compliance review — inform the participant to wait
RESUBMIT
No
Participant must resubmit documents
REJECT
No
Rejection — no account created
Treat decision / status / subStatus as informational, not control flow. These values are passed through from the verification provider and the provider may emit values beyond the set above. Key your logic off the docv presence for the synchronous step and off the webhookevent_type / status (kyc.approved / kyc.rejected) for the terminal outcome.
The most common path. Note that approval is asynchronous even when the decision is instant: a successful POST /v1/kyc/start may return a non-terminal status while backend account provisioning completes in the background. participantId is often empty on this response — you learn the final values from the kyc.approved webhook and from a later GET /v1/kyc/status read.
You send snake_case, but REST responses come back in camelCase (protobuf JSON naming) — e.g. externalId, participantId. See Field naming.
Automatic provisioning. On approval, Polymarket US automatically creates the participant’s trading identity and account — there is no separate account-creation step (see Onboard Participants). Because provisioning is asynchronous, wait for the webhook (or a populated participantId from status) before enabling trading rather than assuming the start response carries it.
Which field identifies the participant when you trade? Use participantId (the webhook calls the same value provisioned_participant) as the x-participant-id header — that is who the order is for, and the only provisioning identifier you need. Your externalId is your reference only and is never sent to identify the participant. See Using these identifiers to trade.
When Socure can’t verify from the submitted data alone, the response includes a docv object. Detect it by the presence of a non-empty docv field (with decision: "REVIEW").
Redirect or embed for browser-based document upload
qrCode
Base64 PNG — display on desktop for mobile handoff
docvTransactionToken
Launch token for the Socure mobile SDK
sdkKey
Public key to initialise the Socure mobile SDK
eventId
Socure event identifier
You can direct the participant three ways — a web URL, a QR code for desktop→mobile handoff, or the native Socure SDK. Document capture is fully handled by Socure’s UI; you don’t build capture logic yourself.
The SDK onSuccess callback (or completing the web upload) only means the participant submitted documents — not that they were approved. After submission, await the kyc.approved webhook or poll GET /v1/kyc/status.
After the participant completes DocV, Socure notifies Polymarket US, which provisions the account (on approval) and sends you the final-decision webhook.
If Socure can’t make a determination and no DocV path is available, the response is REVIEW/OPENwith no docv field. The Polymarket US compliance team reviews the case.
Tell the participant their application is under review (typically 1–2 business days) and await the webhook. Implement the polling fallback for resilience.
Poll the current status with the external_id you submitted. The response mirrors the start response, including participantId once provisioned.
GET /v1/kyc/status?external_id=your-internal-user-id-123
Partner-relevant status.status values:
status.status
Meaning
OPEN
In progress (for example, manual review)
REVIEW / IN REVIEW
Under review
ON_HOLD
Non-terminal provider status (for example, an instant approval while provisioning completes, or a document-upload step)
CLOSED
Terminal — check decision
Values are passed through from the verification provider and may extend beyond this set. Use a populated participantId (and the webhook) as your signal that the participant is ready to trade — not a specific status string.
external_id is idempotent. Re-submitting POST /v1/kyc/start for a participant who already passed KYC returns 409 ALREADY_EXISTS. Handle it by fetching the existing status rather than treating it as an error.
Prefer webhooks over polling. As a fallback, poll GET /v1/kyc/status every 5–10 seconds for up to 5 minutes after DocV submission. For manual-review cases, poll on a longer cadence (e.g. every 30 minutes for up to 2 business days) and notify the participant asynchronously.