Integration Guide

Learn how to integrate Document Verification (DocV) + Watchlist in RiskOS™. This guide walks through generating an evaluation, embedding the Capture App, and handling final onboarding decisions.

Start building

Before you start

Before you begin your implementation, ensure you have the following ready:

Obtain your API and SDK key from the Developer Workbench > API & SDK Keys page in the RiskOS™ Dashboard.
Use the Sandbox base URL riskos.sandbox.socure.com for all requests.
Register your webhook endpoint to receive asynchronous evaluation_completed events.

Postman Collection

The following Postman collection can be used to test the Document Verification (DocV) + Watchlist solution with the Evaluation endpoint.



Integration flow

This integration enables you to verify users are real people using a government-issued ID scan, a selfie, and automated sanctions screening.

  • Government ID + selfie verification: Users complete a secure document capture flow to validate their identity
  • Fraud detection: Catch fake IDs, deepfakes, and stolen documents
  • Automated sanctions screening: Screen verified identities against global watchlists
  • Global coverage: Accept government-issued IDs from 195+ countries
sequenceDiagram
    autonumber
    participant User as End User
    participant App as Your Platform
    participant Socure as Socure

    User->>App: Attempt action to trigger DocV
    App->>Socure: POST /api/evaluation with PII and DocV settings
    Socure-->>App: Respond w/ transaction token
    App-->>User: Show Web SDK to prompt document capture
    
    User->>Socure: Submit document images and selfie to Socure
    
    activate Socure
    Note over Socure: Process submission, run document verification & watchlist screening
    Socure-->>App: Final decision (APPROVE / REJECT)
    deactivate Socure

    App-->>User: Show Onboarding Result

How it works

  1. Set up your environment

    Before integrating, configure your backend environment to handle secure REST API requests. Your server is responsible for all communication with RiskOS™ to ensure your SOCURE_API_KEY is never exposed to the client.


    Integration architecture

    • Backend: Communicates with RiskOS™ via REST API (cURL) using your secret API Key.
    • Frontend: Collects user Identity data (PII) while simultaneously generating device risk telemetry through the Digital Intelligence SDK and the Predictive DocV SDK.
    • Security: All identity data processing must happen server-to-server.

    Configure your keys

    Retrieve your credentials from the Developer Workbench.


    KeyFormatPurpose
    API keyBearer <key>Secret. Used in server-side cURL headers for authentication.
    SDK keyStringPublic. Used in your frontend to initialize the Digital Intelligence and DocV SDKs.
    Workflow nameStringConfiguration. The unique ID from the Workflows page in RiskOS™. Must be included in the "workflow" field of your API request payload.

    Set environment variables

    Store these variables securely on your server. Always use the Sandbox URL for testing.


    # Server-side Environment Variables
    SOCURE_API_KEY="your_api_key_here"
    SOCURE_BASE_URL="https://riskos.sandbox.socure.com"
    SOCURE_WORKFLOW_NAME="your_workflow_name_here"
  2. Set up the Digital Intelligence session token

    Before submitting an evaluation, generate a device-specific di_session_token. This short-lived token helps verify device integrity and is required for certain RiskOS™ evaluations.


    1. Install the Digital Intelligence SDK

    Add the Digital Intelligence Web SDK to your project using npm:


    npm install --save @socure-inc/device-risk-sdk

    2. Initialize the SDK once per session

    Mount the SocureInit component in a high-level file (such as layout.tsx) to initialize the SDK once per session. This prevents redundant re-initialization during navigation.


    "use client";
    
    import { useEffect, useRef } from "react";
    import { SigmaDeviceManager, SigmaDeviceOptions } from "@socure-inc/device-risk-sdk";
    
    export function SocureInit() {
      const initializedRef = useRef(false);
    
      useEffect(() => {
        if (initializedRef.current) return;
        const sdkKey = process.env.NEXT_PUBLIC_SOCURE_SDK_KEY;
    
        if (sdkKey) {
          SigmaDeviceManager.initialize({ sdkKey } as SigmaDeviceOptions);
          initializedRef.current = true;
        }
      }, []);
    
      return null;
    }

    3. Generate a session token

    Immediately before submitting a form to your backend, call getSessionToken(). Include the resulting string in your API request payload as the di_session_token field.


    // Call this inside your form submission handler
    export async function getSessionToken() {
      return SigmaDeviceManager.getSessionToken();
    }
  3. Retrieve and verify identity data

    Use the DocV & Watchlist workflow to retrieve verified PII while minimizing user friction. This workflow is asynchronous.


    1. Collect required input

    Your application must collect the following minimum required fields before initiating the workflow:


    • given_name
    • family_name
    • phone_number
    • address.country

    Tip: Adding additional personally identifiable information (PII) can improve match accuracy.


    2. Create an evaluation (POST)

    Send a POST request to the Evaluation endpoint using the DocV & Watchlist workflow. This initiates the identity lookup.


    • Endpoint:POST /api/evaluation

    curl --location --request POST 'https://riskos.sandbox.socure.com/api/evaluation' \
    --header 'Content-Type: application/json' \
    --header 'Accept: application/json' \
    --header 'Authorization: Bearer YOUR_API_KEY' \
    --data-raw '{
        "id": "APP-123456",
        "timestamp": "2025-07-31T15:00:10.761Z",
        "workflow": "docv_watchlist",
        "data": {
            "individual": {
                "given_name": "John",
                "family_name": "Smith",
                "date_of_birth": "1989-05-07",
                "phone_number": "+19998887777",
                "address": {
                    "line_1": "1234 N College Ave",
                    "locality": "New York City",
                    "major_admin_division": "NY",
                    "country": "US",
                    "postal_code": "10001"
                },
                "docv": {
                    "config": {
                        "document_type": "license",
                        "send_message": true,
                        "language": "en-us",
                        "redirect": {
                            "method": "POST",
                            "url": "https://example.com/docv"
                        }
                    }
                },
                "di_session_token": "eyJraWQiOi_di_token"
            }
        }
    }'        

    Top-level fields

    FieldTypeRequiredDescriptionExample
    idStringRequiredRequired. Customer-defined unique identifier for the request. This value must be unique for each evaluation. Reusing an ID causes RiskOS™ to treat the request as a re-run and can impact processing behavior, results, and downstream workflows."fb428165-6a1c-4d36-afbc-c8a946c1287d"
    timestampString <Date-Time>RequiredRFC 3339 timestamp indicating when the evaluation request was initiated by your system."2026-02-17T14:22:06.628Z"
    workflowStringRequiredYour environment-specific workflow identifier. You can find this value in the RiskOS™ Dashboard > Developer Workbench > Integration Checklist."KYC & Watchlist Screening: Direct API Integration"
    dataObjectRequiredMain payload containing consumer information, device data, and event details for evaluation.
    individualObjectRequiredPrimary identity object containing individual's information.See individual schema below.

    individual fields

    Including as much personally identifiable information (PII) as possible is strongly encouraged. Providing PII supports consent audits and consumer data requests, and it also improves match accuracy and overall verification performance.

    FieldTypeRequiredDescriptionExample
    given_nameStringRequiredFirst name"John"
    family_nameStringRequiredLast name"Smith"
    date_of_birthStringRequiredDate of birth (YYYY-MM-DD)"1989-05-07"
    phone_numberStringRequiredPhone number in E.164 format"+19998887777"
    addressObjectRequiredConsumer addressSee address schema below.
    docvObjectConditionalDocV configuration and capture settingsSee docv schema below.

    address fields

    FieldTypeRequiredDescriptionExample
    line_1StringOptionalStreet address line 1"1234 N College Ave"
    line_2StringOptionalStreet address line 2"Apt 3C"
    localityStringOptionalCity"New York City"
    major_admin_divisionStringOptionalState/province or region (ISO 3166-2)"NY"
    postal_codeStringOptionalZIP or postal code"10001"
    countryStringRequiredISO 3166-1 alpha-2 country code"US"

    docv fields

    Use the fields in the table below to configure Predictive DocV in your workflow.

    FieldTypeRequiredDescriptionExample
    configObjectOptionalConfiguration options controlling Capture App behavior and document verification flow for a given transaction.See config schema below.
    send_messageBooleanOptionalSet to true to send an SMS to the provided phone number with the document request URL. Defaults to false.

    - US & Canada: sent from short code 33436
    - Other countries: sent from +1 (510) 330-19xx
    true
    languageStringOptionalDetermines Capture App UI language. Defaults to en-us."en-us"
    use_case_keyStringOptionalDeploys a specific Capture App flow created in RiskOS™. Defaults to the account’s default flow or the flow configured in the RiskOS™ workflow."default_capture_flow"
    redirectObjectOptionalObject containing post-capture redirect behavior.See redirect schema below.
    redirect.methodStringConditionalRequired if redirect is provided. Accepts GET or POST."POST"
    redirect.urlStringConditionalRequired if redirect is provided. The destination URL to send the consumer after capture. Can include query strings for transaction tracking."https://example.com/docv"
    document_typeStringOptionalRestrict to a single document type (license or passport) for a simplified flow. Users skip the document type selection screen when passed."license"
  4. Handling Step-Up: Triggering Document Verification

    When an evaluation pauses, RiskOS™ is waiting for physical evidence (ID and selfie) to finalize a decision.


    1. Detect the Pause

    Identify a Step-Up trigger by monitoring for these specific values in the API response:

    • Status: eval_status is "evaluation_paused" (or status is "ON_HOLD").
    • Provider: data_enrichments contains an entry where enrichment_provider is "SocureDocRequest".

    2. Extract Handoff Assets

    Locate the SocureDocRequest object and extract the following from response.data:


    FieldPurpose
    docvTransactionTokenRequired. Pass this to your frontend to initialize the DocV SDK.
    urlOptional. Use for direct mobile redirects to the Capture App.
    qrCodeOptional. Base64 PNG for desktop-to-mobile handoff.

    {
      "eval_id": "500c6b88-9f5c-4d62-9422-163a59a343fe",
      "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/#/dv/70c6a4bc-f646-4c6a-94c1-9cd428e356ef"
            }
          }
        }
      ]
    }

    3. Complete the Handoff

    If a token is present, your backend should:

    1. Persist the eval_id and token for later correlation with the webhook result.
    2. Return the token to your client-side application.
    3. Transition the user to the identity verification UI to launch the SDK.

    Response schema

    Top-level fields
    FieldTypeDescriptionExample
    idStringYour original request id, echoed back in the response."DOCV-CASE-001234"
    eval_idString (UUID)Internally generated for each evaluation; required for GET/PATCH requests."e5c3b4b2-9e0f-44f2-9c6f-0a3a5f2b7b61"
    decisionStringFinal decision — PASS, REVIEW, or FAIL."REVIEW"
    statusStringCase status in RiskOS™ — OPEN, CLOSED, or ON_HOLD."ON_HOLD"
    eval_statusStringProcessing state — evaluation_paused indicates Step-Up is required."evaluation_paused"
    tagsArrayLabels explaining the decision (e.g., "Document Verification Triggered").["Document Verification Triggered"]

    data_enrichments fields
    FieldTypeDescriptionExample
    enrichment_nameStringName of the enrichment product."Socure DocV"
    enrichment_providerStringProvider identifier. Look for SocureDocRequest."SocureDocRequest"
    status_codeIntegerHTTP status code of the enrichment call.200
    responseObjectPayload containing the DocV handoff assets.See response schema

    response.data Handoff Details
    FieldTypeDescription
    docvTransactionTokenStringRequired to initialize the DocV Web SDK.
    urlStringDirect link to the Socure-hosted Capture App.
    qrCodeStringBase64-encoded PNG for desktop-to-mobile handoff.
  5. Integrate with 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:


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



    Quick start

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

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


    Listen for the evaluation_completed event

    RiskOS™ sends an evaluation_completed event when processing finishes. The final outcome is in data.decision.


    {
    "event_type": "evaluation_completed",
    "event_id": "3b31289c-2d4a-4107-80bc-dda63031d5a0",
    "event_at": "2025-07-17T01:20:01Z",
    "data": {
        "eval_id": "11111111-2222-3333-4444-555555555555",
        "id": "client-transaction-12345",
        "workflow": "consumer_onboarding",
        "workflow_id": "5937a624-f298-452c-9169-ceeae9e66b74",
        "workflow_version": "1.0.0",
        "environment_name": "Sandbox",
        "eval_source": "API",
        "eval_start_time": "2025-07-17T01:18:27Z",
        "eval_end_time": "2025-07-17T01:20:01Z",
        "eval_status": "evaluation_completed",
        "decision": "ACCEPT",
        "decision_at": "2025-07-17T01:20:01Z",
        "status": "CLOSED",
        "sub_status": "Accept",
        "tags": [],
        "notes": "",
        "review_queues": [
        "Default Queue"
        ],
        "data_enrichments": [
        {
            "enrichment_name": "Socure Document Request - Default Flow",
            "enrichment_endpoint": "https://service.socure.com/api/5.0/documents/request",
            "enrichment_provider": "SocureDocRequest",
            "status_code": 200,
            "response": {
            "referenceId": "ed6a5077-b272-4a75-8c21-b284e10927cd",
            "status": "SESSION_COMPLETE",
            "data": {
                "docvTransactionToken": "7d6ad42b-f804-4255-b25e-268b8a77c86f",
                "url": "https://verify.socure.com/#/dv/7d6ad42b-f804-4255-b25e-268b8a77c86f"
            }
            }
        },
        {
            "enrichment_name": "Socure Document Verification",
            "enrichment_endpoint": "https://service.socure.com/api/5.0/documents/verify",
            "enrichment_provider": "Socure",
            "status_code": 200,
            "response": {
            "referenceId": "ed6a5077-b272-4a75-8c21-b284e10927c",
            "documentVerification": {
                "decision": {
                "name": "standard",
                "value": "accept"
                },
                "reasonCodes": [
                "I831",
                "I836"
                ],
                "documentType": {
                "type": "Drivers License",
                "country": "USA",
                "state": "NY"
                },
                "documentData": {
                "firstName": "Test",
                "surName": "User",
                "fullName": "Test User",
                "dob": "1990-01-01",
                "documentNumber": "TST1234567",
                "expirationDate": "2030-01-01"
                },
                "digitalIntelligence": {
                "device": {
                    "id": "e92ee549-e3c7-4307-9be7-32fefb0db9a4",
                    "globalDeviceId": "aecddd42-f223-3333-940c-87baab4c6645",
                    "sessionCreatedAt": "2025-07-17T01:18:28Z",
                    "deviceCaptureAt": "2025-07-17T01:18:45Z",
                    "computed": {
                    "statisticalId": "b90c8faddcd15cd5eafc09bfe4e460d557c5e516f8c5b44b8d3ec1e6f60c30f8",
                    "isVirtualMachine": false,
                    "sessionAgeMinutes": 45
                    },
                    "network": {
                    "connectionIp": "203.0.113.10",
                    "webRtcPublicIp": "203.0.113.10",
                    "webRtcInternalIp": "10.0.0.15",
                    "realIp": "203.0.113.10",
                    "isTor": false,
                    "isProxy": false,
                    "isVpn": false,
                    "isConsumerPrivacy": false,
                    "isRiskyNetwork": false,
                    "isp": "Example ISP",
                    "ispType": "home",
                    "asn": 64500,
                    "asnName": "EXAMPLE-NET",
                    "domainName": "example.net",
                    "org": "Example Org",
                    "isMobileCarrier": false,
                    "speed": "broadband",
                    "networkLocation": {
                        "countryCode": "US",
                        "region": "NY",
                        "city": "New York",
                        "postalCode": "10001",
                        "latitude": 40.75,
                        "longitude": -73.99,
                        "metroCode": 501,
                        "continentCode": "NA",
                        "timezoneName": "America/New_York",
                        "gmtOffset": "-0500"
                    }
                    }
                }
                }
            }
            }
        }
        ]
    }
    }

    Key response fields

    RiskOS™ returns a consistent set of top-level fields that describe the outcome of an evaluation, along with enrichment-specific results that depend on your workflow configuration.


    Where to find specific results

    AreaFieldsHow to use it
    Decision and routingdecision, decision_at, tags, review_queues, notes, scorePrimary control signals. Branch application logic using decision. Use tags, queues, notes, and score for secondary routing, review, and explanation.
    Module resultsModule-specific fields (for example: reasonCodes, scores, extracted attributes)Evidence and signals produced by workflow modules. Use for escalation, compliance review, investigation, and audit.
    Identifiers and traceabilityid, eval_idPersist these identifiers to correlate API calls, logs, webhooks, GET requests, and support cases.
    Enrichment executiondata_enrichments[] (response, status_code, total_attempts, is_source_cache)Inspect enrichment outputs and detect provisioning issues, partial failures, retries, or cached responses.
    Workflow contextworkflow, workflow_id, workflow_versionUnderstand which workflow ran and which version produced the result. Useful for debugging and historical analysis.
    Evaluation lifecycleeval_status, status, sub_statusExecution and case state only. Useful for monitoring and asynchronous workflows. Do not use for business decisions.
    Execution contexteval_source, eval_start_time, eval_end_time, environment_nameObservability and performance metadata for latency tracking, environment validation, and API vs Dashboard attribution.

    Decision and routing (primary control signals)

    Use these fields to determine what action your application should take.

    decision values are workflow-specific and may differ from the examples shown in this guide.

    FieldTypeDescriptionExample
    decisionString (enum)Final evaluation result.

    Possible values:
    ACCEPT
    REVIEW
    REJECT

    Note: The fields returned can be customized to fit your integration or business needs.
    "REVIEW"
    decision_atString <Date-Time>RFC 3339 timestamp when the decision was finalized."2025-10-18T14:09:22.641Z"
    scoreNumberIf configured for a workflow, provides an aggregate score of all steps. This can be used for risk banding, additional routing, or analytics alongside the primary decision value.0.63
    tagsArray of StringsArray of labels applied during the workflow to highlight routing choices, notable signals, or rule outcomes. Useful for reporting, segmentation, or UI highlighting in the RiskOS™ Dashboard.[]
    review_queuesArray of StringsLists any manual review queues the evaluation was sent to. Empty when the case is fully auto-resolved without human review.[]
    notesStringFreeform text field for analyst or system comments about the evaluation. Often used to capture manual review rationale or investigation context."Manual review recommended based on risk signals"

    Evaluation lifecycle and status

    These fields describe where the evaluation is in its lifecycle and are useful for monitoring and asynchronous workflows.

    FieldTypeDescriptionExample
    eval_statusString (enum)Indicates the current state of an evaluation in RiskOS™.

    Possible values:
    evaluation_completed
    evaluation_paused
    evaluation_in_progress
    "evaluation_completed"
    statusString (enum)Indicates the current state of an evaluation or case.

    Possible values:
    OPEN
    CLOSED
    "CLOSED"
    sub_statusStringProvides additional detail about the evaluation status.

    Example values:
    Under Review
    Pending Verification
    Accept
    Reject
    "Under Review"

    Identifiers and traceability

    Use these fields to correlate requests, logs, webhooks, and support cases.

    FieldTypeDescriptionExample
    idString (UUID or custom string)Your evaluation identifier within RiskOS™.

    Note: This is customer-generated.
    "APP-123456"
    eval_idString (UUID)RiskOS-generated unique identifier for the evaluation."6dc8f39c-ecc3-4fe0-9283-fc8e5f99e816"
    workflow_idString (UUID)Unique identifier for the workflow run."dc7f261e-b158-477e-9770-7e4eae066156"
    workflow_versionStringVersion of the executed workflow."28.16.0"

    Execution context

    These fields provide timing and environment context for the evaluation.

    FieldTypeDescriptionExample
    eval_sourceString enumIndicates where the evaluation was initiated from.

    Possible values:
    API: Request submitted via the Evaluation API.
    Dashboard: Case created or evaluated through the RiskOS™ Dashboard.
    "API"
    eval_start_timeString <Date-Time>RFC 3339 timestamp for when RiskOS™ started processing the evaluation. Useful for latency and performance monitoring."2025-10-07T23:50:03.60187976Z"
    eval_end_timeString <Date-Time>RFC 3339 timestamp for when RiskOS™ finished processing the evaluation. Can be paired with eval_start_time to compute total processing time."2025-10-07T23:50:03.738794253Z"
    environment_nameStringIndicates which environment the evaluation ran in. Typically Sandbox for testing or Production for live traffic."Sandbox"

    Enrichment results

    Enrichment outputs are returned in the data_enrichments array.

    FieldTypeDescriptionExample
    enrichment_nameStringName of the enrichment executed as part of the evaluation."Socure DocV"
    enrichment_endpointStringAPI endpoint used for the enrichment request."https://sandbox.dev.socure.com
    /api/3.0/DocumentVerification"
    enrichment_providerStringProvider responsible for the enrichment."Socure"
    status_codeIntegerHTTP status code returned by the enrichment provider.200
    requestObjectPayload sent to the enrichment provider (often redacted in documentation examples).{ ... }
    responseObjectEnrichment response payload containing DocV results.See documentVerification response schema below.

    documentVerification fields

    FieldTypeDescriptionExample
    reasonCodesArray of StringsList of rule or insight codes returned from DocV analysis.["I834","I823","I826","I845","I820"]
    documentTypeObjectDetails about the document type provided for verification.See documentType fields
    decisionObjectResult of the document verification analysis.See decision fields
    documentDataObjectParsed data extracted from the submitted document.See documentData fields

    reasonCodes are machine-readable flags that explain why a decision occurred (e.g., data mismatches, capture issues, authenticity checks). They appear under the DocV enrichment response and are intended for routing, UX, and review workflows.


    Where you’ll see them

    • data_enrichments.response.documentVerification.reasonCodes

    How to use them

    • Drive resubmission UX (e.g., prompt for glare removal if an image quality code is present).
    • Route to manual review when authenticity or data consistency codes indicate risk.
    • Log for audit and analytics.

    The full catalog of reason codes and their descriptions is available in your Socure documentation/console or in the reason code list in the RiskOS™ Dashboard.


    documentType

    FieldTypeDescriptionExample
    typeStringHuman-readable document type."Drivers License"
    countryStringCountry associated with the document type."USA"
    stateStringState/region associated with the document type."NY"

    Supported document types

    Below are the document types you may encounter in documentVerification.documentType and when configuring capture flows. Coverage and acceptance may vary by country and program.

    Document TypeDescription
    Drivers LicenseA government-issued license permitting the consumer to operate a motor vehicle.
    Identification CardA non-driver government-issued photo ID for verifying identity.
    PassportAn official government document certifying identity and nationality, used for international travel.
    Employment Authorization CardA document issued by USCIS that proves authorization to work in the U.S.
    Permanent Resident CardA document (e.g., U.S. Green Card) proving the consumer’s lawful permanent resident status.
    Passport CardA wallet-sized U.S. document used for land and sea travel between certain countries.
    Military IDAn ID card issued by a country’s armed forces to identify active-duty or retired service members.
    Health CardAn ID card issued by a government or insurer to access health services.
    VisaAn official endorsement permitting the consumer to enter, stay, or work in a foreign country.
    Social Security CardA U.S. government-issued card showing the consumer’s Social Security Number (SSN).
    Weapons LicenseA document permitting the consumer to carry or own firearms or other regulated weapons.
    Tribal ID CardA government-recognized identity card issued by a Native American or Indigenous tribe.
    Mexican Permanent Resident CardAn identity document for foreign nationals authorized to live permanently in Mexico.

    decision

    DocV responses are recommendations only. They are intended to inform your decisioning process and should be integrated into your organization’s broader risk strategy.

    FieldTypeDescriptionExample
    nameStringInternal label representing the configured decision rule set (e.g., "lenient" or "strict")."lenient"
    valueStringOutcome of the DocV analysis. One of:
    accept — Images met validation criteria and were verified.
    reject — Images failed some or all required validation criteria.
    resubmit — User must resubmit due to unacceptable image quality or missing data.
    review — Images did not meet configured criteria and should be manually reviewed. Returned only if enabled in your DocV Product Settings.
    "reject"

    documentData

    The documentData object contains the extracted data from OCR, barcode, or MRZ.

    If DocV cannot extract sufficient information due to poor image quality or unreadable fields, the documentData object will not be present, and the decision will be resubmit.

    FieldTypeDescriptionExample
    personalNumberStringThe personal identifier value extracted from the ID, when applicable.

    Note: The meaning and availability of this value vary by country and document type, but it generally represents an identifier tied to the individual rather than the document itself (for example, a tax identification number or voter ID).
    "123456"
    personalNumberTypeStringIndicates what the personal number represents. Supported values depend on the issuing country and document type.BRA_CPF
    firstNameStringFirst/given name parsed from the document."John"
    surNameStringLast/family name parsed from the document."Smith"
    fullNameStringFull name as printed on the document."John Smith"
    addressStringSingle-line address string (as returned)."32194 N College Ave, New York City, NY 10001"
    parsedAddressObjectStructured address parts extracted from address.See parsedAddress fields
    documentNumberStringDocument identifier/number."00000000"
    dobStringDate of birth (YYYY-MM-DD)."1989-05-07"
    issueDateStringDocument issue date (YYYY-MM-DD)."2021-01-12"
    expirationDateStringDocument expiration date (YYYY-MM-DD)."2029-05-07"
    barcodeObjectContains identity and license details parsed from the barcode of a government-issued ID.See barcode fields.

    parsedAddress fields

    FieldTypeDescriptionExample
    physicalAddressStringPrimary street address (line 1) of the parsed location."32194 N College Ave"
    physicalAddress2StringCombined city, state, and postal code as returned from parsing."New York City NY 10001"
    cityStringCity component extracted from the parsed address."New York City"
    stateStringState, province, or regional code component extracted from the address."NY"
    countryStringISO 3166-1 alpha-2 country code associated with the parsed address."US"
    zipStringPostal or ZIP code component extracted from the parsed address."10001"

    barcode fields

    FieldTypeDescriptionExample
    firstNameStringThe individual’s given or first name as encoded in the barcode."John"
    middleNameStringThe individual’s middle name or initial extracted from the barcode."Larry"
    surNameStringThe individual’s last name or family name as encoded in the barcode."Smith"
    nameSuffixStringAny name suffix present, such as Jr., Sr., II, or III."JR"
    complianceTypeStringCode representing the license’s compliance type (e.g., Federal or state)."F"
    licenseClassStringThe class or category of license (e.g., commercial, operator, etc.)."C"
  7. Route the user based on the final decision

    Because the evaluation completes asynchronously, your frontend should wait for your backend to persist the final decision, then route the user accordingly.


    • ACCEPT → Continue onboarding
    • REJECT → Route to fallback or review flow

    One common approach is polling your API until the stored decision changes.


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


Final integration validation checklist

Global REJECT Case
Upon rejection, direct the user to a page explaining that their information could not be verified
(Optional) Provide the user with an option to restart the process, if permitted by your business rules
Initial Evaluation & Step-Up
Call POST /api/evaluation using your DocV & Watchlist workflow
Confirm the response returns status = ON_HOLD and eval_status = evaluation_paused
Extract and persist eval_id and docvTransactionToken for webhook correlation
Do not re-submit the evaluation after launching DocV (evaluation resumes automatically)
DocV Checks
Launch the DocV Web SDK (or redirect to the Capture App URL) using the returned token
Confirm users can complete government ID capture and selfie verification
If document verification fails, route the user to the global REJECT flow
Watchlist & Screening Checks
Verify watchlist screening runs as part of the configured workflow
Confirm watchlist outcomes are reflected in the final decision, tags, or review routing
Webhook & Final Decision
Register your webhook endpoint to receive evaluation_completed events
Extract the final decision from data.decision and persist it server-side
Correlate webhook results using the stored eval_id
Decision Routing
On ACCEPT, allow the user to complete their intended action
On REJECT, route the user to the global rejection experience
On REVIEW (if enabled), route the user to a pending or manual review state