Handle DocV and Final Decision

Step 1: Detect Document Verification

Use this guide to handle Document Verification when an evaluation pauses for document capture before RiskOS™ returns a final decision.

Identify Document Verification by checking for all of the following in the evaluation response:

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/..."
        }
      }
    }
  ]
}

What to do:

  1. Locate the SocureDocRequest object in data_enrichments.
  2. Extract docvTransactionToken from response.data.
  3. Persist the eval_id and docvTransactionToken.
  4. Send the token to your frontend and launch DocV.
  5. Wait for the final terminal result (ACCEPT or REJECT) via webhook or updated evaluation.

Step 2: Launch the DocV 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:

The Capture App UI is configurable from the DocV App page in the RiskOS™ Dashboard.

  1. Include the DocV Web SDK script in your application.
  2. Pass your SDK key (from the RiskOS™ Dashboard) and docvTransactionToken to SocureDocVSDK.launch().

HTML

<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>

Handoff options

Depending on your integration pattern, users can access the Capture App using:

  1. QR code for desktop-to-mobile handoff
  2. Secure SMS link for desktop or mobile
  3. Mobile redirect URL using response.data.url

No retry or resubmit

Document Verification runs once per evaluation. To retry Document Verification, create a new evaluation.

The following conditions result in a REJECT decision:

Step 3: Receive the final decision

DocV is asynchronous. After the Capture App flow completes, RiskOS™ resumes the paused evaluation and returns the final result.

To receive the final decision by webhook, configure a webhook endpoint on the Developer Workbench > Webhooks page in the RiskOS™ Dashboard.

Final routing

After DocV completes:

Routing outcomes:

Example routing logic

TypeScript

if (data.decision === "ACCEPT") {
  router.push("/success");
}

if (data.decision === "REJECT") {
  router.push("/review");
}

Key takeaways

Error handling

If the API returns an HTTP error (4xx or 5xx), your application should handle it before processing any evaluation logic.

Status code Meaning What to do
400 Bad request — missing or invalid fields Check request body against required fields.
401 Unauthorized — invalid or missing API key Verify your Authorization header.
404 Not found — invalid eval_id or endpoint Confirm the eval_id and endpoint URL.
429 Rate limited Back off and retry after the Retry-After header value.
500 Internal server error Retry with exponential backoff (max three attempts).

Store required data

Persist these fields for tracking and reconciliation:

Field Description
id Unique identifier for the request
eval_id Evaluation identifier
decision Final decision outcome (ACCEPT or REJECT; initial REVIEW is non-terminal)
status Overall request status
eval_status Evaluation processing status
workflow Workflow name