This pattern breaks a locally-defined flow into sections your app runs one at a time. Control returns to your app between sections, so you can display your own intermediate UI, run business logic, or branch based on intermediate results before starting the next section.
Use this pattern when you need to interleave your own UI or logic with the SDK modules, or when you want to split a long flow into discrete steps.
Prerequisite
The SDK must be initialized before you start a session. See Installation for the initializeSDK() call and its arguments.
Lifecycle
The step-by-step pattern uses five methods, called in this order:
setupOnboardingSession(): create the session. Returns aninterviewIdandtoken.startOnboardingSection(): run one section. Can be called multiple times, but only one section at a time. Wait for each section's callback before starting the next.finishOnboarding(): finalize the session. Call exactly once, after all sections succeed.getUserScore(): fetch verification scores and results.deleteUserLocalData(): clear local cache.
Steps 4 and 5 are optional. Skip getUserScore() if you don't need scores (or use the inline userScore module in a section). Skip deleteUserLocalData() if you don't need local cleanup.
Walkthrough
Step 1: Set up the session
let sessionConfig = {
configurationId: "your-flow-id", // optional
externalId: "your-external-id", // optional
e2eEncryptionEnabled: false, // optional
region: "ALL" // optional
};
cordova.exec(
function (data) {
console.log("Session ready. interviewId:", data.interviewId, "token:", data.token);
runFirstSection();
},
function (err) { console.log("setupOnboardingSession error:", err); },
"Cplugin",
"setupOnboardingSession",
[sessionConfig]
);
Step 2: Run a section
function runFirstSection() {
let flowConfig = [
{ module: "addId", showIdTypeChooser: "true" },
{ module: "addSelfieScan" },
{ module: "addFaceMatch", matchType: "idSelfie" }
];
let recordSessionConfig = { recordSession: "false", forcePermissions: "false" };
let sectionTag = "identity-section-001";
cordova.exec(
function (result) {
console.log("Section status:", result.status);
console.log("Section tag:", result.sectionTag);
console.log("Front ID:", result.frontIdData);
console.log("Face match:", result.faceMatchData);
// Call startOnboardingSection again for the next section,
// or proceed to finishing the session.
finishSession();
},
function (error) {
// Typed error string, e.g. "permissionsDenied", "rootDetected"
console.log("Section error:", error);
},
"Cplugin",
"startOnboardingSection",
[flowConfig, recordSessionConfig, sectionTag]
);
}
Step 3: Finish the session
function finishSession() {
cordova.exec(
function () {
console.log("Onboarding finished");
fetchScore(); // optional, only if you need scores
},
function (err) { console.log("finishOnboarding error:", err); },
"Cplugin",
"finishOnboarding",
[]
);
}
Step 4: Fetch the user score (Optional)
function fetchScore() {
cordova.exec(
function (winParam) {
console.log("Score:", JSON.stringify(winParam));
cleanup();
},
function (err) { console.log("getUserScore error:", err); },
"Cplugin",
"getUserScore",
["fast"] // "fast" | "accurate"
);
}
Step 5: Delete local data (Optional)
function cleanup() {
cordova.exec(
function () { console.log("Local data deleted"); },
function (err) { console.log("deleteUserLocalData error:", err); },
"Cplugin",
"deleteUserLocalData",
[]
);
}
Notes
- You can start multiple sections, but only one at a time. Wait for each section's callback before starting the next.
- Section result payloads vary depending on which modules ran in the section. See Results for the full structure.
Related pages
- Modules: every module available in
flowConfigand its parameters. - Results: the structure of section results and the list of error strings.
- API Reference: the full signatures of
setupOnboardingSession(),startOnboardingSection(),finishOnboarding(),getUserScore(), anddeleteUserLocalData().