Every module in an onboarding flow reports its outcome through the SDK's listeners or the value returned by the start call. Most modules deliver a dedicated result object through a step completion event; a few signal completion with only a status field. This page describes promise results, listener payloads, and common error codes.
For the full field list of any result type, see the Modules reference and the API Reference.
How results and errors are delivered
- Per-step results arrive through step completion events. Register a listener for a specific module with
IncodeSdk.onStepCompleted({ module, listener }), and the listener receives aresultobject when that module finishes. - In-progress updates arrive through
IncodeSdk.onStepUpdated({ module, listener })for the modules that emit them (currentlyConference,IdScanFront,IdScanBack, andSelfieScan). - Session-level outcomes arrive as the resolved value of the start call.
startOnboarding(),startFlow(), andstartWorkflow()resolve with{ status: 'success' }on completion or{ status: 'userCancelled' }if the user cancels.startOnboardingSection()resolves with a similar object that also includessectionTag. - Errors surface as rejected promises. The start methods reject with
IncodeSdkFlowError;IncodeSdk.initialize()rejects withIncodeSdkInitError. - Cleanup: call
IncodeSdk.deleteLocalUserData()once you are done with a session to remove locally stored onboarding data (Android only - see Delete Local Session Data).
API results
Error enums
IncodeSdk.initialize() can reject with IncodeSdkInitError.
type IncodeSdkInitErrorCode =
| 'simulatorDetected'
| 'testModeEnabled'
| 'invalidInitParams'
| 'configError'
| 'unknown';
| Code | When it fires |
|---|---|
simulatorDetected |
Running on a simulator without testMode: true. |
testModeEnabled |
Running on a physical device with testMode: true; test mode is only for simulators/emulators. |
invalidInitParams |
The native project isn't configured correctly (for example, a missing or malformed Incode-Info.plist on iOS). |
configError |
apiConfig is missing or incomplete. |
unknown |
An unrecognized initialization failure. |
Flow APIs can reject with IncodeSdkFlowError.
type IncodeSdkFlowErrorCode =
| 'simulatorDetected'
| 'rootDetected'
| 'hookDetected'
| 'virtualEnvDetected'
| 'permissionsDenied'
| 'jailbreakDetected'
| 'faceAuthenticationFailed'
| 'sslPinningFailed'
| 'locationUnavailable'
| 'unknown';
| Code | When it fires |
|---|---|
simulatorDetected |
Running on a simulator. |
rootDetected |
The SDK detected that the device is rooted. |
hookDetected |
The SDK detected a runtime hooking framework on the device. |
virtualEnvDetected |
The SDK detected that the app is running in a virtual environment. |
permissionsDenied |
The user denied a permission required by the flow (typically camera or microphone). |
jailbreakDetected |
The SDK detected that the device is jailbroken. iOS only. |
faceAuthenticationFailed |
A face authentication step failed. |
sslPinningFailed |
SSL pinning validation failed. |
locationUnavailable |
Required location data could not be obtained. |
unknown |
Catch-all for unrecognized flow failure. |
startOnboarding, startFlow, and startWorkflow
Successful completion resolves with:
{ "status": "success" }
User cancellation resolves with:
{ "status": "userCancelled" }
Some legacy documentation and native payloads may refer to the same state as user_cancelled.
setupOnboardingSession
{
interviewId: string;
token: string;
}
startOnboardingSection
{
status: 'success' | 'userCancelled';
sectionTag: string;
}
startFaceLogin
{
faceMatched: boolean;
spoofAttempt: boolean;
image?: { pngBase64?: string; encryptedBase64?: string };
customerUUID?: string;
interviewId?: string;
interviewToken?: string;
token?: string;
transactionId?: string;
hasFaceMask?: boolean;
}
Example Face Login response:
{
"faceMatched": true,
"spoofAttempt": false,
"image": {
"pngBase64": "...PNG Base 64 encoded",
"encryptedBase64": "...PNG Encrypted Base 64 encoded"
},
"customerUUID": "exampleCustomerUUID",
"interviewId": "exampleInterviewID",
"interviewToken": "exampleInterviewToken",
"token": "exampleToken",
"transactionId": "Unique Authentication attempt ID",
"hasFaceMask": false
}
For 1:1 Face Login, faceMatched can be false when faces do not match or when the user with the supplied customer token and customerUUID is not found. For 1:N Face Login, faceMatched can be false when the captured face is not associated with an approved user in the database.
hasFaceMask is available on iOS only; Android forces the user to remove the mask before login is performed.
getUserScore
Returns the same UserScore data that the UserScore module provides:
{
overallScore: string;
status: 'ok' | 'warn' | 'unknown' | 'fail' | 'manual';
facialRecognitionScore: string;
existingUser: boolean;
idVerificationScore: string;
livenessOverallScore: string;
}
❗{/* [SME input needed: the status values appear to roughly map to session statuses (ok = Pass, warn = Warn, fail = Fail, manual = Manual Review), but this mapping is unconfirmed and unknown has no obvious equivalent. Confirm whether these SDK values correspond to the session statuses, and define what unknown indicates. Note: UserScore does not appear to exist as a module on the native Android or iOS SDKs, so definitions could not be sourced there. Escalation candidate: needs product/scoring-team knowledge.] */}
await IncodeSdk.getUserScore({ mode: 'accurate' });
accurate fetches server-side results and can take longer. fast uses on-device processing. The getUserScore({ mode }) method and the UserScore module's mode parameter behave identically.
approve
{
status: 'approved' | 'failed';
id: string;
customerToken: string;
}
status:approvedorfailed.id: The customer UUID.customerToken: The customer's session token.
Use the forceApproval argument when calling approve(). Some older text called this forceApprove.
faceMatch
Returns a FaceMatch completion event payload.
Methods without a meaningful payload
finishOnboardingFlow, deleteLocalUserData, showCloseButton, setTheme, setUXConfig, setString, setQuantityStrings, setLocalizationLanguage, setFaceAuthenticationHint, and setSdkMode are primarily command-style methods.
checkOnDemandResourcesDownloaded, downloadOnDemandResources, and removeOnDemandResources do return a meaningful payload on Android - a { status: string } object ("true"/"false" for the check, "success" for download/remove; see IncodeSdkModule.kt). See Dynamic Delivery Usage Guide for usage.
Listener results
The SDK offers several types of listeners:
- user cancellation
- tracking events
- step completion, for each module individually
- step error, for each module individually
- step update, for each module individually
User cancellation
If the user cancels onboarding, startOnboarding, startFlow, and startWorkflow return status: 'userCancelled'.
On both platforms, the user can cancel by pressing the close button that can be enabled using IncodeSdk.showCloseButton(true). On Android, the user can also cancel by pressing the back key.
Session created
When an onboarding session gets created, the information about the session can be obtained via IncodeSdk.onSessionCreated.
IncodeSdk.onSessionCreated((session) => {
console.log('Onboarding session created, interviewId: ' + session.interviewId);
});
The session event includes:
interviewId: string. Unique identifier of the onboarding session.token: string. Token created for this onboarding session.
Tracking events
When onboarding has started, tracking events can be obtained using onEvents.
IncodeSdk.onEvents((eventBatch) => {
for (const event of eventBatch.events) {
console.log(event.event, event.data);
}
});
The listener receives:
events:EventDetails[]. Array of emitted events.event: string. Unique identifier of the event.data: string. JSON string with additional event details.
❗{/* [SME input needed: event names for onEvents aren't typed or enumerated in the SDK; they pass through from the native SDKs. Confirm one of: (a) the full set of event names, (b) where customers can find the list, or (c) that these are internal events not intended as a documented contract customers should depend on. Escalation candidate: needs product/SDK-team knowledge.] */}
Step completion
When a step in the configured onboarding flow is completed, register a listener via IncodeSdk.onStepCompleted. The listener config takes the module name and callback.
const unsubscribe = IncodeSdk.onStepCompleted({
module: 'SelfieScan',
listener: (event) => {
console.log(event.result);
},
});
Step completion events are delivered through onStepCompleted(). In-progress events are delivered through onStepUpdated().
Step error
When a module in the flow emits an error, register a listener via IncodeSdk.onStepError. The listener config takes the module name and callback.
const unsubscribe = IncodeSdk.onStepError({
module: 'FaceMatch',
listener: (event) => {
console.log('FaceMatch error', event);
},
});
onStepError currently fires for Phone, DocumentScan, Geolocation, Signature, VideoSelfie, IdScan, Conference, SelfieScan, FaceMatch, QrScan, Captcha, and UserScore.
The event shape isn't fully consistent across modules: most report a flat status value, QrScan and Conference nest it inside a result object, and IdScan nests separate front/back status values.
Step update
When a step in the configured flow is updated, register a listener via IncodeSdk.onStepUpdated. The listener config takes the module name and callback.
IncodeSdk.onStepUpdated({
module: 'IdScanFront',
listener: (event) => {
console.log('ID Scan Front Attempt: ', event.result);
console.log('ID Scan Front Attempt allAttemptsExhausted:', event.result.allAttemptsExhausted);
},
});
onStepUpdated currently emits updates for Conference, IdScanFront, IdScanBack, and SelfieScan.
Module callback payloads
Aes
This module enables an advanced electronic signature to ensure legally binding and compliant document signing with enhanced security and authentication measures.
Example success response:
{
"status": "success",
"step": "Aes"
}
The field status can have one of the following values: success or fail.
Example failure response:
{
"status": "fail",
"error": "noDocuments",
"step": "Aes"
}
❗{/* [SME input needed: source-level review confirmed the Aes module has 2 possible error values but only noDocuments is currently documented. Confirm the other value and what each indicates. Escalation candidate: needs product/SDK-team knowledge.] */}
Antifraud
This module gives the ability to compare the current interview with existing interviews and customers to detect anomalies that could be signs of fraud.
Example success response:
{
"status": "success",
"step": "Antifraud"
}
The field status can have one of the following values: success or fail.
❗{/* [SME input needed: only a success response is documented for Antifraud. Confirm whether a failure response includes any additional fields (such as an error field, as the Aes module has), or whether failure is conveyed solely through status: "fail" in the same structure. Escalation candidate: needs product/SDK-team knowledge.] */}
Approve
Adding this module to the flow instructs the Incode server to perform the approval of the user.
Example response:
{
"result": { "status": "approved", "id": "customerUUID", "customerToken": "customerToken" },
"step": "Approve"
}
The status field can be approved or failed. A failed status is a normal, expected outcome, not an error.
Captcha
This module asks the user to enter an OTP generated for the current session. If the user enters an incorrect OTP too many times, the flow is terminated.
Example success response:
{
"result": {
"status": "success",
"response": "ABCDEF"
}
}
Captcha failure rejects the onboarding promise rather than returning a result. There is no module error listener for this module.
CombinedConsent
This module asks the user for data sharing consent.
Example success response:
{
"status": "success",
"step": "CombinedConsent"
}
The status field can be success or fail.
If the user declines to give data sharing consent, the onboarding flow ends with a status of userCancelled.
❗{/* [SME input needed: the status field can be success or fail, but the only documented non-success path is the user declining, which ends the flow with userCancelled rather than fail. Confirm under what circumstances status: "fail" occurs versus a userCancelled flow outcome. Escalation candidate: needs product/SDK-team knowledge.] */}
Conference
This module starts a video conference call.
Example success response:
{
"step": "Conference",
"result": {
"status": "success"
}
}
Example failure response:
{
"step": "Conference",
"result": {
"status": "error"
}
}
The result.status field can be success, userCancelled, invalidSession, or error.
CURP
This module asks the user to input their CURP information for validation with the RENAPO service. CURP is a personal identifier used in México.
Example success response:
{
"status": "success",
"curp": "exampleCurp",
"step": "CURP"
}
The status field can be success or fail.
❗{/* [SME input needed: only a success response is documented for CURP. Confirm whether a failure response includes any additional fields, or whether failure is conveyed solely through status: "fail" in the same structure. Escalation candidate: needs product/SDK-team knowledge.] */}
CustomWatchlist
This module checks whether the user appears on a custom watchlist configured in the Incode Dashboard.
Example success response:
{
"status": "success",
"step": "CustomWatchlist"
}
The status field can be success or fail. success means a match was found on the watchlist, which typically warrants further review. fail means no match was found.
DocumentScan
This module captures a document and attempts to read the address from it.
If the user skips this step, the response contains blank values rather than nil or an error.
Example success response:
{
"result": {
"address": { // parsed OCR data
"city": "Springfield",
"colony": "Springfield",
"postalCode": "555555",
"state": "Serbia",
"street": "Evergreen terrace"
},
"data": {"raw JSON OCR data"},
"type": "addressStatement",
"image": {"pngBase64": "/9j/4AAQSkZJRgABAQAAAQABAAD/4..."}
},
"step": "DocumentScan"
}
The result object includes:
address: parsed OCR data from the document.data: iOS only. A JSON string containing document-specific data, when available. This field is currently untyped in the SDK. On Android, there is no top-leveldatafield; medical-document data is nested underinsuranceCardinstead.type: the document type captured.image: the captured document image as a base64-encoded PNG.
Example failure response:
{
"status": "permissionsDenied",
"step": "DocumentScan"
}
The status field can be permissionsDenied, simulatorDetected, or unknown.
❗{/* [SME input needed: the type field has 6 possible values (confirmed by source review) but the values themselves are not documented. Provide the full list of type values. Escalation candidate: needs product/SDK-team knowledge.] */}
❗{/* [SME input needed: the failure example previously showed status: "userCancelled", but userCancelled is not in the documented status value list. Confirm whether userCancelled is a valid status value for DocumentScan.] */}
eKYB
This module validates a business identity using business information. Sources can include business name, addresses, city, state, postal code, and bank account number.
Example success response:
{
"status": "success",
"step": "eKYB"
}
The status field can be success or fail.
❗{/* [SME input needed: only a success response is documented for eKYB. Confirm whether a failure response includes any additional fields, or whether failure is conveyed solely through status: "fail" in the same structure. Escalation candidate: needs product/SDK-team knowledge.] */}
eKYC
This module validates a user identity using the user's information. Sources can include data obtained from an ID, proof of address, or manual capture.
Example success response:
{
"status": "success",
"step": "eKYC"
}
The status field can be success or fail.
❗{/* [SME input needed: only a success response is documented for eKYC. Confirm whether a failure response includes any additional fields, or whether failure is conveyed solely through status: "fail" in the same structure. Escalation candidate: needs product/SDK-team knowledge.] */}
This module asks the user to enter their email address.
Example success response:
{
"result": { "email": "email@example.com", "status": "success" },
"step": "Email"
}
Example failure response:
{
"status": "fail",
"step": "Email"
}
The status field can be success or fail.
FaceAuthentication
This module identifies a previously registered user using face recognition. It can be used to grant access to parts of your application or authorize high-value operations with low friction.
Example success response:
{
"result": {
"status": "success",
"customerUUID": "1234567890",
"selfieBase64": "abcdefg",
"selfieEncryptedBase64": "abcdefg",
"error": null
},
"step": "FaceAuthentication"
}
The result.status field can be success or fail. result.error can be one of 21 values: inactiveSession, nonexistentCustomer, lensesDetected, faceMaskDetected, headCoverDetected, closedEyesDetected, faceTooDark, spoofAttemptDetected, userIsNotRecognized, selfieImageLowQuality, hintNotProvided, faceNotFound, faceCroppingFailed, faceTooSmall, faceTooBlurry, badPhotoQuality, processingError, badRequest, deniedCameraPermissions, userCancelled, or unknown.
FaceMatch
This module checks whether the face from the scanned ID or passport and the face obtained from the SelfieScan module are a match.
Example success response:
{
"result": {
"status": "match",
"confidence": 1,
"nameMatched": false,
"existingUser": false,
"existingInterviewId": "exampleInterviewID",
"idCategory": "primary"
},
"step": "FaceMatch"
}
The result.status field can be match or mismatch. FaceMatch uses this same result structure for both matches and mismatches.
Geolocation
This module captures the current location of the user.
Example success response:
{
"result": {
"city": "Springfield",
"colony": "Springfield",
"postalCode": "555555",
"state": "Serbia",
"street": "Evergreen terrace"
},
"step": "Geolocation"
}
❗{/* [SME input needed: confirm the failure response structure for Geolocation. On failure it can report permissionsDenied, unknownError, noLocationExtracted, or locationUnavailable, but it's unconfirmed how the failure response is shaped. Escalation candidate: needs product/SDK-team knowledge.] */}
GlobalWatchlist
This module checks customer identities against sources of sanctions, Politically Exposed Persons (PEPs), and watchlists.
Example success response:
{
"status": "success",
"step": "GlobalWatchlist"
}
The status field can be success or fail. success means a match was found on the watchlist, which typically warrants further review. fail means no match was found.
GovernmentValidation
This module asks the user to input their information for validation against government services.
Example success response:
{
"status": "success",
"step": "GovernmentValidation"
}
The status field can be success or fail.
❗{/* [SME input needed: only a success response is documented for GovernmentValidation. Confirm whether a failure response includes any additional fields, or whether failure is conveyed solely through status: "fail" in the same structure. Escalation candidate: needs product/SDK-team knowledge.] */}
IdScan
Adding { module: 'IdScan' } to a flowConfig captures both sides of the ID in one combined module. On success, it fires two separate step completion events, IdScanFront and IdScanBack, rather than a single combined IdScan event. onStepCompleted does not accept IdScan as a module value; listen for IdScanFront and IdScanBack instead.
On error, IdScan fires one combined error event covering both sides, distinct from the individual front/back success statuses. Register it with IncodeSdk.onStepError({ module: 'IdScan', listener }):
{
"module": "IdScan",
"status": {
"front": "ok",
"back": "errorGlare"
},
"data": {"raw JSON OCR data"}
}
status.front and status.back can each be ok or one of several values indicating a scanning issue. The Incode UI informs the user about these errors and attempts the scan several times before responding with an error. Other values: errorClassification, noFacesFound, errorCropQuality, errorGlare, errorReadability, errorSharpness, errorTypeMismatch, userCancelled, unknownError, shadow, errorAddress, errorPassportClassification.
IdScanBack
Captures the back side of an ID document.
Example success response:
{
"result": {
"status": "ok",
"classifiedIdType": "Voter Identification",
"chosenIdType": "id",
"idCategory": "primary",
"image": { "pngBase64": "..." },
"croppedFace": { "pngBase64": "..." }
},
"step": "IdScanBack"
}
❗{/* [SME verify: confirm the example response structure and field placement (particularly whether these fields sit inside a result object as shown). The example JSON was constructed by AI using the documented field list, not copied from source.] */}
The result object includes:
image:IncdImageobject containingpngBase64of the captured back ID.croppedFace:IncdImageobject containingpngBase64of the cropped face from the back ID.classifiedIdType: string. The ID type as classified by Incode, for exampleVoter Identification.chosenIdType: string. The ID type the user chose to capture:idorpassport.idCategory: string. The ID category:primaryorsecondary.status: string. The scan outcome. When the value is anything other thanok, the scan or validation did not complete successfully. The Incode UI informs the user and retries several times before responding with an error. Possible non-success values:errorClassification,noFacesFound,errorGlare,errorReadability,errorSharpness,errorTypeMismatch,userCancelled,unknownError,errorShadow,errorPassportClassification.failReason: string (optional). The reason for the scan failure, if applicable.issueName: string (optional). The name of the issuing authority of the document.issueYear: number (optional). The year the document was issued.countryCode: string (optional). The country code of the document.allAttemptsExhausted: boolean (optional). Indicates whether all capture attempts have been exhausted.
IdScanFront
Captures the front side of an ID document.
Example success response:
{
"result": {
"status": "ok",
"classifiedIdType": "Voter Identification",
"chosenIdType": "id",
"idCategory": "primary",
"image": { "pngBase64": "..." },
"croppedFace": { "pngBase64": "..." }
},
"step": "IdScanFront"
}
❗{/* [SME verify: confirm the example response structure and field placement (particularly whether these fields sit inside a result object as shown). The example JSON was constructed by AI using the documented field list, not copied from source.] */}
The result object includes:
image:IncdImageobject containingpngBase64of the captured front ID.croppedFace:IncdImageobject containingpngBase64of the cropped face from the front ID.classifiedIdType: string. The ID type as classified by Incode, for exampleVoter Identification.chosenIdType: string. The ID type the user chose to capture:idorpassport.idCategory: string. The ID category:primaryorsecondary.status: string. The scan outcome. When the value is anything other thanok, the scan or validation did not complete successfully. The Incode UI informs the user and retries several times before responding with an error. Possible non-success values:errorClassification,noFacesFound,errorGlare,errorReadability,errorSharpness,errorTypeMismatch,userCancelled,unknownError,errorShadow,errorPassportClassification.failReason: string (optional). The reason for the scan failure, if applicable.issueName: string (optional). The name of the issuing authority of the document.issueYear: number (optional). The year the document was issued.countryCode: string (optional). The country code of the document.allAttemptsExhausted: boolean (optional). Indicates whether all capture attempts have been used.
MLConsent
This module asks the user for machine learning consent.
Example success response:
{
"status": "success",
"step": "MLConsent"
}
The status field can be success or fail.
❗{/* [SME input needed: confirm what happens when the user declines machine learning consent. Does the module return status: "fail", or does the flow end with userCancelled (as CombinedConsent does)? Escalation candidate: needs product/SDK-team knowledge.] */}
Name
This module asks the user to enter their name.
Example success response:
{
"status": "success",
"name": "exampleName",
"step": "Name"
}
The status field can be success or fail.
❗{/* [SME input needed: only a success response is documented for Name. Confirm whether a failure response includes any additional fields, or whether failure is conveyed solely through status: "fail" in the same structure. Escalation candidate: needs product/SDK-team knowledge.] */}
NFCScan
This module reads and verifies chip data from ePassports or ID cards to validate document authenticity, detect tampering, and enhance anti-spoofing.
Example success response:
{
"result": {
"status": "success",
"birthDate": "900101",
"compositeCheckDigit": "7",
"dateOfBirthCheckDigit": "3",
"documentCode": "TD3",
"documentNumber": "123456789",
"documentNumberCheckDigit": "5",
"expirationDateCheckDigit": "2",
"expireAt": "300101",
"gender": "M",
"issuingStateOrOrganization": "USA",
"nationality": "USA",
"optionalData1": "ABCDEFGHI",
"optionalData2": null,
"personalNumber": "987654321",
"personalNumberCheckDigit": "4",
"primaryIdentifier": "DOE",
"secondaryIdentifier": "JOHN MICHAEL"
},
"step": "NFCScan"
}
The result.status field can be success or fail.
❗{/* [SME input needed: only a success response is documented for NFCScan. Confirm whether a failure response includes any additional fields (such as an error code or reason), or whether failure is conveyed solely through status: "fail" in the same structure. Escalation candidate: needs product/SDK-team knowledge.] */}
Date fields such as birthDate and expireAt use YYMMDD format on Android. On iOS, they are returned as a native-formatted date string. All other fields are plain strings.
OCREdit
This module shows the user the parsed OCR data from their ID, which they can optionally edit.
Example success response:
{
"status": "success",
"step": "OCREdit"
}
The status field can be success or fail.
❗{/* [SME input needed: only a success response is documented for OCREdit. Confirm whether a failure response includes any additional fields, or whether failure is conveyed solely through status: "fail" in the same structure. Escalation candidate: needs product/SDK-team knowledge.] */}
Phone
This module asks the user to enter their phone number.
Example success response:
{
"result": { "phone": "+15555555555", "resultCode": "success" },
"step": "Phone"
}
The result.resultCode field can be success.
Example failure response:
{
"status": "error",
"step": "Phone"
}
The status field can be invalidSession, userCancelled, or error.
ProcessId
Processes the ID after the front and back captures. ProcessId does not have its own status or failure result; success or failure comes from the separate IdScanFront and IdScanBack events.
Example success response:
{
"result": {
"data": {
"fullAddress": "123 Evergreen Terrace, Springfield",
"address": {
"city": "Springfield",
"colony": "Springfield",
"postalCode": "555555",
"state": "Serbia",
"street": "Evergreen Terrace"
},
"birthDate": 631152000,
"expirationDate": "300101",
"gender": "M",
"name": "JOHN DOE",
"issueDate": "200101",
"numeroEmisionCredencial": "01"
},
"extendedOcrData": "{...}"
},
"step": "ProcessId"
}
❗{/* [SME verify: confirm the example response structure and field placement. The example JSON was constructed by AI using the documented field list, not copied from source. In particular, confirm the format of birthDate (shown as epoch time), expirationDate, and issueDate, which may use different formats.] */}
The result object includes:
data: theIdScanOcrDataobject containing the parsed OCR data. Confirmed identical on iOS and Android:fullAddressaddress: nested object withcity,colony,postalCode,state,streetbirthDateexpirationDategendernameissueDatenumeroEmisionCredencial
extendedOcrData: string. Raw JSON containing the full OCR data, for exampleexteriorNumber,interiorNumber,typeOfId,documentFrontSubtype.
Notes:
result.data.birthDateis in epoch time.
QrScan
This module captures the QR code on the back of the ID, extracts the data from it, and sends it to the server.
Example success response:
{
"result": { "idCic": "exampleIdCic" },
"step": "QrScan"
}
❗{/* [SME verify: the example response was constructed by AI using the confirmed field (idCic, a string, no status). Confirm the exact wrapper structure (whether idCic sits inside a result object and whether a step field is included).] */}
The result object contains a single field, idCic (a string). QrScan does not return a status.
SelfieScan
This module captures a selfie from the user.
Example success response:
{
"result": { "spoofAttempt": false, "status": "success", "allAttemptsExhausted": false },
"step": "SelfieScan",
"image": {
"pngBase64": "...PNG Base 64 encoded",
"encryptedBase64": "...PNG Encrypted Base 64 encoded"
}
}
The response includes:
result.spoofAttempt: boolean. Indicates whether a spoof attempt was detected.result.status: string. The capture outcome.result.allAttemptsExhausted: boolean (optional). Indicates whether all capture attempts have been exhausted.image.pngBase64: the captured selfie as a base64-encoded PNG.image.encryptedBase64: the captured selfie as an encrypted base64-encoded PNG.
Example failure response:
{
"status": "permissionsDenied",
"step": "SelfieScan"
}
The status field can be none, permissionsDenied, simulatorDetected, or spoofDetected.
Signature
This module asks the user to add a digital signature by signing on a canvas.
Example success response:
{
"result": { "status": "success", "image": "...PNG Base 64 encoded" },
"step": "Signature"
}
Example failure response:
{ "status": "error", "step": "Signature" }
The status field can be error or invalidSession.
UserConsent
This module asks the user to give consent.
Example success response:
{
"status": "success",
"step": "UserConsent"
}
If the user declines to give consent, the onboarding flow ends with a status of userCancelled.
UserScore
This module displays the user score to the user.
Example success response:
{
"result": {
"data": {
"existingUser": true,
"facialRecognitionScore": "0.0/100",
"idVerificationScore": "79.0/100",
"livenessOverallScore": "95.2/100",
"overallScore": "0.0/100",
"status": "fail"
},
"extendedUserScoreJsonData": "{..}"
},
"step": "UserScore"
}
The result object includes:
data: the parsed user score data.extendedUserScoreJsonData: a raw JSON string containing the full user score data.
The result.data.status field can be ok, warn, unknown, manual, or fail.
❗{/* [SME input needed: the status values appear to map to session statuses (ok = Pass, warn = Warn, fail = Fail, manual = Manual Review), but this mapping is unconfirmed and unknown has no obvious equivalent. Confirm whether these SDK values correspond to the session statuses, and define what unknown indicates. Note: UserScore does not appear to exist as a module on the native Android or iOS SDKs, so definitions could not be sourced there. Escalation candidate: needs product/scoring-team knowledge.] */}
❗{/* [SME input needed: extendedUserScoreJsonData is a raw JSON string with no schema defined in the SDK. Confirm one of: (a) the schema/fields it contains, (b) where customers can find it documented, or (c) that it's not intended as a documented contract customers should depend on. Escalation candidate: needs product/SDK-team knowledge.] */}
VideoSelfie
This module records the device's screen while the user takes a selfie, presents their ID, answers a series of questions, and accepts the terms and conditions. The recorded video is then uploaded and stored for later use.
❗{/* [SME action needed: VideoSelfie's result type is currently an empty placeholder in the SDK, so there is no result shape to document yet. This is an SDK-side gap, not a documentation gap. Flag to the SDK team to define the result type, then document it here once available.] */}