Documentation Index
Fetch the complete documentation index at: https://docs.polymarket.us/llms.txt
Use this file to discover all available pages before exploring further.
The verification flow is the core KYC process that validates a user’s identity. This can be started after prefill or directly with user-provided information.
Starting Verification
Request
{
"userId": "user_123",
"firstName": "John",
"middleName": "Michael",
"lastName": "Doe",
"email": "john.doe@example.com",
"phoneNumber": "+15551234567",
"dateOfBirth": "1990-01-15",
"ssn": "123-45-6789",
"address": {
"addressLine1": "123 Main Street",
"addressLine2": "Apt 4B",
"city": "New York",
"state": "NY",
"postalCode": "10001",
"country": "US"
},
"sessionToken": "session_abc",
"agreementTime": "2024-01-15T10:30:00Z",
"referralCode": "REF123",
"ipAddress": "192.168.1.1"
}
Request Fields
| Field | Type | Required | Description |
|---|
userId | string | Yes | Your internal user identifier |
firstName | string | Yes | Legal first name |
middleName | string | No | Middle name |
lastName | string | Yes | Legal last name |
email | string | Yes | Email address |
phoneNumber | string | Yes | Phone number with country code |
dateOfBirth | string | Yes | Date of birth (YYYY-MM-DD) |
ssn | string | Yes | Social Security Number |
address | object | Yes | Residential address |
sessionToken | string | Yes | Session token |
agreementTime | datetime | Yes | When user agreed to terms |
referralCode | string | No | Referral code if applicable |
ipAddress | string | No | User’s IP address |
Address Object
| Field | Type | Required | Description |
|---|
addressLine1 | string | Yes | Street address |
addressLine2 | string | No | Apt/Suite/Unit number |
city | string | Yes | City |
state | string | Yes | State (2-letter code) |
postalCode | string | Yes | ZIP/Postal code |
country | string | Yes | Country code (e.g., “US”) |
Response
When document verification is required:
{
"status": {
"decision": "REVIEW",
"status": "ON_HOLD",
"subStatus": "Document Request Initiated",
"externalId": "user_123"
},
"docv": {
"sdkKey": "a0a1869f-cf3e-4acb-919a-62b9fef30e3f",
"docvTransactionToken": "token_xyz",
"eventId": "event_123",
"qrCode": "data:image/png;base64,...",
"url": "https://verify.example.com/session/abc123"
}
}
Verification Outcomes
Instant Approval
If the identity can be verified immediately:
{
"status": {
"decision": "ACCEPT",
"status": "CLOSED",
"subStatus": "",
"externalId": "user_123"
},
"participantId": "firms/ISV-Participant-Acme/users/user_123",
"account": "firms/ISV-Acme/accounts/a1b2c3d4e5f6"
}
Automatic User ProvisioningWhen a user receives decision: "ACCEPT", the system automatically:
- Creates an EP3 participant for the user
- Provisions a trading account
- Returns the
participantId and account identifiers in the response
Use these identifiers for subsequent trading API calls. There is no separate account creation step required. The user can proceed directly to funding after KYC approval.
Document Verification Required
If additional documents are needed, the response includes DocV details:
| Field | Description |
|---|
sdkKey | Socure SDK public key for initializing the DocV SDK |
docvTransactionToken | Session token passed to the SDK’s launch() method |
eventId | Event tracking identifier |
qrCode | Base64-encoded QR code image for mobile scanning |
url | Direct URL for web-based document upload |
Socure SDK Integration
For native mobile document capture, integrate the Socure DocV SDK:
- Initialize the SDK with
sdkKey
- Launch verification with
docvTransactionToken
- Poll
/v1/kyc/status or use webhooks to get the final decision
Socure SDK Documentation:
Alternative: Web-Based Verification
If not using the SDK, users can complete document verification via:
- QR Code - User scans QR code with mobile device to capture documents
- Direct URL - User opens URL on any device to upload documents
Checking Status
Poll the status endpoint to track verification progress. Use the user_id you provided in the start request:
GET /v1/kyc/status?externalId=user_123
Response when KYC is pending (documents required):
{
"status": {
"decision": "REVIEW",
"status": "ON_HOLD",
"subStatus": "Document Request Initiated",
"externalId": "user_123"
},
"participantId": "",
"account": ""
}
Response when KYC is approved:
{
"status": {
"decision": "ACCEPT",
"status": "CLOSED",
"subStatus": "",
"externalId": "user_123"
},
"participantId": "firms/ISV-Participant-Acme/users/user_123",
"account": "firms/ISV-Acme/accounts/a1b2c3d4e5f6"
}
Response when user hasn’t started KYC:
{
"status": {
"decision": "",
"status": "NOT_STARTED",
"subStatus": "",
"externalId": "user_123"
},
"participantId": "",
"account": ""
}
Status Values
Decision
| Value | Description |
|---|
ACCEPT | Identity verified successfully |
REJECT | Verification failed |
REVIEW | Verification in progress, may require action |
| (empty) | KYC not started |
Status
| Value | Description |
|---|
NOT_STARTED | User has not initiated KYC |
OPEN | Verification in progress with Socure |
ON_HOLD | Waiting for user to upload documents (DocV) |
CLOSED | Final decision reached (check decision field) |
SubStatus
| Value | Description |
|---|
pending | Waiting for Socure decision |
Document Request Initiated | User must complete document verification |
| (empty) | No additional status info |
Integration Flow
Best Practices
- Validate input before submission - Check all required fields
- Use webhooks if available - Don’t rely solely on polling
- Handle all decision states - Show appropriate UI for each
- Store externalId - You’ll need it to check status later
- Implement retry logic - API calls may occasionally fail
- Log all responses - For debugging and compliance