Handle Additional Verification
Use this page to handle step-up verification when an evaluation requires additional user input or identity verification.
Additional verification can take two forms:
For response handling patterns, see Handle Results.
Overview
RiskOS™ pauses an evaluation when additional verification is required.
Common signals:
- One-Time Passcode:
status = ON_HOLD,sub_status = Awaiting Customer OTP - Additional PII:
sub_status = More information needed - DocV: Evaluation paused and
data_enrichmentsincludes a DocV request (enrichment_provider = "SocureDocRequest")
Verification types
| Verification type | How to detect it | What your application should do |
|---|---|---|
| One-Time Passcode | status = ON_HOLD, sub_status = Awaiting Customer OTP, tags include OTP Triggered | Prompt for code and verify with PATCH. |
| Additional identity data | sub_status = More information needed, tags include Additional PII Requested | Collect identity data and PATCH. |
| Predictive DocV | Evaluation paused and data_enrichments includes a DocV request (enrichment_provider = "SocureDocRequest") | Launch DocV flow. |
Handle One-Time Passcode
When a One-Time Passcode challenge is triggered, your application must:
- Display a 6-digit One-Time Passcode input form.
- Allow the user to retry the code if needed (up to five attempts).
- Submit the code using
PATCH /api/evaluation/{eval_id}. - Route the user based on the updated evaluation response.
If the maximum number of attempts is reached, the evaluation will fail and return a REJECT decision.
For more information on One-Time Passcode scenarios, see the One-Time Passcode Integration Guide.
Verify the One-Time Passcode (PATCH)
PATCH)When the user enters the 6-digit code, your backend should verify it by making a PATCH request to the Evaluation endpoint with the mandatory fields.
Example request
curl -X PATCH "https://riskos.sandbox.socure.com/api/evaluation/{eval_id}" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"workflow": "non_hosted_advanced_pre_fill",
"id": "f0b3075b-0ae1-4130-9171-88d6c75a982c",
"timestamp": "2026-02-16T20:02:44.717Z",
"data": {
"individual": {
"otp": {
"code": "622123"
}
}
}
}'individual.otp fields
individual.otp fields| Field | Action | Description |
|---|---|---|
code | Verify | 6-digit One-Time Passcode entered by the user. |
resend | Resend | Set to true to resend the code. |
One-Time Passcode outcomes
After you submit the One-Time Passcode PATCH request, RiskOS™ returns an updated evaluation. Use status, decision, and tags to determine your next step.
| Outcome | decision | status | What to do |
|---|---|---|---|
| One-Time Passcode challenge still active | REVIEW | ON_HOLD | Prompt for One-Time Passcode again (retry up to 5 attempts). |
| One-Time Passcode verified, Prefill unlocked | REVIEW | ON_HOLD | Display prefilled data. Lock phone_number and date_of_birth. Collect remaining PII. |
| Evaluation fails | REJECT | CLOSED | Do not show prefill. Route to fallback. |
| Evaluation completes | ACCEPT | CLOSED | Continue onboarding. |
Tip:
Use tags such as
"OTP Approved","Prefill Successful", and"OTP Triggered"to guide your flow.
{
"eval_id": "8d455113-94f8-4bc2-82f6-e016e078f5dc",
"decision": "ACCEPT",
"status": "CLOSED",
"sub_status": "Accept",
"tags": [
"OTP Triggered",
"OTP Approved",
"Prefill Successful",
"Approved to Display the Prefill Data",
"Additional PII Requested"
]
}{
"eval_id": "8d455113-94f8-4bc2-82f6-e016e078f5dc",
"decision": "REVIEW",
"status": "ON_HOLD",
"sub_status": "More information needed",
"tags": [
"OTP Triggered",
"OTP Approved",
"Prefill Successful",
"Approved to Display the Prefill Data",
"Additional PII Requested"
]
}{
"eval_id": "8d455113-94f8-4bc2-82f6-e016e078f5dc",
"decision": "REJECT",
"status": "CLOSED",
"tags": [
"Phone - High Risk"
]
}Submit identity data
Submit identity data to continue the evaluation after:
- One-Time Passcode verification succeeds, or
- Prefill data is displayed, or
- The workflow requests additional PII
If Prefill data is returned, do not allow users to edit:
phone_numberdate_of_birth
Handle Additional Identity Data
When additional identity data is required:
sub_status = More information neededtagsincludeAdditional PII Requested
What to do
- Display full onboarding form.
- Collect identity data.
- Submit the data using
PATCH /api/evaluation/{eval_id}. - Continue evaluation
Handle Predictive Document Verification
When an evaluation pauses, RiskOS™ is waiting for physical evidence (ID and selfie) to finalize a decision.
Detect the Predictive Document Verification step-up
Look for:
- Status:
eval_statusis"evaluation_paused"(orstatusis"ON_HOLD"). - Provider:
data_enrichmentscontains an entry whereenrichment_provideris"SocureDocRequest".
Extract handoff assets
Locate the SocureDocRequest object and extract the following from response.data:
| Field | Purpose |
|---|---|
docvTransactionToken | Required. Pass this to your frontend to initialize the DocV SDK. |
url | Optional. Use for direct mobile redirects to the Capture App. |
qrCode | Optional. Base64 PNG for desktop-to-mobile handoff. |
Example response
{
"decision": "REVIEW",
"status": "ON_HOLD",
"eval_status": "evaluation_paused",
"data_enrichments": [
{
"enrichment_provider": "SocureDocRequest",
"response": {
"data": {
"docvTransactionToken": "70c6a4bc-f646-4c6a-94c1-9cd428e356ef",
"url": "https://verify.socure.com/..."
}
}
}
]
}Complete the handoff
If a token is present, your backend should:
- Persist the
eval_idand token for later correlation with the webhook result. - Send token to frontend.
- Transition the user to the identity verification UI to launch the SDK.
Launch the Document Verification Web SDK
The DocV Web SDK is a client-side JavaScript library that embeds the RiskOS™ document verification experience directly into your application.
It renders the Capture App, a secure mobile experience that guides the user through:
- Capturing a government-issued ID
- Taking a selfie
- Completing liveness verification
The Capture App UI is configurable from the DocV App page in the RiskOS™ Dashboard.
- Include the DocV Web SDK script in your application.
- Pass your SDK key (from the RiskOS™ Dashboard) and
docvTransactionTokentoSocureDocVSDK.launch().
<html>
<head>
<script src="https://websdk.socure.com/bundle.js"></script>
</head>
<body>
<button onclick="start()">Start Verification</button>
<div id="websdk"></div>
<script>
var config = {
onProgress: function (event) {
/* Called during capture */
},
onSuccess: function (response) {
/* Called on success */
},
onError: function (error) {
/* Called on error */
},
qrCodeNeeded: true, // Show QR code option
disableSmsInput: false, // Enable SMS input
closeCaptureWindowOnComplete: true, // Auto-close tab after document upload confirmation
autoOpenTabOnMobile: true, // Skip "Continue on New Tab" screen on mobile and launch Capture App in a new tab
};
function start() {
SocureDocVSDK.launch(
'SDKKey', // Replace with your SDK Key
'docvTransactionToken', // Replace with the docvTransactionToken
'#websdk',
config // optional
);
}
</script>
</body>
</html>When the user clicks Start ID Verification, the Capture App launches inside #websdk.
Depending on your integration workflow, the user can access the Capture App using:
- QR code (desktop → mobile handoff)
- Secure SMS link (desktop or mobile)
- Mobile redirect URL (if you choose to redirect directly using
response.data.url)
No resubmit: Treat DocV as a one-time step-up for the evaluation. If the step-up fails, RiskOS™ completes the evaluation and you should route the user to your fallback/manual flow (typically a final REJECT decision is delivered via webhook).
iOS and Android apps:
You can launch the Capture App by redirecting the user to the DocV URL returned in the Evaluation response.
data_enrichments[n].response.data.urlIf you include
data.individual.docv.config.redirect.urlin your Evaluation request, the user will be redirected back to your app after capture completes. See the integration guides for iOS Webview or Android Webview for advanced SDK configuration and mobile patterns.
Receive the final decision (Webhook)
After the Capture App flow completes, RiskOS™ resumes the paused evaluation asynchronously. The final result is delivered via a webhook event.
To receive the final decision, configure a webhook endpoint on the Developer Workbench > Webhooks page in the RiskOS™ Dashboard.
Final decision
DocV is asynchronous.
- Wait for updated evaluation or webhook.
- Route based on final
decision.
Key rules
- Treat One-Time Passcode and DocV as separate flows.
- Persist
eval_idacross all steps. - Do not resubmit DocV.
- Route using
decision,sub_status, andtags.
Summary
- Detect the verification type.
- Collect required input.
- Continue with
PATCHor DocV SDK. - Wait for final decision.
Updated 1 day ago
