{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition","tabs","tab"]},"redocly_category":"Journeys","product":"Identity Management","type":"markdown"},"seo":{"title":"Platform IDV Recommendation","description":"Everything about Mosaic Journeys, SDKs, and APIs","siteUrl":"https://developer.transmitsecurity.com"},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"platform-idv-recommendation","__idx":0},"children":["Platform IDV Recommendation"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge-wrapper"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge"},"children":["Client SDK"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge"},"children":["Mobile approve"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge"},"children":["SSO"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"badge"},"children":["Sub-journey"]}]},{"$$mdtype":"Tag","name":"blockquote","attributes":{},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Obtains an identity verification recommendation based on previously collected documents or selfie"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"about-client-facing-steps","__idx":1},"children":["About client-facing steps"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A journey is a sequence of steps that are executed when it's invoked by a client application (known as the \"client\"). Some steps require involvement from the client, such as to collect user input. Other steps, like validating a token, are executed in the backend by the Mosaic journey engine alone."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When invoked, the journey begins executing the steps while the client waits for further instructions. When a journey reaches a client-facing step, the journey asks the client for the required input and then waits for the client to respond. The client presents their own UI if user interaction is required, and returns input to the journey. The journey then proceeds in a similar manner until it's completed."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"description","__idx":2},"children":["Description"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This step obtains a verification recommendation from Mosaic ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/verify/identity_verification_overview"},"children":["Identity Verification"]}," based on images collected earlier in the journey. It evaluates the captured data and returns a recommendation that indicates the verification outcome."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Use this step after ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/document_acquisition"},"children":["Document Acquisition"]}," step, ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/selfie_acquisition"},"children":["Selfie Acquisition"]}," step, or both."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Running this step concludes the Identity Verification session. Capture steps that run after it require a new session."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When executed, Mosaic processes the collected images asynchronously. The client should keep polling until the journey proceeds to the next step or returns an error. If capture didn't succeeded, the step returns a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["not_enough_data"]}," error and follows the failure behavior."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If defined, an output variable will store the verification result (including document details and personal user info—see example ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/verify/quick_start_web/#step-6-handle-verification-result"},"children":["here"]},"). This data can be used in subsequent journey steps in the expression fields (e.g., ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idv_recommendation.recommendation"]},") or as a part of an interpolated string (e.g., ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Hi ${idv_recommendation.verified_info.person.given_name}"]},")."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"configuration","__idx":3},"children":["Configuration"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"table"},"children":[{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Field"},"children":["Field"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Description"},"children":["Description"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Output variable"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Name of the variable used to store the verification result data, which can be used in subsequent journey steps. Default is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idv_recommendation"]},". The object includes the recommendation, document details, and personal user info."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Error output variable"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Name of the variable that stores any errors returned by action"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Failure behavior"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Determines the behavior in case of failure, which either aborts the journey or proceeds to a failure branch of the control flow (default)."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Custom branches"]}]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Additional journey branches supported for this step. The client can select a branch by returning the branch ID. For each branch, you can define a schema for the information that the client is expected to return (used by the code generator and for autocompleting journey expressions) and a display name to label it in the editor."]}]}]}]}]}]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Journey event data"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This step can be configured to record step input and output data, or a custom payload, which is then surfaced in journey events in Journey Analytics for diagnostic purposes. For details, see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/getting-started/event_reporting"},"children":["Additional data reporting"]},"."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"example","__idx":4},"children":["Example"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["When executed, this step sends a callback to the client. The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["journeyStepId"]}," is set to Platform IDV Recommendation (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transmit_platform_idv_recommendation"]},"). Keep calling ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["submitClientResponse()"]}," with an empty client response until the journey proceeds to the next step or returns an error. Show a loader while processing runs. Mosaic recommends polling about once per second."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The recommendation data (including final recommendation, checks, and extracted data) is stored in the output variable (default: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idv_recommendation"]},") and can be used in subsequent steps, such as a ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/guides/orchestration/journeys/condition"},"children":["Condition"]}," step. For example, use the expression ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["idv_recommendation.recommendation == 'ALLOW'"]}," to branch based on the verification outcome."]},{"$$mdtype":"Tag","name":"Tabs","attributes":{"size":"medium"},"children":[{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"JavaScript","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"js","header":{"controls":{"copy":{}}},"source":"async function handleIdvRecommendation() {\n  let idoResponse;\n\n  do {\n    await new Promise((resolve) => setTimeout(resolve, 1000));\n    // If SDK was loaded via script tag, invoke functions inside 'window.tsPlatform'\n    idoResponse = await ido.submitClientResponse(ClientResponseOptionType.ClientInput);\n  } while (idoResponse.journeyStepId === IdoJourneyActionType.WaitForIdvRecommendations);\n\n  return handleJourneyResponse(idoResponse);\n}\n","lang":"js"},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Kotlin","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"kotlin","header":{"controls":{"copy":{}}},"source":"private fun processServiceResponse(idoResponse: TSIdoServiceResponse) {\n    when (idoResponse.journeyStepId) {\n        TSIdoJourneyActionType.IdvRecommendation.type -> handleIdvRecommendation()\n    }\n}\n\nprivate fun handleIdvRecommendation() {\n    // Submit an empty response. If Mosaic is still processing, the callback\n    // returns this step again—keep calling until the next step arrives.\n    TSIdo.submitClientResponse(TSIdoClientResponseOptionType.ClientInput.type, null, callback)\n}\n","lang":"kotlin"},"children":[]}]},{"$$mdtype":"Tag","name":"TabItemFragment","attributes":{"label":"Swift","disable":false},"children":[{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"swift","header":{"controls":{"copy":{}}},"source":"func handleJourneyResponse(_ response: TSIdoServiceResponse) {\n    switch response.journeyStepId {\n    case .waitForIdvRecommendations:\n        handleIdvRecommendation()\n    default:\n        break\n    }\n}\n\nfunc handleIdvRecommendation() {\n    do {\n        // Submit an empty response. If Mosaic is still processing, the delegate\n        // receives this step again—keep calling until the next step arrives.\n        try TSIdo.submitClientResponse(clientResponseOptionId: .clientInput)\n    } catch {\n        debugPrint(\"[DEBUG] Failed to submit IDV recommendation poll: \\(error)\")\n    }\n}\n","lang":"swift"},"children":[]}]}]}]},"headings":[{"value":"Platform IDV Recommendation","id":"platform-idv-recommendation","depth":1},{"value":"About client-facing steps","id":"about-client-facing-steps","depth":2},{"value":"Description","id":"description","depth":2},{"value":"Configuration","id":"configuration","depth":2},{"value":"Example","id":"example","depth":2}],"frontmatter":{"markdown":{"toc":{"depth":2}},"redirects":{"/guides/orchestration/journeys/transmit_platform_idv_recommendation/":{}},"seo":{"title":"Platform IDV Recommendation"}},"lastModified":"2026-09-22T13:10:58.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/guides/orchestration/journeys/idv_recommendation","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}