Integration Guide

Learn how to connect your application to KYC + Fraud + Watchlist > DocV Step up in RiskOS™. These guides provide the end-to-end technical requirements for gathering identity data, managing device risk, and processing onboarding decisions.

Start building

Before you start

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

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 KYC + Fraud + Watchlist > DocV Step up solution with the Evaluation endpoint.



Select your integration

Choose the tab below that matches your product's architecture to see the specific implementation steps, code snippets, and payload requirements.

Hosted flow

This integration allows your platform to:

  • Generate a verification session
  • Redirect the user to a RiskOS™ hosted onboarding experience
  • Receive a final decision asynchronously
  • Route the user based on the outcome

Your application does not collect identity data directly. RiskOS™ manages the full verification experience and returns control to your redirect_uri when complete.

How document verification works

If additional verification is required during the hosted flow, RiskOS™ will trigger Predictive Document Verification (DocV).

Users may be asked to:

  • Capture a government-issued ID
  • Take a biometric selfie
  • Complete liveness verification

Final decisions are delivered asynchronously via webhook. You must configure a webhook endpoint to receive evaluation_completed events.


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. Customize the hosted experience

    Add your logo, branding, and customized copy on the Templates tab in the RiskOS™ Dashboard.

  2. Generate and launch the Hosted Flow

    Use the Hosted Flow to delegate identity collection, fraud checks, watchlist screening, and optional Document Verification (DocV) to RiskOS™. This workflow is asynchronous.


    1. Create an evaluation (POST)

    Your server must initiate the hosted workflow by sending a POST request to the Evaluation endpoint. Include your workflow name and a redirect_uri where the user should return after completing the hosted flow.


    • Endpoint: POST /api/evaluation

    curl --request POST \
    --url "https://riskos.sandbox.socure.com/api/evaluation" \
    --header "Accept: application/json" \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer YOUR_API_KEY" \
    --data '{
        "id": "17e9a02a-a5a7-442b-9b28-2034e1ed9d53",
        "timestamp": "2025-08-14T20:10:04.535Z",
        "workflow": "consumer_onboarding",
        "data": {
            "individual": {     
            "docv": {
                "config": {
                    "send_message": true
                }
            }                    
            "custom": {
                "redirect_uri": "https://yourapp.com/callback"
            }
        }
    }'

    Request schema

    FieldTypeRequiredDescriptionExample
    idString (UUID)RequiredUnique identifier for this evaluation request. Must be unique per submission.17e9a02a-a5a7-442b-9b28-2034e1ed9d53
    timestampString (RFC 3339 Date-Time)RequiredTime the evaluation request was initiated by your system.2025-08-14T20:10:04.535Z
    workflowStringRequiredThe Hosted Flow workflow name configured in RiskOS™ (e.g., consumer_onboarding).consumer_onboarding
    dataObjectRequiredContainer object for workflow inputs and configuration.
    data.custom.redirect_uriString (URL)RequiredURL where the user will be redirected after completing the Hosted Flow.https://yourapp.com/callback

    docv fields

    Use the fields in the table below to configure Predictive DocV behavior within 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"

    Example response

    The response returns a hosted redirect_uri and an eval_id. The evaluation will return status = ON_HOLD while waiting for user interaction.


    {
        "id": "4e67a341-826c-4813-99b4-6c91cf2de4f7",
        "workflow": "consumer_onboarding",
        "workflow_id": "63e7534e-675e-4e7b-985b-f578d98347d0",
        "workflow_version": "11.71.0",
        "eval_source": "API",
        "eval_id": "1cc8f438-3c65-47ec-a1de-ad828dbcfa25",
        "eval_start_time": "2026-02-17T23:16:06.555204712Z",
        "eval_end_time": "2026-02-17T23:16:06.555902399Z",
        "decision": "REVIEW",
        "decision_at": "2026-02-17T23:16:06.555912097Z",
        "status": "ON_HOLD",
        "sub_status": "More information needed",
        "tags": [],
        "notes": "",
        "review_queues": [
            "Default Queue"
        ],
        "eval_status": "evaluation_paused",
        "environment_name": "Sandbox"
    }

    Response schema

    The following fields are returned in the Evaluation API response.

    FieldTypeDescriptionExample
    idString (UUID or custom string)Customer-generated identifier supplied in the original POST request."4e67a341-826c-4813-99b4-6c91cf2de4f7"
    workflowStringName of the workflow executed."consumer_onboarding"
    workflow_idString (UUID)Unique identifier for the workflow run."63e7534e-675e-4e7b-985b-f578d98347d0"
    workflow_versionStringVersion of the executed workflow."11.71.0"
    eval_sourceString (enum)Indicates where the evaluation was initiated from. Possible values: API, Dashboard."API"
    eval_idString (UUID)RiskOS-generated unique identifier for the evaluation. Persist this value to correlate webhooks and GET requests."1cc8f438-3c65-47ec-a1de-ad828dbcfa25"
    eval_start_timeString <Date-Time>RFC 3339 timestamp when RiskOS™ began processing the evaluation."2026-02-17T23:16:06.555204712Z"
    eval_end_timeString <Date-Time>RFC 3339 timestamp when processing completed or paused."2026-02-17T23:16:06.555902399Z"
    decisionString (enum)Evaluation result. Possible values include ACCEPT, REVIEW, REJECT, RESUBMIT."REVIEW"
    decision_atString <Date-Time>RFC 3339 timestamp when the decision was finalized."2026-02-17T23:16:06.555912097Z"
    statusString (enum)Case-level status of the evaluation. Possible values: OPEN, CLOSED, ON_HOLD."ON_HOLD"
    sub_statusStringProvides additional detail about the evaluation status."More information needed"
    eval_statusString (enum)Internal evaluation lifecycle state. Possible values: evaluation_completed, evaluation_paused, evaluation_in_progress."evaluation_paused"
    tagsArray of StringsLabels applied during the workflow to highlight routing decisions or notable signals.[]
    review_queuesArray of StringsManual review queues the evaluation was sent to.["Default Queue"]
    notesStringFreeform text for analyst or system comments about the evaluation.""
    environment_nameStringEnvironment where the evaluation was executed. Typically Sandbox or Production."Sandbox"
  3. Redirect and launch the Hosted Flow

    Immediately redirect the user to the redirect_uri returned in the evaluation response. RiskOS™ now manages the full onboarding experience.


    During the hosted session, RiskOS™ may:

    • Collect phone number and date of birth
    • Perform KYC and Watchlist screening
    • Step-up to Document Verification (DocV), if risk thresholds are met

    Web integration

    If integrating in a web application, redirect the user to the hosted redirect_uri. You may open it in the same tab or a new tab.

    window.location.href = hostedRedirectUri

    Native iOS integration

    Launch the RiskOS™ Hosted Flow using an in-app browser such as SFSafariViewController.

    import SafariServices
    
    let safariVC = SFSafariViewController(url: URL(string: hostedRedirectUri)!)
    present(safariVC, animated: true)

    Native Android integration

    Launch the RiskOS™ Hosted Flow using Chrome Custom Tabs for a secure in-app browser experience.

    val customTabsIntent = CustomTabsIntent.Builder().build()
    customTabsIntent.launchUrl(this, Uri.parse(hostedRedirectUri))

    Your application does not collect or process PII during this stage.


    Important: The redirect indicates the UX is complete. The final decision is delivered asynchronously via webhook.

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

    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"
  5. 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
KYC Checks
When the DocV enrichment is triggered, direct the user to the Capture App
On ACCEPT, allow the user to complete their intended action (for example, account creation or payment transaction)
DocV Checks
If document verification fails, route the user to the global REJECT flow
On ACCEPT, allow the user to complete their intended action