SDK reference · React Native SDK / React Native Common Implementation Patterns

Run Flows Configured Online

Use this path when the module order and settings live on the Incode Dashboard rather than in your app. Instead of defining a flowConfig array locally, you reference a Workflow or Flow by ID and the SDK runs the modules and configuration applied to it on the Dashboard. This lets you change the configuration without shipping a new app build.

Workflows and Flows are different Dashboard artifacts, and the method you call depends on which one your configuration is: startWorkflow() requires a Workflow's configurationId, startFlow() requires a Flow's configurationId.

Before you start

Make sure the SDK is installed and initialized. See Getting Started for setup and initialization.

For the modules a Workflow or Flow can include, see Modules. For the result and error objects delivered to listeners, see Results.

Register step listeners

If you want to react to individual modules as they complete, register listeners before starting the session. If you only need the final outcome, you can rely on the value returned by the start call and skip this step.

const unsubscribers = [
  IncodeSdk.onSessionCreated((session) => {
    console.log(session.interviewId);
  }),
  IncodeSdk.onStepCompleted({
    module: 'IdScanFront',
    listener: (event) => console.log(event.result),
  }),
  IncodeSdk.onStepCompleted({
    module: 'IdScanBack',
    listener: (event) => console.log(event.result),
  }),
  IncodeSdk.onStepCompleted({
    module: 'ProcessId',
    listener: (event) => console.log(event.result.extendedOcrData),
  }),
  IncodeSdk.onStepCompleted({
    module: 'SelfieScan',
    listener: (event) => console.log(event.result),
  }),
  IncodeSdk.onStepCompleted({
    module: 'FaceMatch',
    listener: (event) => console.log(event.result),
  }),
];

Call each unsubscriber when the screen unmounts:

React.useEffect(() => {
  const unsubscribers = setupListeners();

  return () => {
    unsubscribers.forEach((unsubscriber) => unsubscriber());
  };
}, []);

Because the modules are defined on the Dashboard, the listeners you register here should correspond to the modules included in the Workflow or Flow. For the shape and fields of each result object passed to these listeners, see Results.

❗{/* [SME input needed: source-level review confirmed that the same listener mechanism works for Dashboard-configured and locally-configured sessions, but couldn't confirm which specific module events fire for Dashboard-configured sessions (this depends on backend/business logic). Confirm which events customers can rely on when running Dashboard-configured sessions. Escalation candidate: needs Dashboard/product knowledge.] */}

Configure the session

Build a sessionConfig with the configurationId of the Workflow or Flow to run. Ensure the Workflow or Flow is activated on the Dashboard before starting the session.

Useful sessionConfig fields for Dashboard-configured sessions include:

Field Use
configurationId The Workflow or Flow ID from the Dashboard. The modules and configuration applied to it are used for this session.
externalId / externalCustomerId Link the Incode session to your own user/customer ID. With externalId, if a session with the same ID already exists and the previous session was interrupted, that session is resumed instead of a new one being created. With externalCustomerId, a new session is always created even if one with the same ID already exists. {/* [SME input needed: source-level review couldn't confirm the resume-vs-create distinction between externalId and externalCustomerId; this is backend session-management behavior. Confirm expected behavior. Escalation candidate: needs backend/product knowledge.] */}
interviewId / token Start from a backend-created session.
queue Assign the session to a queue.
validationModules Select server-side validation modules.
customFields Attach custom string data to the session.
e2eEncryptionEnabled Enable E2EE for the session. See End-to-End Encryption for the full setup.
mergeSessionRecordings Merge recordings from ID capture and Face capture into a single video.
voiceConsentLanguage Set VideoSelfie voice consent language: en, es, pt, or he.

Example:

const sessionConfig = {
  configurationId: 'YOUR_CONFIGURATION_ID',
  externalId: 'external-id',
};

Start the session

The React Native SDK provides separate entry points for running a Workflow versus a Flow:

Entry point Use when
startWorkflow() Running a Workflow configured on the Dashboard.
startFlow() Running a Flow configured on the Dashboard. Optionally start from a specific step using moduleId.
startFlowFromDeepLink() Resuming a Flow from a deep link URL. The SDK reads the configurationId, interviewId, and starting step from the URL.

If you're not sure whether your Dashboard configuration is a Workflow or a Flow, check under Flow Builder > Flows or Flow Builder > Workflows on the Dashboard.

Run a Workflow

const result = await IncodeSdk.startWorkflow({
  sessionConfig: {
    configurationId: 'YOUR_CONFIGURATION_ID',
  },
});

Run a Flow

const result = await IncodeSdk.startFlow({
  sessionConfig: {
    configurationId: 'YOUR_CONFIGURATION_ID',
    externalId: 'external-id',
  },
});

Start from a specific module by passing moduleId:

await IncodeSdk.startFlow({
  sessionConfig: {
    configurationId: 'YOUR_CONFIGURATION_ID',
  },
  moduleId: 'EMAIL',
});

await IncodeSdk.startFlow({
  sessionConfig: {
    configurationId: 'YOUR_CONFIGURATION_ID',
  },
  moduleId: 'PHONE',
});

For the full list of valid moduleId values, see valid moduleId values in the API Reference.

Use startFlowFromDeepLink() to resume a Flow from a deep link URL. Deep links work for Flows only, not Workflows:

const result = await IncodeSdk.startFlowFromDeepLink('YOUR_DEEPLINK_URL');

The deep link URL follows this ormat: `https://[host]/[path]/[flowId]?interviewId=[interviewId]&module=[module], where:

  • flowId (required, path segment): the Flow's configuration ID.
  • interviewId (optional, query parameter): the ID of the interview session to resume.
  • module (optional, query parameter): the module to start from.

If your app receives a shortened URL, pass true as the second argument:

const result = await IncodeSdk.startFlowFromDeepLink('YOUR_DEEPLINK_URL', true);

Deep links are typically generated by your backend or the Incode Dashboard.


Was this page helpful?