curl --request POST \
--url https://sg.sandbox.api.reap.global/users/{id}/application \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Reap-Version: <reap-version>' \
--data '
{
"method": "MANAGED_KYC"
}
'const options = {
method: 'POST',
headers: {
'Reap-Version': '<reap-version>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({method: 'MANAGED_KYC'})
};
fetch('https://sg.sandbox.api.reap.global/users/{id}/application', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sg.sandbox.api.reap.global/users/{id}/application"
payload = { "method": "MANAGED_KYC" }
headers = {
"Reap-Version": "<reap-version>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"status": "NOT_STARTED",
"nextAction": {
"type": "PROVIDER_SDK",
"provider": "SUMSUB",
"sdkToken": "_act-sbx-abc123-xyz789"
},
"provider": "sumsub",
"sdkToken": "_act-sbx-abc123-xyz789"
}{
"error": {
"code": "INVALID_APPLICATION_STATUS",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "VERIFICATION_METHOD_NOT_ENABLED",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "USER_NOT_FOUND",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "USER_APPLICATION_FINALIZING",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "SUMSUB_APPLICANT_NOT_APPROVED",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "<string>",
"detail": {}
}
}Advance the user application
Advances the user KYC application. Only valid while the application is in a pending state. Which verification method applies is fixed by your project configuration rather than chosen per request, and determines the request you send. With no body (Reap-run verification), Reap returns a provider SDK token in nextAction for the client to complete and approval arrives later via webhook. For Sumsub Token Sharing, a share token is ingested and the user moves to IN_REVIEW; the final decision arrives on the same compliance webhook as Managed KYC. For a full verified data pack, the response nextAction lists the supporting documents to upload via POST /users/:id/application/documents. Send an Idempotency-Key to safely retry without re-consuming a single-use share token.
curl --request POST \
--url https://sg.sandbox.api.reap.global/users/{id}/application \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Reap-Version: <reap-version>' \
--data '
{
"method": "MANAGED_KYC"
}
'const options = {
method: 'POST',
headers: {
'Reap-Version': '<reap-version>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({method: 'MANAGED_KYC'})
};
fetch('https://sg.sandbox.api.reap.global/users/{id}/application', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://sg.sandbox.api.reap.global/users/{id}/application"
payload = { "method": "MANAGED_KYC" }
headers = {
"Reap-Version": "<reap-version>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"status": "NOT_STARTED",
"nextAction": {
"type": "PROVIDER_SDK",
"provider": "SUMSUB",
"sdkToken": "_act-sbx-abc123-xyz789"
},
"provider": "sumsub",
"sdkToken": "_act-sbx-abc123-xyz789"
}{
"error": {
"code": "INVALID_APPLICATION_STATUS",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "VERIFICATION_METHOD_NOT_ENABLED",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "USER_NOT_FOUND",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "USER_APPLICATION_FINALIZING",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "SUMSUB_APPLICANT_NOT_APPROVED",
"message": "<string>",
"detail": {}
}
}{
"error": {
"code": "SERVICE_UNAVAILABLE",
"message": "<string>",
"detail": {}
}
}Authorizations
API key as Bearer token
Headers
API version (YYYY-MM-DD)
2025-02-14 "2025-02-14"
Unique key for safely retrying this request. Up to 255 characters; we recommend a UUIDv4. The first request executes and its response is cached; subsequent requests with the same key replay the cached response (24h retention).
1 - 255Path Parameters
User ID
Body
How to advance the KYC application. The accepted methods depend on the project KYC verification method; each method is a distinct variant selected by the method field.
- Managed KYC
- Sumsub Token Sharing
- Universal KYC
- KYC Attestation
"MANAGED_KYC"Response
Application state after advancing
Current KYC application status
NOT_STARTED, AWAITING_DOCUMENTS, IN_REVIEW, APPROVED, REJECTED, RETRY_REQUIRED "NOT_STARTED"
Action the client must take next, or null if none remains
- ProviderSdk
- DocumentUpload
Show child attributes
Show child attributes
Deprecated: use nextAction.provider. Populated only when nextAction.type is PROVIDER_SDK.
"sumsub""sumsub"
Deprecated: use nextAction.sdkToken. Populated only when nextAction.type is PROVIDER_SDK.
"_act-sbx-abc123-xyz789"