# Incode Developer Hub — full documentation > Public developer documentation and REST API reference for the Incode Omni identity platform — onboarding, SDKs, and integration guides. 992 pages. Each block below is one page: a metadata line, then the page's Markdown source. Blocks are separated by `---`. --- - Path: `api-reference/add-address-statement` - URL: https://developer.incode.com/api-reference/add-address-statement/ - Markdown: https://developer.incode.com/api-reference/add-address-statement.md - Endpoint: `POST /omni/add/address-statement` # Add proof of address `POST /omni/add/address-statement` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add a proof of address statement as a blob. OCR data from statement will be automatically extracted ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `format` | query | string | | Enum: `image`, `pdf` | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/address-statement \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/address-statement", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/address-statement", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/address-statement")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-address-statement-v2` - URL: https://developer.incode.com/api-reference/add-address-statement-v2/ - Markdown: https://developer.incode.com/api-reference/add-address-statement-v2.md - Endpoint: `POST /omni/add/address-statement/v2` # Add proof of address v2 `POST /omni/add/address-statement/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add a proof of address statement as a base64 string. OCR data from statement will be automatically extracted ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `format` | query | string | | Enum: `image`, `pdf` | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | yes | Base64 string representation of the image | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/address-statement/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/address-statement/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/address-statement/v2", headers=headers, json={ "base64Image": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/address-statement/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-back-id-v2` - URL: https://developer.incode.com/api-reference/add-back-id-v2/ - Markdown: https://developer.incode.com/api-reference/add-back-id-v2.md - Endpoint: `POST /omni/add/back-id/v2` # Add back side of ID `POST /omni/add/back-id/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used for storing back side of id for further processing. Image quality check is performed during that call. Number of retries is not limited. Once [process-id](#/Onboarding/processId) is finished, this endpoint cannot be called for retries. **Note**: Front-side of id should be uploaded before back side. In case of passport or only front sided documents, this endpoint should not be called. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `retry` | query | boolean | | Flag stating that this is retry attempt for add/back-id | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | | Image in base64 format. One of base64Image or imageUrl is required | | `imageUrl` | string | | URL of the image. One of base64Image or imageUrl is required | ## Responses ### 200 In case there's some issue when calling the endpoint due to classification failed, an issue such as bad quality, or any of the fail reasons the response will always have the field: - classification - failReason - sharpness - glare - horizontalResolution We recommend considering the call as failed if there's a failReason in the response or if the classification is false. Possible values for fail reason: - UNKNOWN_DOCUMENT_TYPE: document classification failed - WRONG_DOCUMENT_SIDE: can happen when uploading back side of id when front id is required or the other way around - WRONG_ONE_SIDED_DOCUMENT: uploading wrong document with only one side - WRONG_UNFOLDED_DOCUMENT: uploading unfolded document with unrecognizable sides - UNFOLDED_DOCUMENT_PAGE_MISMATCH: uploading unfolded document with mismatching sides - DOCUMENT_NOT_READABLE: document couldn't be read, probably due to image quality - UNABLE_TO_ALIGN_DOCUMENT: alignment failed - ID_TYPE_UNACCEPTABLE: invalid type of id - UNEXPECTED_ERROR_OCCURRED: unexpected error Whenever the classification is done successfully the fields that will always be present are: - classification - sharpness - glare - horizontalResolution - readibility - typeOfId - sessionStatus The remaining fields could be optional depending on the specific type of id and country of origin. Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `correctSharpness` | boolean | | It's true if the sharpness of the ID meets the requirements. | | `correctGlare` | boolean | | It's true if the glare of the ID meets the requirements. | | `horizontalResolution` | integer (int32) | | Value is based on the resolution of the cropped photo. Low value means after performing the crop we have a bad quality of image. We recommend to retry capture if value is below 155. | | `shadowConfidence` | number (float) | | Value 0 means it is no shadow on the image and image quality is good, while value 1 represents bad quality of image with a lot of shadow. We recommend to retry capture if value is 1. | | `classification` | boolean | | If true, server classified image as a front side of an id. If false, server failed to classify image as valid front side of an id or passport and other parameters can be ignored. | | `readability` | boolean | | If true, server can properly read ID. If false server failed to read some key places of the ID. | | `typeOfId` | string | | Enum: `Unknown`, `Passport`, `Visa`, `DriversLicense`, `IdentificationCard`, `Permit`, `Currency`, `ResidenceDocument`, `TravelDocument`, `BirthCertificate`, `VehicleRegistration`, `Other`, `WeaponLicense`, `TribalIdentification`, `VoterIdentification`, `Military`, `TaxIdentification`, `FederalID`, `MedicalCard` | | `issueYear` | integer (int32) | | Issue year of the ID. | | `issueName` | string | | Description of the ID. Could contain country code, state, type of ID, subtype of ID. | | `curpCheck` | boolean | | Only for Mexican IDs. Flag stating if curp was properly read. | | `sessionStatus` | string | | Session Status Enum: `Alive`, `Closed`, `Deleted` | | `countryCode` | string | | Valid ISO alpha-2 or alpha-3 code of the ID issuing country. | | `state` | string | | Issuing state of the ID. | | `failReason` | string | | Classification fail reason Enum: `UNKNOWN_DOCUMENT_TYPE`, `WRONG_DOCUMENT_SIDE`, `WRONG_ONE_SIDED_DOCUMENT`, `UNFOLDED_DOCUMENT_PAGE_MISMATCH`, `WRONG_UNFOLDED_DOCUMENT`, `DOCUMENT_NOT_READABLE`, `UNABLE_TO_ALIGN_DOCUMENT`, `ID_TYPE_UNACCEPTABLE`, `UNEXPECTED_ERROR_OCCURRED`, `DIGITAL_ID_REQUESTED_BUT_OTHER_PROVIDED` | | `skipBackIdCapture` | boolean | | Flag that signals if back id capture should be skipped or not. | | `forceFrontIdCapture` | boolean | | Flag that signals if front id capture must be executed after back. | | `showMandatoryConsent` | boolean | | Render mandatory consent page based on this parameter value. | | `regulationType` | string | | Regulation type for the mandatory consent (only if showMandatoryConsent set to true). | | `skipGlareFront` | boolean | | Flag that signals if front side glare should be ignored. | | `skipGlareBack` | boolean | | Flag that signals if back side glare should be ignored. | | `documentIsOnTheEdge` | boolean | | Flag that signals if document is on the edge on the full frame image. | | `acceptedDocuments` | array[string] | | List of accepted documents for that particular country in case of ID_TYPE_UNACCEPTABLE failReason. | | `imageRedacted` | boolean | | Flag that signals if image was redacted as part of the ID capture. | | `idFaceExtractionSkipped` | boolean | | True when biometric face extraction from the front ID was skipped because the client passed extractIdFace=false. While this flag is true, face-match flows that require an ID-side template cannot run; the flag is cleared on a subsequent add/front-id call where extractIdFace is true (or omitted). | | `captureAttemptsLimit` | CaptureAttemptsLimitDto | | Checked only if configured in the session flow. | | `captureAttemptsLimit.max` | integer (int32) | | Maximum number of attempts to capture a photo. | | `captureAttemptsLimit.remaining` | integer (int32) | | Number of remaining attempts to capture a photo. | | `idQualityAttemptApproved` | boolean | | ID quality check result based on ML readability estimation. True if perFieldReadability >= 0.38, false otherwise. Only available for Mexican documents when feature is enabled. | | `isDocumentExpired` | boolean | | Flag indicating if the document side is expired. | | `attemptId` | string | | Created attempt id. | ### 400 Custom error statuses: - 4004: Could not find user - 5003: Unsatisfied image size Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/back-id/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "imageUrl": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/back-id/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "imageUrl": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/back-id/v2", headers=headers, json={ "base64Image": "", "imageUrl": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/back-id/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"imageUrl\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "correctSharpness": true, "correctGlare": true, "horizontalResolution": 0, "shadowConfidence": 0, "classification": true, "readability": true, "typeOfId": "Unknown", "issueYear": 0, "issueName": "string", "curpCheck": true, "sessionStatus": "Alive", "countryCode": "string", "state": "string", "failReason": "UNKNOWN_DOCUMENT_TYPE", "skipBackIdCapture": true, "forceFrontIdCapture": true, "showMandatoryConsent": true, "regulationType": "string", "skipGlareFront": true, "skipGlareBack": true, "documentIsOnTheEdge": true, "acceptedDocuments": [ "Unknown" ], "imageRedacted": true, "idFaceExtractionSkipped": true, "captureAttemptsLimit": { "max": 0, "remaining": 0 }, "idQualityAttemptApproved": true, "isDocumentExpired": true, "attemptId": "string" } ``` --- - Path: `api-reference/add-back-second-id-v2` - URL: https://developer.incode.com/api-reference/add-back-second-id-v2/ - Markdown: https://developer.incode.com/api-reference/add-back-second-id-v2.md - Endpoint: `POST /omni/add/back-second-id/v2` # Add back side of Second ID `POST /omni/add/back-second-id/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Image quality check is performed during that call. Number of retries is not limited. Once id processing is finished, this endpoint cannot be called for retries. Front side of id should be uploaded before back side. In case of passport, this endpoint should not be called. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `captureType` | query | string | | Enum: `AUTO`, `MANUAL`, `NATIVE`, `UPLOAD` | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | | Image in base64 format. One of base64Image or imageUrl is required | | `imageUrl` | string | | URL of the image. One of base64Image or imageUrl is required | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `correctSharpness` | boolean | | It's true if the sharpness of the ID meets the requirements. | | `correctGlare` | boolean | | It's true if the glare of the ID meets the requirements. | | `horizontalResolution` | integer (int32) | | Value is based on the resolution of the cropped photo. Low value means after performing the crop we have a bad quality of image. We recommend to retry capture if value is below 155. | | `shadowConfidence` | number (float) | | Value 0 means it is no shadow on the image and image quality is good, while value 1 represents bad quality of image with a lot of shadow. We recommend to retry capture if value is 1. | | `classification` | boolean | | If true, server classified image as a front side of an id. If false, server failed to classify image as valid front side of an id or passport and other parameters can be ignored. | | `readability` | boolean | | If true, server can properly read ID. If false server failed to read some key places of the ID. | | `typeOfId` | string | | Enum: `Unknown`, `Passport`, `Visa`, `DriversLicense`, `IdentificationCard`, `Permit`, `Currency`, `ResidenceDocument`, `TravelDocument`, `BirthCertificate`, `VehicleRegistration`, `Other`, `WeaponLicense`, `TribalIdentification`, `VoterIdentification`, `Military`, `TaxIdentification`, `FederalID`, `MedicalCard` | | `issueYear` | integer (int32) | | Issue year of the ID. | | `issueName` | string | | Description of the ID. Could contain country code, state, type of ID, subtype of ID. | | `curpCheck` | boolean | | Only for Mexican IDs. Flag stating if curp was properly read. | | `sessionStatus` | string | | Session Status Enum: `Alive`, `Closed`, `Deleted` | | `countryCode` | string | | Valid ISO alpha-2 or alpha-3 code of the ID issuing country. | | `state` | string | | Issuing state of the ID. | | `failReason` | string | | Classification fail reason Enum: `UNKNOWN_DOCUMENT_TYPE`, `WRONG_DOCUMENT_SIDE`, `WRONG_ONE_SIDED_DOCUMENT`, `UNFOLDED_DOCUMENT_PAGE_MISMATCH`, `WRONG_UNFOLDED_DOCUMENT`, `DOCUMENT_NOT_READABLE`, `UNABLE_TO_ALIGN_DOCUMENT`, `ID_TYPE_UNACCEPTABLE`, `UNEXPECTED_ERROR_OCCURRED`, `DIGITAL_ID_REQUESTED_BUT_OTHER_PROVIDED` | | `skipBackIdCapture` | boolean | | Flag that signals if back id capture should be skipped or not. | | `forceFrontIdCapture` | boolean | | Flag that signals if front id capture must be executed after back. | | `showMandatoryConsent` | boolean | | Render mandatory consent page based on this parameter value. | | `regulationType` | string | | Regulation type for the mandatory consent (only if showMandatoryConsent set to true). | | `skipGlareFront` | boolean | | Flag that signals if front side glare should be ignored. | | `skipGlareBack` | boolean | | Flag that signals if back side glare should be ignored. | | `documentIsOnTheEdge` | boolean | | Flag that signals if document is on the edge on the full frame image. | | `acceptedDocuments` | array[string] | | List of accepted documents for that particular country in case of ID_TYPE_UNACCEPTABLE failReason. | | `imageRedacted` | boolean | | Flag that signals if image was redacted as part of the ID capture. | | `idFaceExtractionSkipped` | boolean | | True when biometric face extraction from the front ID was skipped because the client passed extractIdFace=false. While this flag is true, face-match flows that require an ID-side template cannot run; the flag is cleared on a subsequent add/front-id call where extractIdFace is true (or omitted). | | `captureAttemptsLimit` | CaptureAttemptsLimitDto | | Checked only if configured in the session flow. | | `captureAttemptsLimit.max` | integer (int32) | | Maximum number of attempts to capture a photo. | | `captureAttemptsLimit.remaining` | integer (int32) | | Number of remaining attempts to capture a photo. | | `idQualityAttemptApproved` | boolean | | ID quality check result based on ML readability estimation. True if perFieldReadability >= 0.38, false otherwise. Only available for Mexican documents when feature is enabled. | | `isDocumentExpired` | boolean | | Flag indicating if the document side is expired. | | `attemptId` | string | | Created attempt id. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/back-second-id/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "imageUrl": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/back-second-id/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "imageUrl": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/back-second-id/v2", headers=headers, json={ "base64Image": "", "imageUrl": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/back-second-id/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"imageUrl\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "correctSharpness": true, "correctGlare": true, "horizontalResolution": 0, "shadowConfidence": 0, "classification": true, "readability": true, "typeOfId": "Unknown", "issueYear": 0, "issueName": "string", "curpCheck": true, "sessionStatus": "Alive", "countryCode": "string", "state": "string", "failReason": "UNKNOWN_DOCUMENT_TYPE", "skipBackIdCapture": true, "forceFrontIdCapture": true, "showMandatoryConsent": true, "regulationType": "string", "skipGlareFront": true, "skipGlareBack": true, "documentIsOnTheEdge": true, "acceptedDocuments": [ "Unknown" ], "imageRedacted": true, "idFaceExtractionSkipped": true, "captureAttemptsLimit": { "max": 0, "remaining": 0 }, "idQualityAttemptApproved": true, "isDocumentExpired": true, "attemptId": "string" } ``` --- - Path: `api-reference/add-barcode` - URL: https://developer.incode.com/api-reference/add-barcode/ - Markdown: https://developer.incode.com/api-reference/add-barcode.md - Endpoint: `POST /omni/add/barcode` # Add Barcode `POST /omni/add/barcode` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add raw barcode and parse it to interview. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `rawBarcode` | string | | Barcode in raw format | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/barcode \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "rawBarcode": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/barcode", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "rawBarcode": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/barcode", headers=headers, json={ "rawBarcode": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/barcode")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"rawBarcode\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-barcode-v2` - URL: https://developer.incode.com/api-reference/add-barcode-v2/ - Markdown: https://developer.incode.com/api-reference/add-barcode-v2.md - Endpoint: `POST /omni/add/barcode/v2` # Add Base64 Barcode `POST /omni/add/barcode/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add Base64 barcode and parse it to interview. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Barcode` | string | | Barcode in base64 format. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/barcode/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Barcode": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/barcode/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Barcode": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/barcode/v2", headers=headers, json={ "base64Barcode": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/barcode/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Barcode\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-barcode-v3` - URL: https://developer.incode.com/api-reference/add-barcode-v3/ - Markdown: https://developer.incode.com/api-reference/add-barcode-v3.md - Endpoint: `POST /omni/add/barcode/v3` # Add Base64 Barcode `POST /omni/add/barcode/v3` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add Base64 barcode and parse it to interview. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `processId` | query | boolean | | Flag stating if id validation should be automatically performed | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Barcode` | string | | Barcode in base64 format. | ## Responses ### 200 Response: - forceFrontIdCapture: Boolean. Flag that signals if front id capture must be executed after barcode being added. - sessionStatus: SessionStatus. Session status Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `countryCode` | string | | Valid ISO alpha-2 or alpha-3 code of the barcode issuing country. | | `forceFrontIdCapture` | boolean | | Flag that signals if front id capture must be executed after barcode being added. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `idValidationCompleted` | boolean | | Flag that indicates whether ID validation has been completed. | | `isDocumentExpired` | boolean | | Flag indicating if the document is expired. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/barcode/v3 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Barcode": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/barcode/v3", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Barcode": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/barcode/v3", headers=headers, json={ "base64Barcode": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/barcode/v3")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Barcode\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "countryCode": "string", "forceFrontIdCapture": true, "sessionStatus": "Alive", "idValidationCompleted": true, "isDocumentExpired": true } ``` --- - Path: `api-reference/add-conference-consent` - URL: https://developer.incode.com/api-reference/add-conference-consent/ - Markdown: https://developer.incode.com/api-reference/add-conference-consent.md - Endpoint: `POST /omni/add/conference-consent` # Save user consent `POST /omni/add/conference-consent` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Save information indicating that user has accepted terms and conditions and other checks on conference. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | yes | ID of interview for which consent needs to be given. | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `conferenceTermAndConditionsAccepted` | boolean | | User accepts terms and conditions. | | `creditBureauConsentGiven` | boolean | | User accepts credit bureau check. | | `applicantDataConfirmed` | boolean | | Executive has verified user data. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/conference-consent \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "conferenceTermAndConditionsAccepted": false, "creditBureauConsentGiven": false, "applicantDataConfirmed": false }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/conference-consent", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "conferenceTermAndConditionsAccepted": false, "creditBureauConsentGiven": false, "applicantDataConfirmed": false }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/conference-consent", headers=headers, json={ "conferenceTermAndConditionsAccepted": False, "creditBureauConsentGiven": False, "applicantDataConfirmed": False }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/conference-consent")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"conferenceTermAndConditionsAccepted\": false,\n \"creditBureauConsentGiven\": false,\n \"applicantDataConfirmed\": false\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-conference-feedback` - URL: https://developer.incode.com/api-reference/add-conference-feedback/ - Markdown: https://developer.incode.com/api-reference/add-conference-feedback.md - Endpoint: `POST /omni/add/conference/feedback` # Add conference feedback `POST /omni/add/conference/feedback` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used for adding conference feedback for the interview/session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | yes | | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `feedback` | string | | Feedback to save | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/conference/feedback \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "feedback": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/conference/feedback", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "feedback": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/conference/feedback", headers=headers, json={ "feedback": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/conference/feedback")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"feedback\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-conference-module` - URL: https://developer.incode.com/api-reference/add-conference-module/ - Markdown: https://developer.incode.com/api-reference/add-conference-module.md - Endpoint: `POST /omni/add/conference-module` # Add conference module `POST /omni/add/conference-module` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add conference module with name, url and icon (base64). ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | | | | `url` | string | | | | `iconBase64` | string | | | | `index` | string | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/conference-module \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "name": "", "url": "", "iconBase64": "", "index": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/conference-module", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "name": "", "url": "", "iconBase64": "", "index": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/conference-module", headers=headers, json={ "name": "", "url": "", "iconBase64": "", "index": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/conference-module")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"name\": \"\",\n \"url\": \"\",\n \"iconBase64\": \"\",\n \"index\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-conference-notes` - URL: https://developer.incode.com/api-reference/add-conference-notes/ - Markdown: https://developer.incode.com/api-reference/add-conference-notes.md - Endpoint: `POST /omni/add/conference/notes` # Add notes `POST /omni/add/conference/notes` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used for adding notes for interview/session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `notes` | string | | Notes to save | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/conference/notes \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "notes": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/conference/notes", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "notes": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/conference/notes", headers=headers, json={ "notes": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/conference/notes")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"notes\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-curp` - URL: https://developer.incode.com/api-reference/add-curp/ - Markdown: https://developer.incode.com/api-reference/add-curp.md - Endpoint: `POST /omni/add/curp` # Add curp `POST /omni/add/curp` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add curp and the validation process result to interview. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `curp` | string | | User's curp. Has to be in valid format. If it isn't present, then curp value from interview is used. | ## Responses ### 200 Respuesta con validación de CURP ```json { "success": true, "curp": "XXXX820814HDFABC01", "sex": "MUJER", "nationality": "MEX", "result": "success", "requestData": { "name": "JUANA", "firstLastName": "PEREZ", "secondLastName": "LOPEZ", "gender": "M", "birthDate": "14/08/1982", "state": "DF" }, "transactionId": "transaction1234567890", "renapo_valid": true, "names": "JUANA", "paternal_surname": "PEREZ", "mothers_maiden_name": "LOPEZ", "birthdate": "14/08/1982", "entity_birth": "DF", "probation_document": "1", "probation_document_data": { "foja": "", "numEntidadReg": "09", "libro": "", "NumRegExtranjeros": "", "cveEntidadNac": "DF", "numActa": "00001", "CRIP": "", "tomo": "", "cveEntidadEmisora": "", "anioReg": "1982", "cveMunicipioReg": "001", "FolioCarta": "" }, "status_curp": "RCN", "deceasedStatus": "ALIVE" } ``` ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ### 500 Internal error during CURP validation. ### 504 The request to validate the CURP exceeded the allowed time limit ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/curp \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "curp": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/curp", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "curp": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/curp", headers=headers, json={ "curp": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/curp")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"curp\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "curp": "XXXX820814HDFABC01", "sex": "MUJER", "nationality": "MEX", "result": "success", "requestData": { "name": "JUANA", "firstLastName": "PEREZ", "secondLastName": "LOPEZ", "gender": "M", "birthDate": "14/08/1982", "state": "DF" }, "transactionId": "transaction1234567890", "renapo_valid": true, "names": "JUANA", "paternal_surname": "PEREZ", "mothers_maiden_name": "LOPEZ", "birthdate": "14/08/1982", "entity_birth": "DF", "probation_document": "1", "probation_document_data": { "foja": "", "numEntidadReg": "09", "libro": "", "NumRegExtranjeros": "", "cveEntidadNac": "DF", "numActa": "00001", "CRIP": "", "tomo": "", "cveEntidadEmisora": "", "anioReg": "1982", "cveMunicipioReg": "001", "FolioCarta": "" }, "status_curp": "RCN", "deceasedStatus": "ALIVE" } ``` --- - Path: `api-reference/add-curp-v2` - URL: https://developer.incode.com/api-reference/add-curp-v2/ - Markdown: https://developer.incode.com/api-reference/add-curp-v2.md - Endpoint: `POST /omni/add/curp/v2` # Add curp v2 `POST /omni/add/curp/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add CURP and validation result based on a person data. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | | | | `api-version` | header | string | yes | | ## Request body Valid values for state are the ones listed by renapo in this link: [https://es.wikipedia.org/wiki/Plantilla:Abreviaciones_de_los_estados_de_México](https://es.wikipedia.org/wiki/Plantilla:Abreviaciones_de_los_estados_de_México) Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `curp` | string | | User's curp. Has to be in valid format. If it isn't present, then curp value from interview is used. | | `name` | string | | | | `firstLastName` | string | | | | `secondLastName` | string | | | | `gender` | string | | Valid gender values are "H" (Hombre, male), "M" (mujer, female) and "X" (otro, other) Enum: `H`, `M`, `X` | | `birthDate` | string (dd/mm/yyyy) | | | | `state` | string | | | | `externalId` | string | | | ## Responses ### 200 Respuesta con validación de CURP ```json { "success": true, "curp": "XXXX820814HDFABC01", "sex": "MUJER", "nationality": "MEX", "result": "success", "requestData": { "name": "JUANA", "firstLastName": "PEREZ", "secondLastName": "LOPEZ", "gender": "M", "birthDate": "14/08/1982", "state": "DF" }, "transactionId": "transaction1234567890", "renapo_valid": true, "names": "JUANA", "paternal_surname": "PEREZ", "mothers_maiden_name": "LOPEZ", "birthdate": "14/08/1982", "entity_birth": "DF", "probation_document": "1", "probation_document_data": { "foja": "", "numEntidadReg": "09", "libro": "", "NumRegExtranjeros": "", "cveEntidadNac": "DF", "numActa": "00001", "CRIP": "", "tomo": "", "cveEntidadEmisora": "", "anioReg": "1982", "cveMunicipioReg": "001", "FolioCarta": "" }, "status_curp": "RCN", "deceasedStatus": "ALIVE" } ``` ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ### 500 Internal error during CURP validation. ### 504 The request to validate the CURP exceeded the allowed time limit ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/curp/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "curp": "", "name": "", "firstLastName": "", "secondLastName": "", "gender": "", "birthDate": "", "state": "", "externalId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/curp/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "curp": "", "name": "", "firstLastName": "", "secondLastName": "", "gender": "", "birthDate": "", "state": "", "externalId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/curp/v2", headers=headers, json={ "curp": "", "name": "", "firstLastName": "", "secondLastName": "", "gender": "", "birthDate": "", "state": "", "externalId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/curp/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"curp\": \"\",\n \"name\": \"\",\n \"firstLastName\": \"\",\n \"secondLastName\": \"\",\n \"gender\": \"\",\n \"birthDate\": \"\",\n \"state\": \"\",\n \"externalId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "curp": "XXXX820814HDFABC01", "sex": "MUJER", "nationality": "MEX", "result": "success", "requestData": { "name": "JUANA", "firstLastName": "PEREZ", "secondLastName": "LOPEZ", "gender": "M", "birthDate": "14/08/1982", "state": "DF" }, "transactionId": "transaction1234567890", "renapo_valid": true, "names": "JUANA", "paternal_surname": "PEREZ", "mothers_maiden_name": "LOPEZ", "birthdate": "14/08/1982", "entity_birth": "DF", "probation_document": "1", "probation_document_data": { "foja": "", "numEntidadReg": "09", "libro": "", "NumRegExtranjeros": "", "cveEntidadNac": "DF", "numActa": "00001", "CRIP": "", "tomo": "", "cveEntidadEmisora": "", "anioReg": "1982", "cveMunicipioReg": "001", "FolioCarta": "" }, "status_curp": "RCN", "deceasedStatus": "ALIVE" } ``` --- - Path: `api-reference/add-custom-fields` - URL: https://developer.incode.com/api-reference/add-custom-fields/ - Markdown: https://developer.incode.com/api-reference/add-custom-fields.md - Endpoint: `POST /omni/add/custom-fields` # Add custom fields `POST /omni/add/custom-fields` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used for adding custom fields to current onboarding session. The key must match one of the keys that are defined for the Organization, and the value must be of the type that is defined for the corresponding key. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `customFields` | object | | Used to send any additional information in key value pair format. Max fields: {maxEntries}, max key length: {keyMaxLength}, max value length: {valueMaxLength} | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/custom-fields \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "customFields": {} }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/custom-fields", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "customFields": {} }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/custom-fields", headers=headers, json={ "customFields": {} }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/custom-fields")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"customFields\": {}\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-device-fingerprint` - URL: https://developer.incode.com/api-reference/add-device-fingerprint/ - Markdown: https://developer.incode.com/api-reference/add-device-fingerprint.md - Endpoint: `POST /omni/add/device-fingerprint` # Add device fingerprint `POST /omni/add/device-fingerprint` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Sends information about device from which endpoint is called ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `deviceType` | string | yes | Platform of device Enum: `IOS`, `ANDROID`, `WEBAPP` | | `hash` | string | yes | Hash code of the device fingerprint | | `ip` | string | yes | IP address of the device | | `ipLocation` | IpLocationDto | | Location info based on IP address | | `ipLocation.ipCountry` | string | | Country from IP address | | `ipLocation.ipRegion` | string | | Region from IP address | | `ipLocation.ipCity` | string | | City from IP address | | `ipLocation.ipLatitude` | number (double) | | Latitude from IP address | | `ipLocation.ipLongitude` | number (double) | | Longitude from IP address | | `data` | string | yes | Additional data about device | | `osVersion` | string | | OS version. If omitted it is parsed from user agent | | `deviceModel` | string | | Device model. If omitted it is parsed from user agent | | `sdkVersion` | string | | Version of SDK used | | `hostingApp` | string | | hostingApp. Name of the hosting application | | `algorithmName` | string | | Name of the fingerprinting algorithm used to produce the hash | | `algorithmVersion` | string | | Version of the fingerprinting algorithm used to produce the hash | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `ipCountry` | string | | Current country based on the geolocation Api | | `ipState` | string | | Current state based on the geolocation Api | | `showMandatoryConsent` | boolean | | Render mandatory consent page based on this parameter value. | | `regulationType` | string | | Regulation type for the mandatory consent (only if showMandatoryConsent set to true). | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/device-fingerprint \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "deviceType": "", "hash": "", "ip": "", "ipLocation": "", "ipLocation.ipCountry": "", "ipLocation.ipRegion": "", "ipLocation.ipCity": "", "ipLocation.ipLatitude": 0, "ipLocation.ipLongitude": 0, "data": "", "osVersion": "", "deviceModel": "", "sdkVersion": "", "hostingApp": "", "algorithmName": "", "algorithmVersion": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/device-fingerprint", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "deviceType": "", "hash": "", "ip": "", "ipLocation": "", "ipLocation.ipCountry": "", "ipLocation.ipRegion": "", "ipLocation.ipCity": "", "ipLocation.ipLatitude": 0, "ipLocation.ipLongitude": 0, "data": "", "osVersion": "", "deviceModel": "", "sdkVersion": "", "hostingApp": "", "algorithmName": "", "algorithmVersion": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/device-fingerprint", headers=headers, json={ "deviceType": "", "hash": "", "ip": "", "ipLocation": "", "ipLocation.ipCountry": "", "ipLocation.ipRegion": "", "ipLocation.ipCity": "", "ipLocation.ipLatitude": 0, "ipLocation.ipLongitude": 0, "data": "", "osVersion": "", "deviceModel": "", "sdkVersion": "", "hostingApp": "", "algorithmName": "", "algorithmVersion": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/device-fingerprint")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"deviceType\": \"\",\n \"hash\": \"\",\n \"ip\": \"\",\n \"ipLocation\": \"\",\n \"ipLocation.ipCountry\": \"\",\n \"ipLocation.ipRegion\": \"\",\n \"ipLocation.ipCity\": \"\",\n \"ipLocation.ipLatitude\": 0,\n \"ipLocation.ipLongitude\": 0,\n \"data\": \"\",\n \"osVersion\": \"\",\n \"deviceModel\": \"\",\n \"sdkVersion\": \"\",\n \"hostingApp\": \"\",\n \"algorithmName\": \"\",\n \"algorithmVersion\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "ipCountry": "string", "ipState": "string", "showMandatoryConsent": true, "regulationType": "string" } ``` --- - Path: `api-reference/add-device-fingerprint-signals` - URL: https://developer.incode.com/api-reference/add-device-fingerprint-signals/ - Markdown: https://developer.incode.com/api-reference/add-device-fingerprint-signals.md - Endpoint: `POST /omni/add/device-fingerprint-signals` # Add device fingerprint signals `POST /omni/add/device-fingerprint-signals` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Records signals (device, network, behaviour, or PID) captured during an interview event ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `metadata` | string | yes | HMAC-signed Base64-encoded metadata blob. Format: .. Inner JSON shape: DeviceFingerprintSignalsMetadataDto (fields: timestamp, signalsType, payload, sdkPlatform, sdkVersion, signalsVersion). Server verifies HMAC via the service-configured `hmac_key` and rejects expired/replayed signatures based on the per-tenant CaptureMetadataConfig timestamp threshold. | | `interviewEvent` | string | yes | Frontend interview-event code categorizing these signals; resolved against the interview-event dictionary (must be a FRONTEND-sender code, e.g. "captureAttemptFinished"). | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/device-fingerprint-signals \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "metadata": "", "interviewEvent": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/device-fingerprint-signals", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "metadata": "", "interviewEvent": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/device-fingerprint-signals", headers=headers, json={ "metadata": "", "interviewEvent": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/device-fingerprint-signals")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"metadata\": \"\",\n \"interviewEvent\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-diagnostics-data` - URL: https://developer.incode.com/api-reference/add-diagnostics-data/ - Markdown: https://developer.incode.com/api-reference/add-diagnostics-data.md - Endpoint: `POST /omni/add/diagnostics-data` # Forward diagnostics data `POST /omni/add/diagnostics-data` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Accepts an encrypted TrueSight diagnostics envelope from the SDK, enriches it with server-resolved clientId and environment, and forwards it to TrueSight. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `version` | integer (int32) | | Envelope format version | | `alg` | string | | Encryption algorithm | | `compression` | string | | Compression algorithm | | `kid` | string | | Key identifier | | `iv` | string | | Initialization vector (Base64) | | `ciphertext` | string | | Encrypted diagnostics payload (Base64) | | `tag` | string | | Authentication tag (Base64) | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `forwarded` | boolean | | True when the diagnostics envelope was forwarded to TrueSight. False when diagnostics ingest is not enabled in this environment. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/diagnostics-data \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "version": 0, "alg": "", "compression": "", "kid": "", "iv": "", "ciphertext": "", "tag": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/diagnostics-data", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "version": 0, "alg": "", "compression": "", "kid": "", "iv": "", "ciphertext": "", "tag": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/diagnostics-data", headers=headers, json={ "version": 0, "alg": "", "compression": "", "kid": "", "iv": "", "ciphertext": "", "tag": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/diagnostics-data")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"version\": 0,\n \"alg\": \"\",\n \"compression\": \"\",\n \"kid\": \"\",\n \"iv\": \"\",\n \"ciphertext\": \"\",\n \"tag\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "forwarded": true } ``` --- - Path: `api-reference/add-document` - URL: https://developer.incode.com/api-reference/add-document/ - Markdown: https://developer.incode.com/api-reference/add-document.md - Endpoint: `POST /omni/add/document` # Add document `POST /omni/add/document` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Upload document image and store data. **Note**: Make sure to put the 'Content-Type' header as 'Content-Type: image/jpeg' or 'Content-Type: image/png'. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `type` | query | string | yes | - **signature**: Upload user's digital signature. This can be later fetched in get images endpoint. - **document**: Upload user's proof of address document. This can be later fetched in get images endpoint. - **addressStatement**: (Legacy) Upload user's proof of address document. Used for backward compatibility. Use type 'document' instead. - **medicalDoc**: Upload user's medical document. - **thirdId**: Upload user's third ID. - **contract**: Upload contract image. Enum: `signature`, `document`, `medicalDoc`, `thirdId`, `contract` | | `title` | query | string | | Only if type is contract. Title of contract. | | `format` | query | string | | Only if type is document. Possible values are image (jpg and png supported) or pdf. Default is image. Enum: `image`, `pdf` | | `api-version` | header | string | yes | | ## Request body Binary Image. Content-Type: `application/json` ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/document \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/document", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/document", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/document")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-document-async` - URL: https://developer.incode.com/api-reference/add-document-async/ - Markdown: https://developer.incode.com/api-reference/add-document-async.md - Endpoint: `POST /omni/add/document/async` # Add document asynchronously `POST /omni/add/document/async` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Upload document image and store data asynchronously. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `type` | query | string | yes | - **signature**: Upload user's digital signature. This can be later fetched in get images endpoint. - **document**: Upload user's proof of address document. This can be later fetched in get images endpoint. - **addressStatement**: (Legacy) Upload user's proof of address document. Used for backward compatibility. Use type 'document' instead. - **medicalDoc**: Upload user's medical document. - **thirdId**: Upload user's third ID. - **contract**: Upload contract image. Enum: `signature`, `document`, `medicalDoc`, `thirdId`, `contract` | | `title` | query | string | | Only if type is contract. Title of contract. | | `format` | query | string | | Only if type is document. Possible values are image (jpg and png supported) or pdf. Default is image. Enum: `image`, `pdf` | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | | Image in base64 format. One of base64Image or imageUrl is required | | `imageUrl` | string | | URL of the image. One of base64Image or imageUrl is required | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/document/async \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "imageUrl": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/document/async", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "imageUrl": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/document/async", headers=headers, json={ "base64Image": "", "imageUrl": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/document/async")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"imageUrl\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-document-id` - URL: https://developer.incode.com/api-reference/add-document-id/ - Markdown: https://developer.incode.com/api-reference/add-document-id.md - Endpoint: `POST /omni/add/document-id` # Add document id `POST /omni/add/document-id` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Upload document identifier. For Mexican id it is cic from the back of id. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `documentIdentifier` | string | | Document id. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/document-id \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "documentIdentifier": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/document-id", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "documentIdentifier": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/document-id", headers=headers, json={ "documentIdentifier": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/document-id")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"documentIdentifier\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-document-v2` - URL: https://developer.incode.com/api-reference/add-document-v2/ - Markdown: https://developer.incode.com/api-reference/add-document-v2.md - Endpoint: `POST /omni/add/document/v2` # Add document V2 `POST /omni/add/document/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Upload document image and store data. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `type` | query | string | yes | - **signature**: Upload user's digital signature. This can be later fetched in get images endpoint. - **document**: Upload user's proof of address document. This can be later fetched in get images endpoint. - **addressStatement**: (Legacy) Upload user's proof of address document. Used for backward compatibility. Use type 'document' instead. - **medicalDoc**: Upload user's medical document. - **thirdId**: Upload user's third ID. - **contract**: Upload contract image. Enum: `signature`, `document`, `medicalDoc`, `thirdId`, `contract` | | `title` | query | string | | Only if type is contract. Title of contract. | | `format` | query | string | | Only if type is document. Possible values are image (jpg and png supported) or pdf. Default is image. Enum: `image`, `pdf` | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | | Image in base64 format. One of base64Image or imageUrl is required | | `imageUrl` | string | | URL of the image. One of base64Image or imageUrl is required | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/document/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "imageUrl": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/document/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "imageUrl": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/document/v2", headers=headers, json={ "base64Image": "", "imageUrl": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/document/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"imageUrl\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-document-v3` - URL: https://developer.incode.com/api-reference/add-document-v3/ - Markdown: https://developer.incode.com/api-reference/add-document-v3.md - Endpoint: `POST /omni/add/document/v3` # Add document V3 `POST /omni/add/document/v3` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Upload document image gathered and store data. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `type` | query | string | yes | - **signature**: Upload user's digital signature. This can be later fetched in get images endpoint. - **document**: Upload user's proof of address document. This can be later fetched in get images endpoint. - **addressStatement**: (Legacy) Upload user's proof of address document. Used for backward compatibility. Use type 'document' instead. - **medicalDoc**: Upload user's medical document. - **thirdId**: Upload user's third ID. - **contract**: Upload contract image. - **v5cMultiPageLogbook**: Upload single page (image) of V5C logbook multi page document. - **carInvoice**: Upload single page (image) of two pages car invoice document. - **financeSettlement**: Upload single page (image) of two pages finance settlement letter. Enum: `signature`, `document`, `medicalDoc`, `thirdId`, `contract`, `v5cMultiPageLogbook`, `carInvoice`, `financeSettlement` | | `title` | query | string | | Only if type is contract. Title of contract. | | `format` | query | string | | Only if type is document. Possible values are image (jpg and png supported) or pdf. Default is image. Enum: `image`, `pdf` | | `processingMethod` | query | string | | Only applicable for some documents. Possible values are sync and async. Default is sync. Enum: `sync`, `async` | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | | Image in base64 format. One of base64Image or imageUrl is required | | `imageUrl` | string | | URL of the image. One of base64Image or imageUrl is required | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `status` | string | | AddDocumentStatus Enum: `SUCCESS`, `PROCESS_DOC_ERROR`, `SESSION_ERROR`, `ADD_NEXT_PAGE`, `OPTIONAL_PAGE_CAPTURE`, `CLASSIFICATION_ERROR`, `MULTI_PAGE_CLASSIFICATION_ERROR`, `V5C_REGISTRATION_NUMBER_MISMATCH`, `V5C_REFERENCE_NUMBER_MISMATCH`, `V5C_NUMBER_MISMATCH`, `FSL_AGREEMENT_REFERENCE_MISMATCH`, `FSL_NAME_MISMATCH`, `MANDATORY_FIELD_MISSING`, `UNSUPPORTED_PAGE_NUMBERS`, `VALIDATION_ERROR`, `UNEXPECTED_ERROR`, `FINALIZE_ERROR_NO_PAGES`, `UNSUPPORTED_MP_DOCUMENT_TYPE` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/document/v3 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "imageUrl": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/document/v3", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "imageUrl": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/document/v3", headers=headers, json={ "base64Image": "", "imageUrl": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/document/v3")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"imageUrl\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "status": "SUCCESS" } ``` --- - Path: `api-reference/add-email` - URL: https://developer.incode.com/api-reference/add-email/ - Markdown: https://developer.incode.com/api-reference/add-email.md - Endpoint: `POST /omni/add/email` # Add email `POST /omni/add/email` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add email to interview. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `email` | string | | User's email. Has to be in valid format. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/email \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "email": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/email", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "email": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/email", headers=headers, json={ "email": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/email")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"email\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-face-third-party` - URL: https://developer.incode.com/api-reference/add-face-third-party/ - Markdown: https://developer.incode.com/api-reference/add-face-third-party.md - Endpoint: `POST /omni/add/face/third-party` # Add face/Selfie image `POST /omni/add/face/third-party` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Uploads selfie image for onboarding session. Response will contain data regarding liveness — if that is the photo of a real person. Number of retries is not limited. **Note**: After selfie and front-id are uploaded, endpoint for comparing faces process-face on those two images can be called. It is required that person is alone on the photo. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `imageType` | query | string | | Image type. Default is selfie | | `captureType` | query | string | | Enum: `AUTO`, `MANUAL`, `NATIVE`, `UPLOAD` | | `externalCaptureId` | query | string | | | | `recordingId` | query | string | | | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | | Image of user's face represented in base64. | | `imageUrl` | string | | URL of face image, required to belong to a whitelisted domain | | `faceCoordinates` | FaceCoordinatesDto | | Face coordinates | | `faceCoordinates.leftEyeX` | number (float) | yes | Left eye coordinates for X | | `faceCoordinates.leftEyeY` | number (float) | yes | Left eye coordinates for Y | | `faceCoordinates.rightEyeX` | number (float) | yes | Right eye coordinates for X | | `faceCoordinates.rightEyeY` | number (float) | yes | Right eye coordinates for Y | | `faceCoordinates.mouthX` | number (float) | | Left mouth coordinates for X. Note: the field is deprecated, use leftMouthX instead | | `faceCoordinates.leftMouthX` | number (float) | | Left mouth coordinates for X | | `faceCoordinates.mouthY` | number (float) | | Left mouth coordinates for Y. Note: the field is deprecated, use leftMouthY instead | | `faceCoordinates.leftMouthY` | number (float) | | Left mouth coordinates for Y | | `faceCoordinates.rightMouthX` | number (float) | yes | Right mouth coordinates for X | | `faceCoordinates.rightMouthY` | number (float) | yes | Right mouth coordinates for Y | | `faceCoordinates.noseTipX` | number (float) | yes | Nose coordinates for X | | `faceCoordinates.noseTipY` | number (float) | yes | Nose coordinates for Y | | `faceCoordinates.x` | number (float) | yes | X coordinate of face rectangle. | | `faceCoordinates.y` | number (float) | yes | Y coordinate of face rectangle. | | `faceCoordinates.width` | number (float) | yes | Width of face rectangle. | | `faceCoordinates.height` | number (float) | yes | Height of face rectangle. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `age` | integer (int32) | | Age of th person in the photo. | | `isBright` | boolean | | We recommend capturing another photo if value is false. | | `confidence` | number (float) | | Value 0 means that person on photo is alive. We recommend capturing another photo if value is 1. | | `hasLenses` | boolean | | We recommend capturing another photo if value is true. | | `hasFaceMask` | boolean | | Checked only if configured in the session flow. We recommend capturing another photo if value is true. | | `hasClosedEyes` | boolean | | Checked only if configured in the session flow. We recommend capturing another photo if value is true. | | `hasHeadCover` | boolean | | Checked only if configured in the session flow. We recommend capturing another photo if value is true. | | `faceOccluded` | boolean | | Checked only if configured in the session flow. We recommend capturing another photo if value is true. | | `sessionStatus` | string | | SessionStatus Enum: `Alive`, `Closed`, `Deleted` | | `captureAttemptsLimit` | CaptureAttemptsLimitDto | | Checked only if configured in the session flow. | | `captureAttemptsLimit.max` | integer (int32) | | Maximum number of attempts to capture a photo. | | `captureAttemptsLimit.remaining` | integer (int32) | | Number of remaining attempts to capture a photo. | ### 400 Custom error statuses: - 4010: More than one face detected - 4019: Face not found - 4077: Selfie image has low quality - 4078: Selfie face is occluded or partially covered Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/face/third-party \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "imageUrl": "", "faceCoordinates": "", "faceCoordinates.leftEyeX": 0, "faceCoordinates.leftEyeY": 0, "faceCoordinates.rightEyeX": 0, "faceCoordinates.rightEyeY": 0, "faceCoordinates.mouthX": 0, "faceCoordinates.leftMouthX": 0, "faceCoordinates.mouthY": 0, "faceCoordinates.leftMouthY": 0, "faceCoordinates.rightMouthX": 0, "faceCoordinates.rightMouthY": 0, "faceCoordinates.noseTipX": 0, "faceCoordinates.noseTipY": 0, "faceCoordinates.x": 0, "faceCoordinates.y": 0, "faceCoordinates.width": 0, "faceCoordinates.height": 0 }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/face/third-party", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "imageUrl": "", "faceCoordinates": "", "faceCoordinates.leftEyeX": 0, "faceCoordinates.leftEyeY": 0, "faceCoordinates.rightEyeX": 0, "faceCoordinates.rightEyeY": 0, "faceCoordinates.mouthX": 0, "faceCoordinates.leftMouthX": 0, "faceCoordinates.mouthY": 0, "faceCoordinates.leftMouthY": 0, "faceCoordinates.rightMouthX": 0, "faceCoordinates.rightMouthY": 0, "faceCoordinates.noseTipX": 0, "faceCoordinates.noseTipY": 0, "faceCoordinates.x": 0, "faceCoordinates.y": 0, "faceCoordinates.width": 0, "faceCoordinates.height": 0 }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/face/third-party", headers=headers, json={ "base64Image": "", "imageUrl": "", "faceCoordinates": "", "faceCoordinates.leftEyeX": 0, "faceCoordinates.leftEyeY": 0, "faceCoordinates.rightEyeX": 0, "faceCoordinates.rightEyeY": 0, "faceCoordinates.mouthX": 0, "faceCoordinates.leftMouthX": 0, "faceCoordinates.mouthY": 0, "faceCoordinates.leftMouthY": 0, "faceCoordinates.rightMouthX": 0, "faceCoordinates.rightMouthY": 0, "faceCoordinates.noseTipX": 0, "faceCoordinates.noseTipY": 0, "faceCoordinates.x": 0, "faceCoordinates.y": 0, "faceCoordinates.width": 0, "faceCoordinates.height": 0 }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/face/third-party")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"imageUrl\": \"\",\n \"faceCoordinates\": \"\",\n \"faceCoordinates.leftEyeX\": 0,\n \"faceCoordinates.leftEyeY\": 0,\n \"faceCoordinates.rightEyeX\": 0,\n \"faceCoordinates.rightEyeY\": 0,\n \"faceCoordinates.mouthX\": 0,\n \"faceCoordinates.leftMouthX\": 0,\n \"faceCoordinates.mouthY\": 0,\n \"faceCoordinates.leftMouthY\": 0,\n \"faceCoordinates.rightMouthX\": 0,\n \"faceCoordinates.rightMouthY\": 0,\n \"faceCoordinates.noseTipX\": 0,\n \"faceCoordinates.noseTipY\": 0,\n \"faceCoordinates.x\": 0,\n \"faceCoordinates.y\": 0,\n \"faceCoordinates.width\": 0,\n \"faceCoordinates.height\": 0\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "age": 0, "isBright": true, "confidence": 0, "hasLenses": true, "hasFaceMask": true, "hasClosedEyes": true, "hasHeadCover": true, "faceOccluded": true, "sessionStatus": "Alive", "captureAttemptsLimit": { "max": 0, "remaining": 0 } } ``` --- - Path: `api-reference/add-fingerprints` - URL: https://developer.incode.com/api-reference/add-fingerprints/ - Markdown: https://developer.incode.com/api-reference/add-fingerprints.md - Endpoint: `POST /omni/add/fingerprints` # Add fingerprints `POST /omni/add/fingerprints` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add fingerprints blobs and metadata to interview. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `type` | integer (int32) | | | | `fingerprints` | array[Fingerprint] | yes | | | `fingerprints.index` | integer (int32) | | | | `fingerprints.base64Fingerprint` | string | | | | `fingerprints.fingerprintMetadata` | FingerprintMetadata | | | | `fingerprints.fingerprintMetadata.device` | string | | | | `fingerprints.fingerprintMetadata.resolution` | string | | | | `fingerprints.fingerprintMetadata.qualityScore` | string | | | ## Responses ### 200 Respuesta con validación de CURP ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ### 500 Internal error during CURP validation. ### 504 The request to validate the CURP exceeded the allowed time limit ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/fingerprints \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "type": 0, "fingerprints": [], "fingerprints.index": 0, "fingerprints.base64Fingerprint": "", "fingerprints.fingerprintMetadata": "", "fingerprints.fingerprintMetadata.device": "", "fingerprints.fingerprintMetadata.resolution": "", "fingerprints.fingerprintMetadata.qualityScore": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/fingerprints", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "type": 0, "fingerprints": [], "fingerprints.index": 0, "fingerprints.base64Fingerprint": "", "fingerprints.fingerprintMetadata": "", "fingerprints.fingerprintMetadata.device": "", "fingerprints.fingerprintMetadata.resolution": "", "fingerprints.fingerprintMetadata.qualityScore": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/fingerprints", headers=headers, json={ "type": 0, "fingerprints": [], "fingerprints.index": 0, "fingerprints.base64Fingerprint": "", "fingerprints.fingerprintMetadata": "", "fingerprints.fingerprintMetadata.device": "", "fingerprints.fingerprintMetadata.resolution": "", "fingerprints.fingerprintMetadata.qualityScore": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/fingerprints")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"type\": 0,\n \"fingerprints\": [],\n \"fingerprints.index\": 0,\n \"fingerprints.base64Fingerprint\": \"\",\n \"fingerprints.fingerprintMetadata\": \"\",\n \"fingerprints.fingerprintMetadata.device\": \"\",\n \"fingerprints.fingerprintMetadata.resolution\": \"\",\n \"fingerprints.fingerprintMetadata.qualityScore\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "curp": "XXXX820814HDFABC01", "sex": "MUJER", "nationality": "MEX", "result": "success", "requestData": { "name": "JUANA", "firstLastName": "PEREZ", "secondLastName": "LOPEZ", "gender": "M", "birthDate": "14/08/1982", "state": "DF" }, "transactionId": "transaction1234567890", "renapo_valid": true, "names": "JUANA", "paternal_surname": "PEREZ", "mothers_maiden_name": "LOPEZ", "birthdate": "14/08/1982", "entity_birth": "DF", "probation_document": "1", "probation_document_data": { "foja": "", "numEntidadReg": "09", "libro": "", "NumRegExtranjeros": "", "cveEntidadNac": "DF", "numActa": "00001", "CRIP": "", "tomo": "", "cveEntidadEmisora": "", "anioReg": "1982", "cveMunicipioReg": "001", "FolioCarta": "" }, "status_curp": "RCN", "deceasedStatus": "ALIVE" } ``` --- - Path: `api-reference/add-fiscal-qr-url` - URL: https://developer.incode.com/api-reference/add-fiscal-qr-url/ - Markdown: https://developer.incode.com/api-reference/add-fiscal-qr-url.md - Endpoint: `POST /omni/add/fiscal-qr-url` # Add fiscal qr url `POST /omni/add/fiscal-qr-url` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Upload the url extracted from a fiscal qr code. Data from the given url will be available via the [Get fiscal qr url response](ref:getfiscalqrurlresponse) endpoint. (México only) ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `poaUrl` | string | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `rfc` | string | | | | `curp` | string | | | | `name` | string | | | | `firstLastName` | string | | | | `secondLastName` | string | | | | `birthdate` | string | | | | `denomination` | string | | | | `regime` | string | | | | `constitutionDate` | string | | | | `operationStartDate` | string | | | | `personStatus` | string | | | | `lastSituationChangeDate` | string | | | | `state` | string | | | | `delegation` | string | | | | `colony` | string | | | | `streetType` | string | | | | `streetName` | string | | | | `extNumber` | string | | | | `intNumber` | string | | | | `postalCode` | string | | | | `email` | string | | | | `al` | string | | | | `fiscalRegime` | string | | | | `fiscalStartDate` | string | | | | `error` | string | | | | `result` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/fiscal-qr-url \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "poaUrl": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/fiscal-qr-url", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "poaUrl": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/fiscal-qr-url", headers=headers, json={ "poaUrl": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/fiscal-qr-url")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"poaUrl\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "rfc": "string", "curp": "string", "name": "string", "firstLastName": "string", "secondLastName": "string", "birthdate": "string", "denomination": "string", "regime": "string", "constitutionDate": "string", "operationStartDate": "string", "personStatus": "string", "lastSituationChangeDate": "string", "state": "string", "delegation": "string", "colony": "string", "streetType": "string", "streetName": "string", "extNumber": "string", "intNumber": "string", "postalCode": "string", "email": "string", "al": "string", "fiscalRegime": "string", "fiscalStartDate": "string", "error": "string", "result": "string" } ``` --- - Path: `api-reference/add-fiscal-qr-url-image` - URL: https://developer.incode.com/api-reference/add-fiscal-qr-url-image/ - Markdown: https://developer.incode.com/api-reference/add-fiscal-qr-url-image.md - Endpoint: `POST /omni/add/fiscal-qr-url-image` # Add fiscal qr image `POST /omni/add/fiscal-qr-url-image` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Upload a fiscal qr image as base64 to session. The data available in the url embedded in the qr will be available via the [Get fiscal qr url response](ref:getfiscalqrurlresponse) endpoint. (México only) ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | | Image in base64 format. One of base64Image or imageUrl is required | | `imageUrl` | string | | URL of the image. One of base64Image or imageUrl is required | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `rfc` | string | | | | `curp` | string | | | | `name` | string | | | | `firstLastName` | string | | | | `secondLastName` | string | | | | `birthdate` | string | | | | `denomination` | string | | | | `regime` | string | | | | `constitutionDate` | string | | | | `operationStartDate` | string | | | | `personStatus` | string | | | | `lastSituationChangeDate` | string | | | | `state` | string | | | | `delegation` | string | | | | `colony` | string | | | | `streetType` | string | | | | `streetName` | string | | | | `extNumber` | string | | | | `intNumber` | string | | | | `postalCode` | string | | | | `email` | string | | | | `al` | string | | | | `fiscalRegime` | string | | | | `fiscalStartDate` | string | | | | `error` | string | | | | `result` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/fiscal-qr-url-image \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "imageUrl": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/fiscal-qr-url-image", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "imageUrl": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/fiscal-qr-url-image", headers=headers, json={ "base64Image": "", "imageUrl": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/fiscal-qr-url-image")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"imageUrl\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "rfc": "string", "curp": "string", "name": "string", "firstLastName": "string", "secondLastName": "string", "birthdate": "string", "denomination": "string", "regime": "string", "constitutionDate": "string", "operationStartDate": "string", "personStatus": "string", "lastSituationChangeDate": "string", "state": "string", "delegation": "string", "colony": "string", "streetType": "string", "streetName": "string", "extNumber": "string", "intNumber": "string", "postalCode": "string", "email": "string", "al": "string", "fiscalRegime": "string", "fiscalStartDate": "string", "error": "string", "result": "string" } ``` --- - Path: `api-reference/add-front-id-v2` - URL: https://developer.incode.com/api-reference/add-front-id-v2/ - Markdown: https://developer.incode.com/api-reference/add-front-id-v2.md - Endpoint: `POST /omni/add/front-id/v2` # Add front side of ID `POST /omni/add/front-id/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used for storing front side of id for further processing. Image quality check is performed during that call. Number of retries is not limited. Once [process-id](#/Onboarding/processId) is finished, this endpoint cannot be called for retries. **Note: Front side of id should be uploaded before [back-side](#/Onboarding/addBackIdV2)** ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `onlyFront` | query | boolean | | Flag stating if document is one-sided (like Passport) | | `extractIdFace` | query | boolean | | When false, skips biometric face extraction and template creation from the front ID. Default true. | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | | Image in base64 format. One of base64Image or imageUrl is required | | `imageUrl` | string | | URL of the image. One of base64Image or imageUrl is required | ## Responses ### 200 In case there's some issue when calling the endpoint due to classification failed, an issue such as bad quality, or any of the fail reasons the response will always have the field: - classification - failReason - sharpness - glare - horizontalResolution We recommend considering the call as failed if there's a failReason in the response or if the classification is false. Possible values for fail reason: - UNKNOWN_DOCUMENT_TYPE: document classification failed - WRONG_DOCUMENT_SIDE: can happen when uploading back side of id when front id is required or the other way around - WRONG_ONE_SIDED_DOCUMENT: uploading wrong document with only one side - WRONG_UNFOLDED_DOCUMENT: uploading unfolded document with unrecognizable sides - UNFOLDED_DOCUMENT_PAGE_MISMATCH: uploading unfolded document with mismatching sides - DOCUMENT_NOT_READABLE: document couldn't be read, probably due to image quality - UNABLE_TO_ALIGN_DOCUMENT: alignment failed - ID_TYPE_UNACCEPTABLE: invalid type of id - UNEXPECTED_ERROR_OCCURRED: unexpected error Whenever the classification is done successfully the fields that will always be present are: - classification - sharpness - glare - horizontalResolution - readability - typeOfId - sessionStatus The remaining fields could be optional depending on the specific type of id and country of origin. Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `correctSharpness` | boolean | | It's true if the sharpness of the ID meets the requirements. | | `correctGlare` | boolean | | It's true if the glare of the ID meets the requirements. | | `horizontalResolution` | integer (int32) | | Value is based on the resolution of the cropped photo. Low value means after performing the crop we have a bad quality of image. We recommend to retry capture if value is below 155. | | `shadowConfidence` | number (float) | | Value 0 means it is no shadow on the image and image quality is good, while value 1 represents bad quality of image with a lot of shadow. We recommend to retry capture if value is 1. | | `classification` | boolean | | If true, server classified image as a front side of an id. If false, server failed to classify image as valid front side of an id or passport and other parameters can be ignored. | | `readability` | boolean | | If true, server can properly read ID. If false server failed to read some key places of the ID. | | `typeOfId` | string | | Enum: `Unknown`, `Passport`, `Visa`, `DriversLicense`, `IdentificationCard`, `Permit`, `Currency`, `ResidenceDocument`, `TravelDocument`, `BirthCertificate`, `VehicleRegistration`, `Other`, `WeaponLicense`, `TribalIdentification`, `VoterIdentification`, `Military`, `TaxIdentification`, `FederalID`, `MedicalCard` | | `issueYear` | integer (int32) | | Issue year of the ID. | | `issueName` | string | | Description of the ID. Could contain country code, state, type of ID, subtype of ID. | | `curpCheck` | boolean | | Only for Mexican IDs. Flag stating if curp was properly read. | | `sessionStatus` | string | | Session Status Enum: `Alive`, `Closed`, `Deleted` | | `countryCode` | string | | Valid ISO alpha-2 or alpha-3 code of the ID issuing country. | | `state` | string | | Issuing state of the ID. | | `failReason` | string | | Classification fail reason Enum: `UNKNOWN_DOCUMENT_TYPE`, `WRONG_DOCUMENT_SIDE`, `WRONG_ONE_SIDED_DOCUMENT`, `UNFOLDED_DOCUMENT_PAGE_MISMATCH`, `WRONG_UNFOLDED_DOCUMENT`, `DOCUMENT_NOT_READABLE`, `UNABLE_TO_ALIGN_DOCUMENT`, `ID_TYPE_UNACCEPTABLE`, `UNEXPECTED_ERROR_OCCURRED`, `DIGITAL_ID_REQUESTED_BUT_OTHER_PROVIDED` | | `skipBackIdCapture` | boolean | | Flag that signals if back id capture should be skipped or not. | | `forceFrontIdCapture` | boolean | | Flag that signals if front id capture must be executed after back. | | `showMandatoryConsent` | boolean | | Render mandatory consent page based on this parameter value. | | `regulationType` | string | | Regulation type for the mandatory consent (only if showMandatoryConsent set to true). | | `skipGlareFront` | boolean | | Flag that signals if front side glare should be ignored. | | `skipGlareBack` | boolean | | Flag that signals if back side glare should be ignored. | | `documentIsOnTheEdge` | boolean | | Flag that signals if document is on the edge on the full frame image. | | `acceptedDocuments` | array[string] | | List of accepted documents for that particular country in case of ID_TYPE_UNACCEPTABLE failReason. | | `imageRedacted` | boolean | | Flag that signals if image was redacted as part of the ID capture. | | `idFaceExtractionSkipped` | boolean | | True when biometric face extraction from the front ID was skipped because the client passed extractIdFace=false. While this flag is true, face-match flows that require an ID-side template cannot run; the flag is cleared on a subsequent add/front-id call where extractIdFace is true (or omitted). | | `captureAttemptsLimit` | CaptureAttemptsLimitDto | | Checked only if configured in the session flow. | | `captureAttemptsLimit.max` | integer (int32) | | Maximum number of attempts to capture a photo. | | `captureAttemptsLimit.remaining` | integer (int32) | | Number of remaining attempts to capture a photo. | | `idQualityAttemptApproved` | boolean | | ID quality check result based on ML readability estimation. True if perFieldReadability >= 0.38, false otherwise. Only available for Mexican documents when feature is enabled. | | `isDocumentExpired` | boolean | | Flag indicating if the document side is expired. | | `attemptId` | string | | Created attempt id. | ### 400 Custom error statuses: - 1003: Face cropping failure - 4004: Could not find user - 4019: Face not found Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/front-id/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "imageUrl": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/front-id/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "imageUrl": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/front-id/v2", headers=headers, json={ "base64Image": "", "imageUrl": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/front-id/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"imageUrl\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "correctSharpness": true, "correctGlare": true, "horizontalResolution": 0, "shadowConfidence": 0, "classification": true, "readability": true, "typeOfId": "Unknown", "issueYear": 0, "issueName": "string", "curpCheck": true, "sessionStatus": "Alive", "countryCode": "string", "state": "string", "failReason": "UNKNOWN_DOCUMENT_TYPE", "skipBackIdCapture": true, "forceFrontIdCapture": true, "showMandatoryConsent": true, "regulationType": "string", "skipGlareFront": true, "skipGlareBack": true, "documentIsOnTheEdge": true, "acceptedDocuments": [ "Unknown" ], "imageRedacted": true, "idFaceExtractionSkipped": true, "captureAttemptsLimit": { "max": 0, "remaining": 0 }, "idQualityAttemptApproved": true, "isDocumentExpired": true, "attemptId": "string" } ``` --- - Path: `api-reference/add-front-second-id-v2` - URL: https://developer.incode.com/api-reference/add-front-second-id-v2/ - Markdown: https://developer.incode.com/api-reference/add-front-second-id-v2.md - Endpoint: `POST /omni/add/front-second-id/v2` # Add front side of Second ID `POST /omni/add/front-second-id/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used for storing front side of second id for further processing ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `onlyFront` | query | boolean | | Flag stating if document is one-sided (like Passport). Default value is false, in case it is not sent. | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | | Image in base64 format. One of base64Image or imageUrl is required | | `imageUrl` | string | | URL of the image. One of base64Image or imageUrl is required | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `correctSharpness` | boolean | | It's true if the sharpness of the ID meets the requirements. | | `correctGlare` | boolean | | It's true if the glare of the ID meets the requirements. | | `horizontalResolution` | integer (int32) | | Value is based on the resolution of the cropped photo. Low value means after performing the crop we have a bad quality of image. We recommend to retry capture if value is below 155. | | `shadowConfidence` | number (float) | | Value 0 means it is no shadow on the image and image quality is good, while value 1 represents bad quality of image with a lot of shadow. We recommend to retry capture if value is 1. | | `classification` | boolean | | If true, server classified image as a front side of an id. If false, server failed to classify image as valid front side of an id or passport and other parameters can be ignored. | | `readability` | boolean | | If true, server can properly read ID. If false server failed to read some key places of the ID. | | `typeOfId` | string | | Enum: `Unknown`, `Passport`, `Visa`, `DriversLicense`, `IdentificationCard`, `Permit`, `Currency`, `ResidenceDocument`, `TravelDocument`, `BirthCertificate`, `VehicleRegistration`, `Other`, `WeaponLicense`, `TribalIdentification`, `VoterIdentification`, `Military`, `TaxIdentification`, `FederalID`, `MedicalCard` | | `issueYear` | integer (int32) | | Issue year of the ID. | | `issueName` | string | | Description of the ID. Could contain country code, state, type of ID, subtype of ID. | | `curpCheck` | boolean | | Only for Mexican IDs. Flag stating if curp was properly read. | | `sessionStatus` | string | | Session Status Enum: `Alive`, `Closed`, `Deleted` | | `countryCode` | string | | Valid ISO alpha-2 or alpha-3 code of the ID issuing country. | | `state` | string | | Issuing state of the ID. | | `failReason` | string | | Classification fail reason Enum: `UNKNOWN_DOCUMENT_TYPE`, `WRONG_DOCUMENT_SIDE`, `WRONG_ONE_SIDED_DOCUMENT`, `UNFOLDED_DOCUMENT_PAGE_MISMATCH`, `WRONG_UNFOLDED_DOCUMENT`, `DOCUMENT_NOT_READABLE`, `UNABLE_TO_ALIGN_DOCUMENT`, `ID_TYPE_UNACCEPTABLE`, `UNEXPECTED_ERROR_OCCURRED`, `DIGITAL_ID_REQUESTED_BUT_OTHER_PROVIDED` | | `skipBackIdCapture` | boolean | | Flag that signals if back id capture should be skipped or not. | | `forceFrontIdCapture` | boolean | | Flag that signals if front id capture must be executed after back. | | `showMandatoryConsent` | boolean | | Render mandatory consent page based on this parameter value. | | `regulationType` | string | | Regulation type for the mandatory consent (only if showMandatoryConsent set to true). | | `skipGlareFront` | boolean | | Flag that signals if front side glare should be ignored. | | `skipGlareBack` | boolean | | Flag that signals if back side glare should be ignored. | | `documentIsOnTheEdge` | boolean | | Flag that signals if document is on the edge on the full frame image. | | `acceptedDocuments` | array[string] | | List of accepted documents for that particular country in case of ID_TYPE_UNACCEPTABLE failReason. | | `imageRedacted` | boolean | | Flag that signals if image was redacted as part of the ID capture. | | `idFaceExtractionSkipped` | boolean | | True when biometric face extraction from the front ID was skipped because the client passed extractIdFace=false. While this flag is true, face-match flows that require an ID-side template cannot run; the flag is cleared on a subsequent add/front-id call where extractIdFace is true (or omitted). | | `captureAttemptsLimit` | CaptureAttemptsLimitDto | | Checked only if configured in the session flow. | | `captureAttemptsLimit.max` | integer (int32) | | Maximum number of attempts to capture a photo. | | `captureAttemptsLimit.remaining` | integer (int32) | | Number of remaining attempts to capture a photo. | | `idQualityAttemptApproved` | boolean | | ID quality check result based on ML readability estimation. True if perFieldReadability >= 0.38, false otherwise. Only available for Mexican documents when feature is enabled. | | `isDocumentExpired` | boolean | | Flag indicating if the document side is expired. | | `attemptId` | string | | Created attempt id. | ### 400 Custom error statuses: - 4019: Face not found - 1003: Face cropping failure Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/front-second-id/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "imageUrl": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/front-second-id/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "imageUrl": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/front-second-id/v2", headers=headers, json={ "base64Image": "", "imageUrl": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/front-second-id/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"imageUrl\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "correctSharpness": true, "correctGlare": true, "horizontalResolution": 0, "shadowConfidence": 0, "classification": true, "readability": true, "typeOfId": "Unknown", "issueYear": 0, "issueName": "string", "curpCheck": true, "sessionStatus": "Alive", "countryCode": "string", "state": "string", "failReason": "UNKNOWN_DOCUMENT_TYPE", "skipBackIdCapture": true, "forceFrontIdCapture": true, "showMandatoryConsent": true, "regulationType": "string", "skipGlareFront": true, "skipGlareBack": true, "documentIsOnTheEdge": true, "acceptedDocuments": [ "Unknown" ], "imageRedacted": true, "idFaceExtractionSkipped": true, "captureAttemptsLimit": { "max": 0, "remaining": 0 }, "idQualityAttemptApproved": true, "isDocumentExpired": true, "attemptId": "string" } ``` --- - Path: `api-reference/add-geolocation` - URL: https://developer.incode.com/api-reference/add-geolocation/ - Markdown: https://developer.incode.com/api-reference/add-geolocation.md - Endpoint: `POST /omni/add/geolocation` # Add geolocation `POST /omni/add/geolocation` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Send location to store in database, or send coordinates and fetch location and store it ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `longitude` | number (float) | yes | User's geolocation longitude | | `latitude` | number (float) | yes | User's geolocation latitude | | `location` | string | | User's current location | | `madminArea` | string | | | | `msubAdminArea` | string | | | | `mlocality` | string | | | | `msubLocality` | string | | | | `mthoroughfare` | string | | | | `msubThoroughfare` | string | | | | `mpostalCode` | string | | | | `mcountryCode` | string | | | | `mcountryName` | string | | | ## Responses ### 200 OK ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/geolocation \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "longitude": 0, "latitude": 0, "location": "", "madminArea": "", "msubAdminArea": "", "mlocality": "", "msubLocality": "", "mthoroughfare": "", "msubThoroughfare": "", "mpostalCode": "", "mcountryCode": "", "mcountryName": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/geolocation", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "longitude": 0, "latitude": 0, "location": "", "madminArea": "", "msubAdminArea": "", "mlocality": "", "msubLocality": "", "mthoroughfare": "", "msubThoroughfare": "", "mpostalCode": "", "mcountryCode": "", "mcountryName": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/geolocation", headers=headers, json={ "longitude": 0, "latitude": 0, "location": "", "madminArea": "", "msubAdminArea": "", "mlocality": "", "msubLocality": "", "mthoroughfare": "", "msubThoroughfare": "", "mpostalCode": "", "mcountryCode": "", "mcountryName": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/geolocation")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"longitude\": 0,\n \"latitude\": 0,\n \"location\": \"\",\n \"madminArea\": \"\",\n \"msubAdminArea\": \"\",\n \"mlocality\": \"\",\n \"msubLocality\": \"\",\n \"mthoroughfare\": \"\",\n \"msubThoroughfare\": \"\",\n \"mpostalCode\": \"\",\n \"mcountryCode\": \"\",\n \"mcountryName\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/add-name` - URL: https://developer.incode.com/api-reference/add-name/ - Markdown: https://developer.incode.com/api-reference/add-name.md - Endpoint: `POST /omni/add/name` # Add name `POST /omni/add/name` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used for adding user's name for current onboarding session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | | User's name. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/name \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "name": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/name", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "name": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/name", headers=headers, json={ "name": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/name")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"name\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-notes` - URL: https://developer.incode.com/api-reference/add-notes/ - Markdown: https://developer.incode.com/api-reference/add-notes.md - Endpoint: `POST /omni/add/notes` # Add notes `POST /omni/add/notes` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used for adding notes for interview/session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `notes` | string | | Notes to save | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/notes \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "notes": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/notes", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "notes": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/notes", headers=headers, json={ "notes": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/notes")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"notes\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-phone` - URL: https://developer.incode.com/api-reference/add-phone/ - Markdown: https://developer.incode.com/api-reference/add-phone.md - Endpoint: `POST /omni/add/phone` # Add phone `POST /omni/add/phone` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment > **Deprecated** — this endpoint is marked deprecated in the Omni API specification. Add phone to interview. Deprecated, use POST /phone instead. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `phone` | string | | User's phone number. E.164 number convention. | | `optInGranted` | boolean | | Indicates whether opt-in is granted | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `existingCustomer` | boolean | | Flag indicating if this user with given phone already exists in the system. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/phone \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "phone": "", "optInGranted": false }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/phone", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "phone": "", "optInGranted": false }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/phone", headers=headers, json={ "phone": "", "optInGranted": False }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/phone")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"phone\": \"\",\n \"optInGranted\": false\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "existingCustomer": true } ``` --- - Path: `api-reference/add-qr-code-text` - URL: https://developer.incode.com/api-reference/add-qr-code-text/ - Markdown: https://developer.incode.com/api-reference/add-qr-code-text.md - Endpoint: `POST /omni/add/qr-code-text` # Add QR code raw text `POST /omni/add/qr-code-text` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add QR code raw text to interview. It will be saved in customFields named 'qrCodeText', this fields needs to be present in organization's custom fields schema. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `qrCodeText` | string | | QR code raw text. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/qr-code-text \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "qrCodeText": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/qr-code-text", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "qrCodeText": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/qr-code-text", headers=headers, json={ "qrCodeText": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/qr-code-text")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"qrCodeText\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-user-consent` - URL: https://developer.incode.com/api-reference/add-user-consent/ - Markdown: https://developer.incode.com/api-reference/add-user-consent.md - Endpoint: `POST /omni/add/user-consent` # Add user consent `POST /omni/add/user-consent` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add user consent with title, content and status to session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `title` | string | | Title of the consent. | | `content` | string | | Text content. | | `status` | boolean | | Status | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/user-consent \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "title": "", "content": "", "status": false }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/user-consent", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "title": "", "content": "", "status": false }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/user-consent", headers=headers, json={ "title": "", "content": "", "status": False }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/user-consent")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"title\": \"\",\n \"content\": \"\",\n \"status\": false\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-watchlist-identity` - URL: https://developer.incode.com/api-reference/add-watchlist-identity/ - Markdown: https://developer.incode.com/api-reference/add-watchlist-identity.md - Endpoint: `POST /omni/add/watchlist/identity` # Add custom watchlist entry from identity `POST /omni/add/watchlist/identity` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Works with Admin Token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `identityId` | string | | | | `watchlistType` | string | | Enum: `WHITELIST`, `BLACKLIST` | | `recordExpiresAt` | string | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/watchlist/identity \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "identityId": "", "watchlistType": "", "recordExpiresAt": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/watchlist/identity", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "identityId": "", "watchlistType": "", "recordExpiresAt": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/watchlist/identity", headers=headers, json={ "identityId": "", "watchlistType": "", "recordExpiresAt": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/watchlist/identity")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"identityId\": \"\",\n \"watchlistType\": \"\",\n \"recordExpiresAt\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-watchlist-session` - URL: https://developer.incode.com/api-reference/add-watchlist-session/ - Markdown: https://developer.incode.com/api-reference/add-watchlist-session.md - Endpoint: `POST /omni/add/watchlist/session` # Add custom watchlist entry from session `POST /omni/add/watchlist/session` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Works with Admin Token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `sessionId` | string | | | | `watchlistType` | string | | Enum: `WHITELIST`, `BLACKLIST` | | `recordExpiresAt` | string | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/watchlist/session \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "sessionId": "", "watchlistType": "", "recordExpiresAt": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/watchlist/session", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "sessionId": "", "watchlistType": "", "recordExpiresAt": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/watchlist/session", headers=headers, json={ "sessionId": "", "watchlistType": "", "recordExpiresAt": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/watchlist/session")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"sessionId\": \"\",\n \"watchlistType\": \"\",\n \"recordExpiresAt\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/add-watchlist-single-record` - URL: https://developer.incode.com/api-reference/add-watchlist-single-record/ - Markdown: https://developer.incode.com/api-reference/add-watchlist-single-record.md - Endpoint: `POST /omni/add/watchlist/single-record` # Add custom watchlist entry `POST /omni/add/watchlist/single-record` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Works with Admin Token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | | Name of person that is being uploaded to Watchlist | | `birthDate` | string | | Birthdate (timestamp) of person that is being uploaded to Watchlist | | `idNumber` | string | | Id number of person that is being uploaded to Watchlist | | `email` | string | | Email of person that is being uploaded to Watchlist | | `phone` | string | | Phone of person that is being uploaded to Watchlist | | `personalIdNumber` | string | | Personal Id Number of person that is being uploaded to Watchlist | | `externalId` | string | | External id of person that is being uploaded to Watchlist | | `imageBase64` | string | | Base64 representation of face image of person that is being uploaded to Watchlist | | `frontIdBase64` | string | | Base64 representation of front side of document image that is being processed to gather OCR data and uploaded to Watchlist | | `backIdBase64` | string | | Base64 representation of back side of document image that is being processed to gather OCR data and uploaded to Watchlist | | `watchlistType` | string | | Defines type of Watchlist to use Enum: `WHITELIST`, `BLACKLIST` | | `recordExpiresAt` | string | | Date (timestamp) until the watchlist entry is active. When searched after this date, score of watchlist match will be 0. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `customerId` | string | | | | `watchlistId` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/watchlist/single-record \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "name": "", "birthDate": "", "idNumber": "", "email": "", "phone": "", "personalIdNumber": "", "externalId": "", "imageBase64": "", "frontIdBase64": "", "backIdBase64": "", "watchlistType": "", "recordExpiresAt": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/watchlist/single-record", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "name": "", "birthDate": "", "idNumber": "", "email": "", "phone": "", "personalIdNumber": "", "externalId": "", "imageBase64": "", "frontIdBase64": "", "backIdBase64": "", "watchlistType": "", "recordExpiresAt": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/watchlist/single-record", headers=headers, json={ "name": "", "birthDate": "", "idNumber": "", "email": "", "phone": "", "personalIdNumber": "", "externalId": "", "imageBase64": "", "frontIdBase64": "", "backIdBase64": "", "watchlistType": "", "recordExpiresAt": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/watchlist/single-record")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"name\": \"\",\n \"birthDate\": \"\",\n \"idNumber\": \"\",\n \"email\": \"\",\n \"phone\": \"\",\n \"personalIdNumber\": \"\",\n \"externalId\": \"\",\n \"imageBase64\": \"\",\n \"frontIdBase64\": \"\",\n \"backIdBase64\": \"\",\n \"watchlistType\": \"\",\n \"recordExpiresAt\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "customerId": "string", "watchlistId": "string" } ``` --- - Path: `api-reference/api-calculate-rfc` - URL: https://developer.incode.com/api-reference/api-calculate-rfc/ - Markdown: https://developer.incode.com/api-reference/api-calculate-rfc.md - Endpoint: `POST /api/calculate/rfc` # Calculate RFC `POST /api/calculate/rfc` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Calculate and return the RFC based on a person data. Once you obtain the calculated RFC it doesn't necessarily mean it's a valid one. You could use the validate RFC method to check if it exists. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | yes | | | `firstLastName` | string | yes | | | `secondLastName` | string | yes | | | `birthDate` | string (dd/mm/yyyy) | yes | | ## Responses ### 200 Successfully calculated RFC Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `calculatedRFC` | string | | | ```json { "calculatedRFC": "PEPJ870918ABC" } ``` ### 400 Invalid input data Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ```json { "timestamp": 1622548800000, "status": 400, "error": "Bad Request", "message": "Date is not in valid format", "path": "/api/calculate/rfc", "details": { "error": { "birthDate": [ "Birth date must be in format dd/mm/yyyy" ] } } } ``` ### 500 Internal server error during calculation Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ```json { "timestamp": 1622548800000, "status": 500, "error": "Internal Server Error", "message": "Error calculating RFC", "path": "/api/calculate/rfc" } ``` ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/calculate/rfc \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "name": "", "firstLastName": "", "secondLastName": "", "birthDate": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/calculate/rfc", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "name": "", "firstLastName": "", "secondLastName": "", "birthDate": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/calculate/rfc", headers=headers, json={ "name": "", "firstLastName": "", "secondLastName": "", "birthDate": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/calculate/rfc")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"name\": \"\",\n \"firstLastName\": \"\",\n \"secondLastName\": \"\",\n \"birthDate\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "calculatedRFC": "PEPJ870918ABC" } ``` --- - Path: `api-reference/api-fetch-curp-v3` - URL: https://developer.incode.com/api-reference/api-fetch-curp-v3/ - Markdown: https://developer.incode.com/api-reference/api-fetch-curp-v3.md - Endpoint: `GET /api/fetch/curp/v3` # Fetch CURP scraping results `GET /api/fetch/curp/v3` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch the results from [/api/validate/curp/v3](#/API%20Validations/validateCurp3). The recommended wait time is 25 secs and retrying every 5 secs after that. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `idResults` | query | string | yes | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `get_version` | integer (int64) | | | | `scrapingStatus` | string | | - IN_PROGRESS: Service hasn't finished and should retry in 5 seconds. - FINISHED: Service finished and we got a result. Either a success or an error, such as curp not found. - ERROR: Service had an unhandled error, a new attempt is recommended. Enum: `IN_PROGRESS`, `FINISHED`, `ERROR` | | `success` | boolean | | | | `result` | string | | - success: Call finished and data was validated successfully. - error: Invalid curp or data, exact details returned by the website can be found in the resultDetails field. - timeout: Elements needed for scrapping were never found, isolated network issue, website down or website changed. - maintenance: Elements indicating that the website is under maintenance have been found. - unhandledError: Unhandled error occured during scrapping. | | `resultDetails` | string | | | | `screenshotUrl` | string | | | | `curp` | string | | | | `nombre` | string | | | | `primerApellido` | string | | | | `segundoApellido` | string | | | | `sexo` | string | | | | `nacionalidad` | string | | | | `entidadNacimiento` | string | | | | `documentoProbatorio` | string | | | | `datosDocumentoProbatorio` | object | | - municipioRegistro: String. - entidadRegistro: String. - numeroActa: Integer. - anioRegistro: Integer. | | `curpHistoricas` | string | | | | `statusCurp` | string | | | | `transactionId` | string | | | | `codigoRespuestaCCB` | string | | | | `descripcionRespuestaCCB` | string | | | | `codigoRespuestaRENAPO` | string | | | | `descripcionRespuestaRENAPO` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/api/fetch/curp/v3 \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/fetch/curp/v3", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/api/fetch/curp/v3", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/fetch/curp/v3")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "get_version": 0, "scrapingStatus": "IN_PROGRESS", "success": true, "result": "string", "resultDetails": "string", "screenshotUrl": "string", "curp": "string", "nombre": "string", "primerApellido": "string", "segundoApellido": "string", "sexo": "string", "nacionalidad": "string", "entidadNacimiento": "string", "documentoProbatorio": "string", "datosDocumentoProbatorio": {}, "curpHistoricas": "string", "statusCurp": "string", "transactionId": "string", "codigoRespuestaCCB": "string", "descripcionRespuestaCCB": "string", "codigoRespuestaRENAPO": "string", "descripcionRespuestaRENAPO": "string" } ``` --- - Path: `api-reference/api-fetch-ine` - URL: https://developer.incode.com/api-reference/api-fetch-ine/ - Markdown: https://developer.incode.com/api-reference/api-fetch-ine.md - Endpoint: `GET /api/fetch/ine` # Fetch INE scraping results `GET /api/fetch/ine` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch the results from [/api/validate/ine](#/API%20Validations/validateIne). The recommended wait time is 20 sec and retrying every 5 sec after that. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `idResults` | query | string | yes | | | `api-version` | header | string | yes | | ## Responses ### 200 scrapingStatus possible values are: - IN_PROGRESS: service hasn't finished and should retry in 5 seconds. - FINISHED: scrapping service finished and we got either a successful response or an error such as curp not found. - ERROR: scrapping service had an unhandled error, another attempt should be sent to validate curp. If INE is not found or an error occurs (such as service being in maintenance) then the success field will be false and the field resultDetails will have additional information. Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `get_version` | integer (int64) | | | | `scrapingStatus` | string | | Scraping status Enum: `IN_PROGRESS`, `FINISHED`, `ERROR` | | `success` | boolean | | Flag indicating if the process finished successfully. | | `result` | string | | Result Enum: `success`, `error` | | `resultDetails` | string | | | | `screenshotUrl` | string | | | | `cic` | string | | Cic value. | | `claveElector` | string | | Clave de elector. | | `numeroEmision` | string | | Emission number. | | `ocr` | string | | Ocr number. | | `anioRegistro` | string | | Registration year. | | `anioEmision` | string | | Emission year. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/api/fetch/ine \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/fetch/ine", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/api/fetch/ine", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/fetch/ine")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "get_version": 0, "scrapingStatus": "IN_PROGRESS", "success": true, "result": "success", "resultDetails": "string", "screenshotUrl": "string", "cic": "string", "claveElector": "string", "numeroEmision": "string", "ocr": "string", "anioRegistro": "string", "anioEmision": "string" } ``` --- - Path: `api-reference/api-key` - URL: https://developer.incode.com/api-reference/api-key/ - Markdown: https://developer.incode.com/api-reference/api-key.md - Endpoint: `GET /omni/api-key` # Fetch `GET /omni/api-key` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch all API keys of current user's organization. If user is super admin, parameter apiKey can be provided to specify organization for which the keys should be fetched (ignored otherwise). ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `apiKey` | query | string | | Organization reference. | | `api-version` | header | string | yes | | ## Responses ### 200 OK ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/api-key \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/api-key", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/api-key", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/api-key")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json [ { "name": "key1", "value": "f35844c8bcb417be1a64fd6e8d622cc93b0fcfaa", "clientId": "key1254", "valid": true, "createdAt": 1678185005948, "updatedAt": 1678185005948 } ] ``` --- - Path: `api-reference/api-key-post` - URL: https://developer.incode.com/api-reference/api-key-post/ - Markdown: https://developer.incode.com/api-reference/api-key-post.md - Endpoint: `POST /omni/api-key` # Create `POST /omni/api-key` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Create new API key for current user's organization. If user is super admin, parameter apiKey can be provided to specify organization for which the key should be created (ignored otherwise). ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | | Key name. | | `apiKey` | string | | Organization reference. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | | Key name. | | `value` | string | | Key value, sha1(clientId). | | `clientId` | string | | Key clientId, name + random 3 digits. | | `valid` | boolean | | Key validity. | | `createdAt` | integer (int64) | | Key creation timestamp. | | `updatedAt` | integer (int64) | | Key adjustment timestamp. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/api-key \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "name": "", "apiKey": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/api-key", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "name": "", "apiKey": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/api-key", headers=headers, json={ "name": "", "apiKey": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/api-key")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"name\": \"\",\n \"apiKey\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "name": "key1", "value": "f35844c8bcb417be1a64fd6e8d622cc93b0fcfaa", "clientId": "key1254", "valid": true, "createdAt": 1678185005948, "updatedAt": 1678185005948 } ``` --- - Path: `api-reference/api-key-put` - URL: https://developer.incode.com/api-reference/api-key-put/ - Markdown: https://developer.incode.com/api-reference/api-key-put.md - Endpoint: `PUT /omni/api-key` # Update `PUT /omni/api-key` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Validate/invalidate API key for current user's organization. If user is super admin, parameter apiKey can be provided to specify organization for which the key should be adjusted (ignored otherwise). User is not allowed to invalidate last valid key of the belonging organization. Super admin user can invalidate last valid keys of other organizations (effectively revoking their access to the application). ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `valid` | boolean | yes | Key validity. | | `name` | string | | Key name. | | `apiKey` | string | | Organization reference. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | | Key name. | | `value` | string | | Key value, sha1(clientId). | | `clientId` | string | | Key clientId, name + random 3 digits. | | `valid` | boolean | | Key validity. | | `createdAt` | integer (int64) | | Key creation timestamp. | | `updatedAt` | integer (int64) | | Key adjustment timestamp. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X PUT https://demo-api.incodesmile.com/omni/api-key \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "valid": false, "name": "", "apiKey": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/api-key", { method: "PUT", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "valid": false, "name": "", "apiKey": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.put("https://demo-api.incodesmile.com/omni/api-key", headers=headers, json={ "valid": False, "name": "", "apiKey": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/api-key")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("PUT", HttpRequest.BodyPublishers.ofString("{\n \"valid\": false,\n \"name\": \"\",\n \"apiKey\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "name": "key1", "value": "f35844c8bcb417be1a64fd6e8d622cc93b0fcfaa", "clientId": "key1254", "valid": true, "createdAt": 1678185005948, "updatedAt": 1678185005948 } ``` --- - Path: `api-reference/api-validate-bank-statement` - URL: https://developer.incode.com/api-reference/api-validate-bank-statement/ - Markdown: https://developer.incode.com/api-reference/api-validate-bank-statement.md - Endpoint: `POST /api/validate/bank-statement` # Validate bank statement `POST /api/validate/bank-statement` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used to validate and get the information from a bank statement. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `dummy` | query | boolean | | Enables sending any pdf and will return a dummy response. | | `api-version` | header | string | yes | | ## Responses ### 200 fields are optional, based on the bank statement format - name: String. - account_num: String. - clabe: String. - summary: String. - bank: String. - rfc: String. - starting_balance: Float. - ending_balance: Float. - pdf_quality: Number. - summary: Object. Object with detailed information on balance, deposits, withdrawals and fees. - txs: Array of transactions. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/validate/bank-statement \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/validate/bank-statement", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/validate/bank-statement", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/validate/bank-statement")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/api-validate-bank-statement-v2` - URL: https://developer.incode.com/api-reference/api-validate-bank-statement-v2/ - Markdown: https://developer.incode.com/api-reference/api-validate-bank-statement-v2.md - Endpoint: `POST /api/validate/bank-statement/v2` # Validate bank statement v2 `POST /api/validate/bank-statement/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used to validate and get the information from a bank statement. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `dummy` | query | boolean | | Enables sending any pdf and will return a dummy response. | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64File` | string | yes | Base64 string representation of the bank statement pdf. | ## Responses ### 200 Fields are optional, based on the bank statement format - name: String. - account_num: String. - clabe: String. - summary: String. - bank: String. - rfc: String. - starting_balance: Float. - ending_balance: Float. - pdf_quality: Number. - summary: Object. Object with detailed information on balance, deposits, withdrawals and fees. - txs: Array of transactions. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/validate/bank-statement/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64File": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/validate/bank-statement/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64File": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/validate/bank-statement/v2", headers=headers, json={ "base64File": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/validate/bank-statement/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64File\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/api-validate-curp-by-data-v3` - URL: https://developer.incode.com/api-reference/api-validate-curp-by-data-v3/ - Markdown: https://developer.incode.com/api-reference/api-validate-curp-by-data-v3.md - Endpoint: `POST /api/validate/curp-by-data/v3` # CURP scraping validation by data `POST /api/validate/curp-by-data/v3` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Check for valid CURP directly with an automated search in [https://www.gob.mx/curp/](https://www.gob.mx/curp/) and return corresponding curp of that person. Parameters are the person's details. Scraping service will start working asynchronously and this service will return a resultsId to fetch the results in [/api/fetch/curp/v3](#/API%20Validations/fetchCurp3). The recommended wait time is 25 sec. Valid values for state are the ones listed by renapo in this link: [https://es.wikipedia.org/wiki/Plantilla:Abreviaciones_de_los_estados_de_México](https://es.wikipedia.org/wiki/Plantilla:Abreviaciones_de_los_estados_de_México) ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `curp` | string | | User's curp. Has to be in valid format. If it isn't present, then curp value from interview is used. | | `name` | string | | | | `firstLastName` | string | | | | `secondLastName` | string | | | | `gender` | string | | Valid gender values are "H" (Hombre, male), "M" (mujer, female) and "X" (otro, other) Enum: `H`, `M`, `X` | | `birthDate` | string (dd/mm/yyyy) | | | | `state` | string | | | | `externalId` | string | | | ## Responses ### 200 idResults: String. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/validate/curp-by-data/v3 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "curp": "", "name": "", "firstLastName": "", "secondLastName": "", "gender": "", "birthDate": "", "state": "", "externalId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/validate/curp-by-data/v3", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "curp": "", "name": "", "firstLastName": "", "secondLastName": "", "gender": "", "birthDate": "", "state": "", "externalId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/validate/curp-by-data/v3", headers=headers, json={ "curp": "", "name": "", "firstLastName": "", "secondLastName": "", "gender": "", "birthDate": "", "state": "", "externalId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/validate/curp-by-data/v3")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"curp\": \"\",\n \"name\": \"\",\n \"firstLastName\": \"\",\n \"secondLastName\": \"\",\n \"gender\": \"\",\n \"birthDate\": \"\",\n \"state\": \"\",\n \"externalId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/api-validate-curp-by-data-v4` - URL: https://developer.incode.com/api-reference/api-validate-curp-by-data-v4/ - Markdown: https://developer.incode.com/api-reference/api-validate-curp-by-data-v4.md - Endpoint: `POST /api/validate/curp-by-data/v4` # CURP by data validation v4 `POST /api/validate/curp-by-data/v4` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Check for valid CURP based on a person data and return corresponding values of that person including the CURP. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `curp` | string | | User's curp. Has to be in valid format. If it isn't present, then curp value from interview is used. | | `name` | string | | | | `firstLastName` | string | | | | `secondLastName` | string | | | | `gender` | string | | Valid gender values are "H" (Hombre, male), "M" (mujer, female) and "X" (otro, other) Enum: `H`, `M`, `X` | | `birthDate` | string (dd/mm/yyyy) | | | | `state` | string | | | | `externalId` | string | | | ## Responses ### 200 If data doesn't match any CURP then the field renapo_valid will be false. If there is an error with the request data an error object is returned with the details, example:" ``` { "error": { "descripcionRespuesta": "DATOS INCORRECTOS: [El campo no cumple con el formato.]", "codigoRespuesta": "02", } } ``` Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `curp` | string | | Curp | | `sex` | string | | Sex Enum: `Mujer`, `Hombre`, `X` | | `nationality` | string | | Nationality | | `result` | string | | | | `transactionId` | string | | | | `renapo_valid` | boolean | | Flag indicating if CURP validation passed - tipoError present in response | | `names` | string | | Names | | `paternal_surname` | string | | Paternal surname | | `mothers_maiden_name` | string | | Mother maiden name | | `birthdate` | string | | Birth Date in format DD/MM/YYYY | | `entity_birth` | string | | Birth State | | `probation_document` | string | | Probation Document | | `probation_document_data` | object | | Key/Value structure. All keys are type of string. Available Key values: - anioReg - foja - tomo - libro - numActa - CRIP - numEntidadReg - cveMunicipioReg - NumRegExtranjeros - FolioCarta - cveEntidadNac - cveEntidadEmisora | | `status_curp` | string | | Status Curp | | `deceasedStatus` | string | | Deceased Status | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/validate/curp-by-data/v4 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "curp": "", "name": "", "firstLastName": "", "secondLastName": "", "gender": "", "birthDate": "", "state": "", "externalId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/validate/curp-by-data/v4", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "curp": "", "name": "", "firstLastName": "", "secondLastName": "", "gender": "", "birthDate": "", "state": "", "externalId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/validate/curp-by-data/v4", headers=headers, json={ "curp": "", "name": "", "firstLastName": "", "secondLastName": "", "gender": "", "birthDate": "", "state": "", "externalId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/validate/curp-by-data/v4")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"curp\": \"\",\n \"name\": \"\",\n \"firstLastName\": \"\",\n \"secondLastName\": \"\",\n \"gender\": \"\",\n \"birthDate\": \"\",\n \"state\": \"\",\n \"externalId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "curp": "string", "sex": "Mujer", "nationality": "string", "result": "string", "transactionId": "string", "renapo_valid": true, "names": "string", "paternal_surname": "string", "mothers_maiden_name": "string", "birthdate": "string", "entity_birth": "string", "probation_document": "string", "probation_document_data": {}, "status_curp": "string", "deceasedStatus": "string" } ``` --- - Path: `api-reference/api-validate-curp-v3` - URL: https://developer.incode.com/api-reference/api-validate-curp-v3/ - Markdown: https://developer.incode.com/api-reference/api-validate-curp-v3.md - Endpoint: `POST /api/validate/curp/v3` # CURP scraping validation `POST /api/validate/curp/v3` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Check for valid CURP directly with an automated search in [https://www.gob.mx/curp/](https://www.gob.mx/curp/) and return corresponding values of that person. Parameter must be "curp". Scraping service will start working asynchronously and this service will return a resultsId to fetch the results in [/api/fetch/curp/v3](#/API%20Validations/fetchCurp3). The recommended wait time is 25 sec. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `curp` | string | | | | `externalId` | string | | | ## Responses ### 200 idResults: String ### 400 Invalid curp: a 400 error will be thrown if the curp provided does not match the correct pattern. Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/validate/curp/v3 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "curp": "", "externalId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/validate/curp/v3", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "curp": "", "externalId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/validate/curp/v3", headers=headers, json={ "curp": "", "externalId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/validate/curp/v3")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"curp\": \"\",\n \"externalId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/api-validate-curp-v4` - URL: https://developer.incode.com/api-reference/api-validate-curp-v4/ - Markdown: https://developer.incode.com/api-reference/api-validate-curp-v4.md - Endpoint: `POST /api/validate/curp/v4` # CURP validation v4 `POST /api/validate/curp/v4` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Check for valid CURP and return corresponding values of that person. If CURP is not found then renapo_valid field will be false. if CURP has invalid format or is not found an error object with details will be returned, for example: ``` { "error": { "codigoError": "06", "message": "La CURP no se encuentra en la base de datos" }, "result": "Not valid request: La CURP no se encuentra en la base de datos code: 06", } ``` ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `curp` | string | | | | `externalId` | string | | | ## Responses ### 200 Respuesta con validación de CURP ```json { "success": true, "curp": "XXXX820814HDFABC01", "sex": "MUJER", "nationality": "MEX", "result": "success", "requestData": { "name": "JUANA", "firstLastName": "PEREZ", "secondLastName": "LOPEZ", "gender": "M", "birthDate": "14/08/1982", "state": "DF" }, "transactionId": "transaction1234567890", "renapo_valid": true, "names": "JUANA", "paternal_surname": "PEREZ", "mothers_maiden_name": "LOPEZ", "birthdate": "14/08/1982", "entity_birth": "DF", "probation_document": "1", "probation_document_data": { "foja": "", "numEntidadReg": "09", "libro": "", "NumRegExtranjeros": "", "cveEntidadNac": "DF", "numActa": "00001", "CRIP": "", "tomo": "", "cveEntidadEmisora": "", "anioReg": "1982", "cveMunicipioReg": "001", "FolioCarta": "" }, "status_curp": "RCN", "deceasedStatus": "ALIVE" } ``` ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ### 500 Internal error during CURP validation. ### 504 The request to validate the CURP exceeded the allowed time limit ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/validate/curp/v4 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "curp": "", "externalId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/validate/curp/v4", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "curp": "", "externalId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/validate/curp/v4", headers=headers, json={ "curp": "", "externalId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/validate/curp/v4")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"curp\": \"\",\n \"externalId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "curp": "XXXX820814HDFABC01", "sex": "MUJER", "nationality": "MEX", "result": "success", "requestData": { "name": "JUANA", "firstLastName": "PEREZ", "secondLastName": "LOPEZ", "gender": "M", "birthDate": "14/08/1982", "state": "DF" }, "transactionId": "transaction1234567890", "renapo_valid": true, "names": "JUANA", "paternal_surname": "PEREZ", "mothers_maiden_name": "LOPEZ", "birthdate": "14/08/1982", "entity_birth": "DF", "probation_document": "1", "probation_document_data": { "foja": "", "numEntidadReg": "09", "libro": "", "NumRegExtranjeros": "", "cveEntidadNac": "DF", "numActa": "00001", "CRIP": "", "tomo": "", "cveEntidadEmisora": "", "anioReg": "1982", "cveMunicipioReg": "001", "FolioCarta": "" }, "status_curp": "RCN", "deceasedStatus": "ALIVE" } ``` --- - Path: `api-reference/api-validate-ine` - URL: https://developer.incode.com/api-reference/api-validate-ine/ - Markdown: https://developer.incode.com/api-reference/api-validate-ine.md - Endpoint: `POST /api/validate/ine` # INE scraping validation `POST /api/validate/ine` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Check for valid INE directly with an automated search in [https://listanominal.ine.mx/scpln/](https://listanominal.ine.mx/scpln/) and return corresponding values of that ID. Scraping service will start working asynchronously and this service will return a resultsId to fetch the results in [/api/fetch/ine](#/API%20Validations/fetchIne). The recommended wait time is 20 sec. Possible parameters are ocr, cic, claveElector and numeroEmision but the parameters sent depend on the model of the INE/IFE to be consulted. Model C: IFE with emission year from 2008 to 2013, should send claveElector, numeroEmision and ocr from the back of ID. Model D: INE with emission year from 2013, should send cic from back of ID (9 characters) and OCR from the back of the ID (13 characters). Model E,F,G,H: INE with emission year from 2014 onwards, should send CIC from the back of the ID (9 characters) and citizen id (ocr) from the back of the ID (9 characters). Additional indications and information on the models of the credentials can be found in [https://listanominal.ine.mx/scpln/](https://listanominal.ine.mx/scpln/) ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `ocr` | string | yes | | | `identificadorCiudadano` | string | | | | `cic` | string | | Mandatory for model D,E,F,G,H | | `claveElector` | string | | Mandatory for model C | | `numeroEmision` | string | | Mandatory for model C, should have a length of 2: ex 02 | ## Responses ### 200 idResults: String ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/validate/ine \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "ocr": "", "identificadorCiudadano": "", "cic": "", "claveElector": "", "numeroEmision": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/validate/ine", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "ocr": "", "identificadorCiudadano": "", "cic": "", "claveElector": "", "numeroEmision": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/validate/ine", headers=headers, json={ "ocr": "", "identificadorCiudadano": "", "cic": "", "claveElector": "", "numeroEmision": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/validate/ine")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"ocr\": \"\",\n \"identificadorCiudadano\": \"\",\n \"cic\": \"\",\n \"claveElector\": \"\",\n \"numeroEmision\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/api-validate-registraduria` - URL: https://developer.incode.com/api-reference/api-validate-registraduria/ - Markdown: https://developer.incode.com/api-reference/api-validate-registraduria.md - Endpoint: `POST /api/validate/registraduria` # Registraduria validation - Colombian id `POST /api/validate/registraduria` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Check for valid Colombian ID and return corresponding values of that person. Optionally, you can set isForeign flag to true to check for foreign people living in Colombia. An example could be a Mexican person with a Colombian ID. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `id` | string | | | | `emissionDate` | string (dd/mm/yyyy) | | mandatory if isForeign is true, otherwise optional | | `fullName` | string | | | | `isForeign` | boolean | | | | `nameBean` | NameBean | | | | `nameBean.fullName` | string | | | | `nameBean.fullNameNativeScript` | string | | | | `nameBean.firstNameNativeScript` | string | | | | `nameBean.paternalLastNameNativeScript` | string | | | | `nameBean.maternalLastNameNativeScript` | string | | | | `nameBean.machineReadableFullName` | string | | Full name from Barcode or MRZ | | `nameBean.firstName` | string | | | | `nameBean.middleName` | string | | | | `nameBean.givenName` | string | | | | `nameBean.givenNameMrz` | string | | | | `nameBean.initials` | string | | Initials as returned by bank-ID schemes (e.g. iDIN) — the only given-name evidence they provide | | `nameBean.nameSuffix` | string | | | | `nameBean.paternalLastName` | string | | | | `nameBean.maternalLastName` | string | | | | `nameBean.lastNameMrz` | string | | | | `nameBean.familyName` | string | | | ## Responses ### 200 Response: - data: Object with following fields. - anio_resolucion: Integer. - codigo_error_datos_cedula: Integer. - codigo_respuesta: Integer. - date: String. - departamento_expedicion: String. - descripcion_estado: String. - estado_cedula: Integer. - fecha_expedicion: String. - informacion_adicional: String. - municipio_expedicion: String. - nombre_completo: String. - nuip: Integer. - numero_resolucion: Integer. - particula: String. - primer_apellido: String. - primer_nombre: String. - segundo_apellido: String. - segundo_nombre: String. - error: String. - findings: String []. - status: Boolean. A response example for foreigners is: ``` { "data": { "ce": "456123", "estado": "VIGENTE", "fecha_expedicion": "02/10/2019", "fecha_nacimiento": "05/03/1956", "fecha_vencimiento": "01/10/2024", "nacionalidad": "CHILENA", "nombre_completo": "JUAN ALEJANDRO PEREZ LOPEZ" }, "error": "", "findings": [], "status": true } ``` ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/validate/registraduria \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "id": "", "emissionDate": "", "fullName": "", "isForeign": false, "nameBean": "", "nameBean.fullName": "", "nameBean.fullNameNativeScript": "", "nameBean.firstNameNativeScript": "", "nameBean.paternalLastNameNativeScript": "", "nameBean.maternalLastNameNativeScript": "", "nameBean.machineReadableFullName": "", "nameBean.firstName": "", "nameBean.middleName": "", "nameBean.givenName": "", "nameBean.givenNameMrz": "", "nameBean.initials": "", "nameBean.nameSuffix": "", "nameBean.paternalLastName": "", "nameBean.maternalLastName": "", "nameBean.lastNameMrz": "", "nameBean.familyName": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/validate/registraduria", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "id": "", "emissionDate": "", "fullName": "", "isForeign": false, "nameBean": "", "nameBean.fullName": "", "nameBean.fullNameNativeScript": "", "nameBean.firstNameNativeScript": "", "nameBean.paternalLastNameNativeScript": "", "nameBean.maternalLastNameNativeScript": "", "nameBean.machineReadableFullName": "", "nameBean.firstName": "", "nameBean.middleName": "", "nameBean.givenName": "", "nameBean.givenNameMrz": "", "nameBean.initials": "", "nameBean.nameSuffix": "", "nameBean.paternalLastName": "", "nameBean.maternalLastName": "", "nameBean.lastNameMrz": "", "nameBean.familyName": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/validate/registraduria", headers=headers, json={ "id": "", "emissionDate": "", "fullName": "", "isForeign": False, "nameBean": "", "nameBean.fullName": "", "nameBean.fullNameNativeScript": "", "nameBean.firstNameNativeScript": "", "nameBean.paternalLastNameNativeScript": "", "nameBean.maternalLastNameNativeScript": "", "nameBean.machineReadableFullName": "", "nameBean.firstName": "", "nameBean.middleName": "", "nameBean.givenName": "", "nameBean.givenNameMrz": "", "nameBean.initials": "", "nameBean.nameSuffix": "", "nameBean.paternalLastName": "", "nameBean.maternalLastName": "", "nameBean.lastNameMrz": "", "nameBean.familyName": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/validate/registraduria")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"id\": \"\",\n \"emissionDate\": \"\",\n \"fullName\": \"\",\n \"isForeign\": false,\n \"nameBean\": \"\",\n \"nameBean.fullName\": \"\",\n \"nameBean.fullNameNativeScript\": \"\",\n \"nameBean.firstNameNativeScript\": \"\",\n \"nameBean.paternalLastNameNativeScript\": \"\",\n \"nameBean.maternalLastNameNativeScript\": \"\",\n \"nameBean.machineReadableFullName\": \"\",\n \"nameBean.firstName\": \"\",\n \"nameBean.middleName\": \"\",\n \"nameBean.givenName\": \"\",\n \"nameBean.givenNameMrz\": \"\",\n \"nameBean.initials\": \"\",\n \"nameBean.nameSuffix\": \"\",\n \"nameBean.paternalLastName\": \"\",\n \"nameBean.maternalLastName\": \"\",\n \"nameBean.lastNameMrz\": \"\",\n \"nameBean.familyName\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/api-validate-registraduria-ppt` - URL: https://developer.incode.com/api-reference/api-validate-registraduria-ppt/ - Markdown: https://developer.incode.com/api-reference/api-validate-registraduria-ppt.md - Endpoint: `POST /api/validate/registraduria-ppt` # Colombia - Temporary Residency / PPT Validation `POST /api/validate/registraduria-ppt` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Check for a valid Colombian temporary residency ID and return the corresponding values of that person. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `id` | string | | | | `emissionDate` | string (dd/mm/yyyy) | | mandatory if isForeign is true, otherwise optional | | `fullName` | string | | | | `isForeign` | boolean | | | | `nameBean` | NameBean | | | | `nameBean.fullName` | string | | | | `nameBean.fullNameNativeScript` | string | | | | `nameBean.firstNameNativeScript` | string | | | | `nameBean.paternalLastNameNativeScript` | string | | | | `nameBean.maternalLastNameNativeScript` | string | | | | `nameBean.machineReadableFullName` | string | | Full name from Barcode or MRZ | | `nameBean.firstName` | string | | | | `nameBean.middleName` | string | | | | `nameBean.givenName` | string | | | | `nameBean.givenNameMrz` | string | | | | `nameBean.initials` | string | | Initials as returned by bank-ID schemes (e.g. iDIN) — the only given-name evidence they provide | | `nameBean.nameSuffix` | string | | | | `nameBean.paternalLastName` | string | | | | `nameBean.maternalLastName` | string | | | | `nameBean.lastNameMrz` | string | | | | `nameBean.familyName` | string | | | ## Responses ### 200 - data: Object with following fields. - estado: String. - fecha_entrega: String. - identidad_venezolana: String. - lugar_entrega: String. - nombre_completo: String. - ppt: String. - tipo_documento: String. - error: String. - findings: String []. - status: Boolean. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/validate/registraduria-ppt \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "id": "", "emissionDate": "", "fullName": "", "isForeign": false, "nameBean": "", "nameBean.fullName": "", "nameBean.fullNameNativeScript": "", "nameBean.firstNameNativeScript": "", "nameBean.paternalLastNameNativeScript": "", "nameBean.maternalLastNameNativeScript": "", "nameBean.machineReadableFullName": "", "nameBean.firstName": "", "nameBean.middleName": "", "nameBean.givenName": "", "nameBean.givenNameMrz": "", "nameBean.initials": "", "nameBean.nameSuffix": "", "nameBean.paternalLastName": "", "nameBean.maternalLastName": "", "nameBean.lastNameMrz": "", "nameBean.familyName": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/validate/registraduria-ppt", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "id": "", "emissionDate": "", "fullName": "", "isForeign": false, "nameBean": "", "nameBean.fullName": "", "nameBean.fullNameNativeScript": "", "nameBean.firstNameNativeScript": "", "nameBean.paternalLastNameNativeScript": "", "nameBean.maternalLastNameNativeScript": "", "nameBean.machineReadableFullName": "", "nameBean.firstName": "", "nameBean.middleName": "", "nameBean.givenName": "", "nameBean.givenNameMrz": "", "nameBean.initials": "", "nameBean.nameSuffix": "", "nameBean.paternalLastName": "", "nameBean.maternalLastName": "", "nameBean.lastNameMrz": "", "nameBean.familyName": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/validate/registraduria-ppt", headers=headers, json={ "id": "", "emissionDate": "", "fullName": "", "isForeign": False, "nameBean": "", "nameBean.fullName": "", "nameBean.fullNameNativeScript": "", "nameBean.firstNameNativeScript": "", "nameBean.paternalLastNameNativeScript": "", "nameBean.maternalLastNameNativeScript": "", "nameBean.machineReadableFullName": "", "nameBean.firstName": "", "nameBean.middleName": "", "nameBean.givenName": "", "nameBean.givenNameMrz": "", "nameBean.initials": "", "nameBean.nameSuffix": "", "nameBean.paternalLastName": "", "nameBean.maternalLastName": "", "nameBean.lastNameMrz": "", "nameBean.familyName": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/validate/registraduria-ppt")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"id\": \"\",\n \"emissionDate\": \"\",\n \"fullName\": \"\",\n \"isForeign\": false,\n \"nameBean\": \"\",\n \"nameBean.fullName\": \"\",\n \"nameBean.fullNameNativeScript\": \"\",\n \"nameBean.firstNameNativeScript\": \"\",\n \"nameBean.paternalLastNameNativeScript\": \"\",\n \"nameBean.maternalLastNameNativeScript\": \"\",\n \"nameBean.machineReadableFullName\": \"\",\n \"nameBean.firstName\": \"\",\n \"nameBean.middleName\": \"\",\n \"nameBean.givenName\": \"\",\n \"nameBean.givenNameMrz\": \"\",\n \"nameBean.initials\": \"\",\n \"nameBean.nameSuffix\": \"\",\n \"nameBean.paternalLastName\": \"\",\n \"nameBean.maternalLastName\": \"\",\n \"nameBean.lastNameMrz\": \"\",\n \"nameBean.familyName\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/api-validate-rfc` - URL: https://developer.incode.com/api-reference/api-validate-rfc/ - Markdown: https://developer.incode.com/api-reference/api-validate-rfc.md - Endpoint: `POST /api/validate/rfc` # RFC validation `POST /api/validate/rfc` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Check for valid RFC. If RFC is not found then validRFC field will be false. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `rfc` | string | | | ## Responses ### 200 RFC validation result Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `validRFC` | boolean | | | | `status` | string | | | | `message` | string | | | | `rfcType` | string | | | | `messageCode` | string | | | | `errorMessage` | string | | | ```json { "validRFC": true, "status": "OK", "message": "RFC Valido", "rfcType": "F", "messageCode": "0" } ``` ### 400 Invalid RFC format Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ```json { "timestamp": 1622548800000, "status": 400, "error": "Bad Request", "message": "BadRequestException: Invalid curp", "path": "/api/validate/rfc" } ``` ### 500 Internal server error during validation Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ```json { "timestamp": 1622548800000, "status": 500, "error": "Internal Server Error", "path": "/api/validate/rfc" } ``` ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/validate/rfc \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "rfc": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/validate/rfc", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "rfc": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/validate/rfc", headers=headers, json={ "rfc": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/validate/rfc")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"rfc\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "validRFC": true, "status": "OK", "message": "RFC Valido", "rfcType": "F", "messageCode": "0" } ``` --- - Path: `api-reference/api-validate-rfc-by-curp-v2` - URL: https://developer.incode.com/api-reference/api-validate-rfc-by-curp-v2/ - Markdown: https://developer.incode.com/api-reference/api-validate-rfc-by-curp-v2.md - Endpoint: `POST /api/validate/rfc-by-curp/v2` # RFC validation by CURP v2 `POST /api/validate/rfc-by-curp/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Check for valid CURP, use obtained data to calculate RFC and then validate the RFC. If CURP is not found then renapo_valid field will be false. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `curp` | string | | | | `externalId` | string | | | ## Responses ### 200 Respuesta con validación de CURP ```json { "success": true, "curp": "XXXX820814HDFABC01", "sex": "MUJER", "nationality": "MEX", "result": "success", "requestData": { "name": "JUANA", "firstLastName": "PEREZ", "secondLastName": "LOPEZ", "gender": "M", "birthDate": "14/08/1982", "state": "DF" }, "transactionId": "transaction1234567890", "renapo_valid": true, "names": "JUANA", "paternal_surname": "PEREZ", "mothers_maiden_name": "LOPEZ", "birthdate": "14/08/1982", "entity_birth": "DF", "probation_document": "1", "probation_document_data": { "foja": "", "numEntidadReg": "09", "libro": "", "NumRegExtranjeros": "", "cveEntidadNac": "DF", "numActa": "00001", "CRIP": "", "tomo": "", "cveEntidadEmisora": "", "anioReg": "1982", "cveMunicipioReg": "001", "FolioCarta": "" }, "status_curp": "RCN", "deceasedStatus": "ALIVE" } ``` ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ### 500 Internal error during CURP validation. ### 504 The request to validate the CURP exceeded the allowed time limit ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/validate/rfc-by-curp/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "curp": "", "externalId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/validate/rfc-by-curp/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "curp": "", "externalId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/validate/rfc-by-curp/v2", headers=headers, json={ "curp": "", "externalId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/validate/rfc-by-curp/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"curp\": \"\",\n \"externalId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "curp": "XXXX820814HDFABC01", "sex": "MUJER", "nationality": "MEX", "result": "success", "requestData": { "name": "JUANA", "firstLastName": "PEREZ", "secondLastName": "LOPEZ", "gender": "M", "birthDate": "14/08/1982", "state": "DF" }, "transactionId": "transaction1234567890", "renapo_valid": true, "names": "JUANA", "paternal_surname": "PEREZ", "mothers_maiden_name": "LOPEZ", "birthdate": "14/08/1982", "entity_birth": "DF", "probation_document": "1", "probation_document_data": { "foja": "", "numEntidadReg": "09", "libro": "", "NumRegExtranjeros": "", "cveEntidadNac": "DF", "numActa": "00001", "CRIP": "", "tomo": "", "cveEntidadEmisora": "", "anioReg": "1982", "cveMunicipioReg": "001", "FolioCarta": "" }, "status_curp": "RCN", "deceasedStatus": "ALIVE" } ``` --- - Path: `api-reference/api-validate-ssn` - URL: https://developer.incode.com/api-reference/api-validate-ssn/ - Markdown: https://developer.incode.com/api-reference/api-validate-ssn.md - Endpoint: `POST /api/validate/ssn` # SSN Validation `POST /api/validate/ssn` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Validate a social security number and the person associated with it. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `ssn` | string | | Person's social security number | | `dateOfBirth` | string (YYYY-MM-DD) | | Person's birthdate | | `firstName` | string | | Person's first name | | `lastName` | string | | Person's last name | | `middleName` | string | | Person's middle name | | `email` | string | | Person's email | ## Responses ### 200 - requestId: Int. Response's status, check catalog. - ssnValid: Boolean. Indicates if ssn information sent is valid. - deceasedPerson: Boolean. Indicates if information sent corresponds to a deceased person. - errorCode: String. Error code in case something goes wrong. - errorCodeDescription: String. Error description in case something goes wrong or if ssn is not valid. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/validate/ssn \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "ssn": "", "dateOfBirth": "", "firstName": "", "lastName": "", "middleName": "", "email": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/validate/ssn", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "ssn": "", "dateOfBirth": "", "firstName": "", "lastName": "", "middleName": "", "email": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/validate/ssn", headers=headers, json={ "ssn": "", "dateOfBirth": "", "firstName": "", "lastName": "", "middleName": "", "email": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/validate/ssn")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"ssn\": \"\",\n \"dateOfBirth\": \"\",\n \"firstName\": \"\",\n \"lastName\": \"\",\n \"middleName\": \"\",\n \"email\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/api-validate-vin` - URL: https://developer.incode.com/api-reference/api-validate-vin/ - Markdown: https://developer.incode.com/api-reference/api-validate-vin.md - Endpoint: `POST /api/validate/vin` # Vehicle Identification Number Validation `POST /api/validate/vin` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Validate a VIN number and obtain data related to reports about crashes, theft, etc. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `vin` | string | | Vehicle Identification Number | | `getPdf` | boolean | | Obtains pdf with details in base64 format. | ## Responses ### 200 - id: String. - vin: String. - attributes: Object with following fields. - vin: String. - year: String. - make: String. - model: String. - type: String. - made_In: String. - style: String. - engine: String. - success: Boolean. - error: String. - base64PDF: String. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/api/validate/vin \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "vin": "", "getPdf": false }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/api/validate/vin", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "vin": "", "getPdf": false }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/api/validate/vin", headers=headers, json={ "vin": "", "getPdf": False }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/api/validate/vin")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"vin\": \"\",\n \"getPdf\": false\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/attach-signature-on-annotation` - URL: https://developer.incode.com/api-reference/attach-signature-on-annotation/ - Markdown: https://developer.incode.com/api-reference/attach-signature-on-annotation.md - Endpoint: `POST /omni/attach-signature-on-annotation` # Attach signature on annotation `POST /omni/attach-signature-on-annotation` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Attach signature from interview to previously uploaded PDF contracts at all places annotated with text from request, with desired height on pdf. Annotations must contain text with either preselected values, or alternative can be supplied. If user wishes to use signature supplied during onboarding, DEFAULT signature type should be used. Preselected values are: DEFAULT, INITIALS, PATIENTS_SIGNATURE, NON_MEDICAL_SIGNATURE_1, NON_MEDICAL_SIGNATURE_2, MEDICAL_SIGNATURE_1, MEDICAL_SIGNATURE_2 Endpoint is intended to be used as fluent api. One call to the api gives in responses id of the signed document which can then be used in the subsequent call to continuously add another signature on a different annotation. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | | | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `contractId` | string | yes | IDs of previously added contract (ID is returned on /add/document?imageType=contract) | | `signedContractId` | string | | IDs of previously signed contract (ID is returned as response from the previous /attach/signature/on/annotation) | | `signatureType` | string | | One of the preselected values for annotation text Enum: `DEFAULT`, `INITIALS`, `PATIENTS_SIGNATURE`, `NON_MEDICAL_SIGNATURE_1`, `NON_MEDICAL_SIGNATURE_2`, `MEDICAL_SIGNATURE_1`, `MEDICAL_SIGNATURE_2`, `MEDICAL_SIGNATURE_3`, `PATIENTS_SIGNATURE_NAME`, `NON_MEDICAL_SIGNATURE_1_NAME`, `NON_MEDICAL_SIGNATURE_2_NAME`, `MEDICAL_SIGNATURE_1_NAME`, `MEDICAL_SIGNATURE_2_NAME` | | `alternativeSignatureType` | string | | If annotation text is none of the preselected values, pass in here the alternative value (signature must be inserted with the alternative value into database as it's signature type) | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `additionalInformation` | object | | | ```json { "success": true, "signedDocumentId": "new signed document ID", "signedDocumentURL": "temporary URL to new signed document" } ``` ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/attach-signature-on-annotation \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "contractId": "", "signedContractId": "", "signatureType": "", "alternativeSignatureType": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/attach-signature-on-annotation", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "contractId": "", "signedContractId": "", "signatureType": "", "alternativeSignatureType": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/attach-signature-on-annotation", headers=headers, json={ "contractId": "", "signedContractId": "", "signatureType": "", "alternativeSignatureType": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/attach-signature-on-annotation")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"contractId\": \"\",\n \"signedContractId\": \"\",\n \"signatureType\": \"\",\n \"alternativeSignatureType\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "signedDocumentId": "new signed document ID", "signedDocumentURL": "temporary URL to new signed document" } ``` --- - Path: `api-reference/attach-signature-to-pdf` - URL: https://developer.incode.com/api-reference/attach-signature-to-pdf/ - Markdown: https://developer.incode.com/api-reference/attach-signature-to-pdf.md - Endpoint: `POST /omni/attach-signature-to-pdf` # Attach signature to pdf document `POST /omni/attach-signature-to-pdf` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Attach signature from interview to supplied pdf at (x, y) coordinates with desired height to desired page on pdf. Coordinates are relative to left bottom corner of page. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `x` | query | integer (int32) | yes | The x axis where to place the signature image (from the left bottom corner of page) | | `y` | query | integer (int32) | yes | The y axis where to place the signature image (from the left bottom corner of page) | | `height` | query | integer (int32) | yes | Height of the image when placed in the pdf, keeps aspect ratio. | | `pageNumber` | query | integer (int32) | | number of page on which to put the signature image (pages numbering start from 1, default value is 1) | | `api-version` | header | string | yes | | ## Responses ### 200 Stream of new pdf document file ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/attach-signature-to-pdf \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/attach-signature-to-pdf", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/attach-signature-to-pdf", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/attach-signature-to-pdf")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` --- - Path: `api-reference/attach-signature-to-pdf-v2` - URL: https://developer.incode.com/api-reference/attach-signature-to-pdf-v2/ - Markdown: https://developer.incode.com/api-reference/attach-signature-to-pdf-v2.md - Endpoint: `POST /omni/attach-signature-to-pdf/v2` # Attach signature to multiple pdf documents `POST /omni/attach-signature-to-pdf/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Attach signature from interview to previously uploaded PDF contracts at (x, y) coordinates with desired height to desired page on pdf. Coordinates are relative to left bottom corner of page. Every document id can have multiple signature attached to it, hence the array of signature positions for every document. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | | | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `signaturePositionsOnContracts` | object | | | | `includeSignedDocumentInResponse` | boolean | | Includes the signed document in base64 in response. | | `includeNom151SignatureInResponse` | boolean | | Includes the Nom 151 signature of the signed document in the response. | | `includeSignedDocumentWithNom151InResponse` | boolean | | Includes the signed document with the Nom 151 signature attached in the pdf in the response. | | `includeCertificateDetailsInResponse` | boolean | | Include the certificate details with which the Nom151 signature was created. | Example — example: ```json { "includeSignedDocumentInResponse": true, "includeNom151SignatureInResponse": true, "includeSignedDocumentWithNom151InResponse": true, "includeCertificateDetailsInResponse": true, "signaturePositionsOnContracts": { "e81cd044-98fd-47b0-b0c5-937b22b69977#contract1": [ { "x": 10, "y": 10, "height": 10, "pageNumber": 2, "orientation": "ORIENTATION_NORMAL" }, { "x": 20, "y": 30, "height": 10, "pageNumber": 1, "orientation": "ORIENTATION_90_DEGREE" } ], "1ffcd128-153f-40d4-a881-7c3362e58806#contract2": [ { "x": 10, "y": 10, "height": 20, "pageNumber": 2 }, { "x": 20, "y": 30, "height": 20, "pageNumber": 1 } ], "074355ff-81f5-4b9f-a6c6-eb41bdcaf9f1#contract3": [ { "x": 10, "y": 10, "height": 30, "pageNumber": 2 }, { "x": 20, "y": 30, "height": 30, "pageNumber": 1 } ] } } ``` ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `additionalInformation` | object | | | ```json { "success": true, "sessionStatus": "Alive", "additionalInformation": { "signingDetails": { "providedBy": "Advantage Security, S. de R.L. de C.V.", "requestedBy": "Incode Technologies Inc.", "policyValue": "2.16.484.101.10.316.2.1.1.2.", "signingHash": "AHm8P/i2AnvdM8vKfVLWe5xCovA2v/7l3zmWc1+N4HE=", "certificateSerial": "2C", "signingTimestamp": "1651076647389" }, "signedDocumentBase64": "base64 of pdf document", "signedDocumentWithNomSignatureBase64": "base64 of pdf document with nom151" } } ``` ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/attach-signature-to-pdf/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "signaturePositionsOnContracts": {}, "includeSignedDocumentInResponse": false, "includeNom151SignatureInResponse": false, "includeSignedDocumentWithNom151InResponse": false, "includeCertificateDetailsInResponse": false }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/attach-signature-to-pdf/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "signaturePositionsOnContracts": {}, "includeSignedDocumentInResponse": false, "includeNom151SignatureInResponse": false, "includeSignedDocumentWithNom151InResponse": false, "includeCertificateDetailsInResponse": false }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/attach-signature-to-pdf/v2", headers=headers, json={ "signaturePositionsOnContracts": {}, "includeSignedDocumentInResponse": False, "includeNom151SignatureInResponse": False, "includeSignedDocumentWithNom151InResponse": False, "includeCertificateDetailsInResponse": False }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/attach-signature-to-pdf/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"signaturePositionsOnContracts\": {},\n \"includeSignedDocumentInResponse\": false,\n \"includeNom151SignatureInResponse\": false,\n \"includeSignedDocumentWithNom151InResponse\": false,\n \"includeCertificateDetailsInResponse\": false\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "additionalInformation": { "signingDetails": { "providedBy": "Advantage Security, S. de R.L. de C.V.", "requestedBy": "Incode Technologies Inc.", "policyValue": "2.16.484.101.10.316.2.1.1.2.", "signingHash": "AHm8P/i2AnvdM8vKfVLWe5xCovA2v/7l3zmWc1+N4HE=", "certificateSerial": "2C", "signingTimestamp": "1651076647389" }, "signedDocumentBase64": "base64 of pdf document", "signedDocumentWithNomSignatureBase64": "base64 of pdf document with nom151" } } ``` --- - Path: `api-reference/attach-stamp-on-annotation` - URL: https://developer.incode.com/api-reference/attach-stamp-on-annotation/ - Markdown: https://developer.incode.com/api-reference/attach-stamp-on-annotation.md - Endpoint: `POST /omni/attach-stamp-on-annotation` # Attach stamp on annotation `POST /omni/attach-stamp-on-annotation` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Substitute stamps from interview to previously uploaded PDF contracts at all places with pdf text annotations. Annotations must contain text with preselected values. Preselected values are: - NAME (NAME_STAMP), - ADDRESS (ADDRESS_STAMP), - DATE #ZoneId# #Format#, - AGE, - SEX, - DOB #Format#, - COUNTRY, - STATE, - PHONE, - TIME #ZoneId# #Format#, - SECOND_NAME* Replace parameter ZoneId with full size zone using time zones used in Java8 TimeDate API Replace parameter Format with format you wish to display the time and date Stamps are added in Helvetica, size 13. Endpoint is intended to be used as fluent api. One call to the api gives in responses id of the signed document which can then be used in the subsequent call to continuously add another signature on a different annotation. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `contractId` | string | yes | IDs of previously added contract (ID is returned on /add/document?imageType=contract | | `customFields` | object | | Use to add substitute text for stamps with asterisk Eg: `{ "contractId": "e81cd044-98fd-47b0-b0c5-937b22b69977#contract1", "customFields": { "SECOND_NAME": "Luke Skywalker" } }` | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `additionalInformation` | object | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/attach-stamp-on-annotation \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "contractId": "", "customFields": {} }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/attach-stamp-on-annotation", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "contractId": "", "customFields": {} }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/attach-stamp-on-annotation", headers=headers, json={ "contractId": "", "customFields": {} }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/attach-stamp-on-annotation")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"contractId\": \"\",\n \"customFields\": {}\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "additionalInformation": {} } ``` --- - Path: `api-reference/authentication-verify` - URL: https://developer.incode.com/api-reference/authentication-verify/ - Markdown: https://developer.incode.com/api-reference/authentication-verify.md - Endpoint: `POST /omni/authentication/verify` # Verify authentication attempt `POST /omni/authentication/verify` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Verify the authenticity of an authentication attempt. Works with Admin Token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `transactionId` | string | | | | `token` | string | | | | `interviewToken` | string | | | | `customerId` | string | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `verified` | boolean | | | | `reason` | integer (int32) | | | | `customerId` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/authentication/verify \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "transactionId": "", "token": "", "interviewToken": "", "customerId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/authentication/verify", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "transactionId": "", "token": "", "interviewToken": "", "customerId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/authentication/verify", headers=headers, json={ "transactionId": "", "token": "", "interviewToken": "", "customerId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/authentication/verify")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"transactionId\": \"\",\n \"token\": \"\",\n \"interviewToken\": \"\",\n \"customerId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "verified": true, "reason": 0, "customerId": "string" } ``` --- - Path: `api-reference/authentications-external-search` - URL: https://developer.incode.com/api-reference/authentications-external-search/ - Markdown: https://developer.incode.com/api-reference/authentications-external-search.md - Endpoint: `POST /omni/authentications/external/search` # Fetch authentication attempts `POST /omni/authentications/external/search` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This API allows for searching through stored authentication records, providing insight into both 1:1 (one to one) and 1:N (one to many) authentication modes. It includes data for successful and failed login attempts, enabling an overview of authentication activity within the organization. Works with Admin Token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `offset` | query | integer (int32) | | | | `limit` | query | integer (int32) | | | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `authenticationAttempts` | array[AuthenticationAttemptExternalDto] | | | | `authenticationAttempts.customerId` | string | | | | `authenticationAttempts.deviceType` | string | | Enum: `IOS`, `ANDROID`, `WEBAPP` | | `authenticationAttempts.deviceName` | string | | | | `authenticationAttempts.version` | string | | | | `authenticationAttempts.isSpoof` | boolean | | | | `authenticationAttempts.get_updatedAt` | integer (int64) | | | | `authenticationAttempts.url` | string | | | | `authenticationAttempts.isAuthenticated` | boolean | | | | `authenticationAttempts.recognitionConfidence` | number (float) | | | | `authenticationAttempts.source` | string | | | | `authenticationAttempts.transactionId` | string | | | | `authenticationAttempts.authenticationType` | string | | Enum: `ONE_TO_ONE`, `ONE_TO_N` | | `authenticationAttempts.authenticationMethod` | string | | Enum: `server`, `local`, `hybrid` | | `authenticationAttempts.faceEnrollmentForced` | boolean | | | | `authenticationAttempts.isBlocklisted` | boolean | | | | `authenticationAttempts.clientRecognitionThreshold` | number (float) | | | | `authenticationAttempts.clientLivenessThreshold` | number (float) | | | | `authenticationAttempts.blocklistConfidence` | number (float) | | | | `authenticationAttempts.videoRecordingUrl` | string | | | | `total` | integer (int32) | | | | `more` | boolean | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/authentications/external/search \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/authentications/external/search", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/authentications/external/search", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/authentications/external/search")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "authenticationAttempts": [ { "customerId": "string", "deviceType": "IOS", "deviceName": "string", "version": "string", "isSpoof": true, "get_updatedAt": 0, "url": "string", "isAuthenticated": true, "recognitionConfidence": 0, "source": "string", "transactionId": "string", "authenticationType": "ONE_TO_ONE", "authenticationMethod": "server", "faceEnrollmentForced": true, "isBlocklisted": true, "clientRecognitionThreshold": 0, "clientLivenessThreshold": 0, "blocklistConfidence": 0, "videoRecordingUrl": "string" } ], "total": 0, "more": true } ``` --- - Path: `api-reference/b2b-onboarding-request-new` - URL: https://developer.incode.com/api-reference/b2b-onboarding-request-new/ - Markdown: https://developer.incode.com/api-reference/b2b-onboarding-request-new.md - Endpoint: `POST /omni/b2b/onboarding/request-new` # Request new onboarding for integrations `POST /omni/b2b/onboarding/request-new` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint starts new onboarding session for integration and generates onboarding link. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `integrationReference` | string | yes | Integration reference for the onboarding request. | | `loginHint` | string | | User login hint. | | `applicantId` | string | | Existing applicant id. | | `externalCustomerId` | string | | Id that identifies user in clients external system. | | `name` | string | | Applicant name. | | `meetingLink` | string | | Meeting link. | | `linkValidityInMinutes` | integer (int32) | | Link validity in minutes. | | `notification` | NotificationDelivery | yes | Notification configuration | | `notification.type` | string | yes | Notification type, can be SMS, EMAIL or URL. Enum: `SMS`, `EMAIL`, `URL` | | `notification.email` | string | | Applicant email. Required for notification type EMAIL. | | `notification.phone` | string | | Applicant phone. Required for notification type SMS. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `url` | string | | Generated onboarding URL. | | `interviewId` | string | | Interview identifier. | ### 400 Custom error statuses: - 4300: Integration not found by id - 4301: Employee by login factor cannot be found Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/b2b/onboarding/request-new \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "integrationReference": "", "loginHint": "", "applicantId": "", "externalCustomerId": "", "name": "", "meetingLink": "", "linkValidityInMinutes": 0, "notification": "", "notification.type": "", "notification.email": "", "notification.phone": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/b2b/onboarding/request-new", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "integrationReference": "", "loginHint": "", "applicantId": "", "externalCustomerId": "", "name": "", "meetingLink": "", "linkValidityInMinutes": 0, "notification": "", "notification.type": "", "notification.email": "", "notification.phone": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/b2b/onboarding/request-new", headers=headers, json={ "integrationReference": "", "loginHint": "", "applicantId": "", "externalCustomerId": "", "name": "", "meetingLink": "", "linkValidityInMinutes": 0, "notification": "", "notification.type": "", "notification.email": "", "notification.phone": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/b2b/onboarding/request-new")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"integrationReference\": \"\",\n \"loginHint\": \"\",\n \"applicantId\": \"\",\n \"externalCustomerId\": \"\",\n \"name\": \"\",\n \"meetingLink\": \"\",\n \"linkValidityInMinutes\": 0,\n \"notification\": \"\",\n \"notification.type\": \"\",\n \"notification.email\": \"\",\n \"notification.phone\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "url": "string", "interviewId": "string" } ``` --- - Path: `api-reference/b2b-v1-authentications-add-selfie-to-identity` - URL: https://developer.incode.com/api-reference/b2b-v1-authentications-add-selfie-to-identity/ - Markdown: https://developer.incode.com/api-reference/b2b-v1-authentications-add-selfie-to-identity.md - Endpoint: `POST /omni/b2b/v1/authentications/add-selfie-to-identity` # Add selfie to identity template `POST /omni/b2b/v1/authentications/add-selfie-to-identity` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Adds the selfie from the specified or latest authentication attempt to the user's identity template set. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `sessionId` | string | | | | `attemptId` | string | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/b2b/v1/authentications/add-selfie-to-identity \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "sessionId": "", "attemptId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/b2b/v1/authentications/add-selfie-to-identity", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "sessionId": "", "attemptId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/b2b/v1/authentications/add-selfie-to-identity", headers=headers, json={ "sessionId": "", "attemptId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/b2b/v1/authentications/add-selfie-to-identity")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"sessionId\": \"\",\n \"attemptId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/b2b-v1-devices-info` - URL: https://developer.incode.com/api-reference/b2b-v1-devices-info/ - Markdown: https://developer.incode.com/api-reference/b2b-v1-devices-info.md - Endpoint: `GET /omni/b2b/v1/devices/info` # Fetch device info list `GET /omni/b2b/v1/devices/info` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch all device information entries associated with the given onboarding Session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | yes | Represents Session id for which device data are requested. | | `api-version` | header | string | yes | | ## Responses ### 200 OK ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/b2b/v1/devices/info \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/b2b/v1/devices/info", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/b2b/v1/devices/info", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/b2b/v1/devices/info")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json [ { "ipAddress": "string", "hash": "string", "deviceType": "IOS", "osVersion": "string", "deviceModel": "string", "sdkVersion": "string", "browser": "string", "hasLiedBrowser": true, "longitude": 0, "latitude": 0, "location": "string", "getmAdminArea": "CA", "getmSubAdminArea": "Santa Clara", "getmLocality": "string", "getmSubLocality": "Mission District", "getmThoroughfare": "string", "getmSubThoroughfare": "string", "getmPostalCode": 95014, "getmCountryCode": "US", "getmCountryName": "United States", "hostingApp": "Onboarding" } ] ``` --- - Path: `api-reference/b2b-v1-identities` - URL: https://developer.incode.com/api-reference/b2b-v1-identities/ - Markdown: https://developer.incode.com/api-reference/b2b-v1-identities.md - Endpoint: `GET /omni/b2b/v1/identities/{id}` # Fetch Identity data `GET /omni/b2b/v1/identities/{id}` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetches data associated with identity, which was gathered in onboarding. Works with Admin Token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | path | string | yes | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `identityId` | string | | | | `originalSessionId` | string | | | | `ocrData` | IdentityOcrData | | | | `ocrData.name` | string | | | | `ocrData.phone` | string | | | | `ocrData.email` | string | | | | `ocrData.dateOfBirth` | string | | | | `ocrData.personalIdNumber` | string | | | | `ocrData.address` | string | | | | `ocrData.nationalNumber` | string | | | | `ocrData.countryCode` | string | | | | `ocrData.documentType` | string | | Enum: `Unknown`, `Passport`, `Visa`, `DriversLicense`, `IdentificationCard`, `Permit`, `Currency`, `ResidenceDocument`, `TravelDocument`, `BirthCertificate`, `VehicleRegistration`, `Other`, `WeaponLicense`, `TribalIdentification`, `VoterIdentification`, `Military`, `TaxIdentification`, `FederalID`, `MedicalCard` | | `ocrData.docExpiryDate` | integer (int32) | | | | `ocrData.displayName` | string | | | | `ocrData.fullNameMrz` | string | | | | `ocrData.gender` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/b2b/v1/identities/{id} \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/b2b/v1/identities/{id}", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/b2b/v1/identities/{id}", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/b2b/v1/identities/{id}")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "identityId": "string", "originalSessionId": "string", "ocrData": { "name": "string", "phone": "string", "email": "string", "dateOfBirth": "string", "personalIdNumber": "string", "address": "string", "nationalNumber": "string", "countryCode": "string", "documentType": "Unknown", "docExpiryDate": 0, "displayName": "string", "fullNameMrz": "string", "gender": "string" } } ``` --- - Path: `api-reference/b2b-v1-sessions-listing` - URL: https://developer.incode.com/api-reference/b2b-v1-sessions-listing/ - Markdown: https://developer.incode.com/api-reference/b2b-v1-sessions-listing.md - Endpoint: `GET /omni/b2b/v1/sessions/listing` # Fetch session listing `GET /omni/b2b/v1/sessions/listing` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch onboarding sessions listing. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `loginHint` | query | string | yes | Login hint to search onboarding sessions by (e.g. email). | | `maxItems` | query | integer (int32) | | Maximum number of items to retrieve (has to be positive). Optional, defaults to 10. | | `api-version` | header | string | yes | | ## Responses ### 200 OK ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/b2b/v1/sessions/listing \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/b2b/v1/sessions/listing", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/b2b/v1/sessions/listing", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/b2b/v1/sessions/listing")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json [ { "sessionId": "string", "updatedAt": 0, "onboardingStatus": "UNKNOWN", "totalScoreStatus": "OK" } ] ``` --- - Path: `api-reference/b2b-v1-watchlist-integrator-batch` - URL: https://developer.incode.com/api-reference/b2b-v1-watchlist-integrator-batch/ - Markdown: https://developer.incode.com/api-reference/b2b-v1-watchlist-integrator-batch.md - Endpoint: `POST /omni/b2b/v1/watchlist/integrator/batch` # Add custom watchlist entries for child organizations `POST /omni/b2b/v1/watchlist/integrator/batch` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Imports custom watchlist entries from a CSV file and assigns each row to the child organization identified by clientId. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `file` | string (binary) | | CSV file with integrator watchlist rows. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/b2b/v1/watchlist/integrator/batch \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "file": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/b2b/v1/watchlist/integrator/batch", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "file": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/b2b/v1/watchlist/integrator/batch", headers=headers, json={ "file": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/b2b/v1/watchlist/integrator/batch")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"file\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/batch-auth-stats` - URL: https://developer.incode.com/api-reference/batch-auth-stats/ - Markdown: https://developer.incode.com/api-reference/batch-auth-stats.md - Endpoint: `POST /omni/batch/auth-stats` # Insert authentications in batch `POST /omni/batch/auth-stats` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Inserts face authentications in batch. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `data` | array[QRScanAttempt] | | | | `data.id` | string | | Identity (customer) id. | | `data.photo` | string | | Base64 of photo. | | `data.confidence` | number (float) | | Match confidence. | | `data.timestamp` | integer (int64) | | Timestamp | | `data.sourceId` | string | | Source identifier of batch of authentications | | `data.deviceId` | string | | User device id | | `data.reasonCodes` | array[string] | | Reason codes | | `data.blocked` | boolean | | Flag indicating if user is on a blocklist | | `data.blocklistConfidence` | number (float) | | Confidence score related to block list | | `data.matchedWatchlistId` | string | | Id of the matched watchlist entry when blocklist validation exceeds the confidence threshold | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/batch/auth-stats \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "data": [], "data.id": "", "data.photo": "", "data.confidence": 0, "data.timestamp": 0, "data.sourceId": "", "data.deviceId": "", "data.reasonCodes": [], "data.blocked": false, "data.blocklistConfidence": 0, "data.matchedWatchlistId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/batch/auth-stats", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "data": [], "data.id": "", "data.photo": "", "data.confidence": 0, "data.timestamp": 0, "data.sourceId": "", "data.deviceId": "", "data.reasonCodes": [], "data.blocked": false, "data.blocklistConfidence": 0, "data.matchedWatchlistId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/batch/auth-stats", headers=headers, json={ "data": [], "data.id": "", "data.photo": "", "data.confidence": 0, "data.timestamp": 0, "data.sourceId": "", "data.deviceId": "", "data.reasonCodes": [], "data.blocked": False, "data.blocklistConfidence": 0, "data.matchedWatchlistId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/batch/auth-stats")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"data\": [],\n \"data.id\": \"\",\n \"data.photo\": \"\",\n \"data.confidence\": 0,\n \"data.timestamp\": 0,\n \"data.sourceId\": \"\",\n \"data.deviceId\": \"\",\n \"data.reasonCodes\": [],\n \"data.blocked\": false,\n \"data.blocklistConfidence\": 0,\n \"data.matchedWatchlistId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/calculate-contract-nom151-signature` - URL: https://developer.incode.com/api-reference/calculate-contract-nom151-signature/ - Markdown: https://developer.incode.com/api-reference/calculate-contract-nom151-signature.md - Endpoint: `POST /omni/calculate-contract-nom151-signature` # Calculate contract Nom151 signature `POST /omni/calculate-contract-nom151-signature` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This api endpoint calculates the Nom151 signature of an already signed contract and returns the signature. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `includeSignedDocumentInResponse` | boolean | | Includes the signed document in base64 in response | | `includeCertificateDetailsInResponse` | boolean | | Includes the signed document with the Nom 151 signature attached in the pdf in the response | | `signedContractId` | string | yes | The id of the already signed contract | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `additionalInformation` | object | | | ```json { "success": true, "sessionStatus": "Alive", "additionalInformation": { "signedDocumentNom151": "nom151 signature", "signedDocumentBase64": "base64 of signed document", "signedDocumentWithNomSignatureBase64": "base64 of signed contract with attached nom151 signature" } } ``` ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/calculate-contract-nom151-signature \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "includeSignedDocumentInResponse": false, "includeCertificateDetailsInResponse": false, "signedContractId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/calculate-contract-nom151-signature", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "includeSignedDocumentInResponse": false, "includeCertificateDetailsInResponse": false, "signedContractId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/calculate-contract-nom151-signature", headers=headers, json={ "includeSignedDocumentInResponse": False, "includeCertificateDetailsInResponse": False, "signedContractId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/calculate-contract-nom151-signature")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"includeSignedDocumentInResponse\": false,\n \"includeCertificateDetailsInResponse\": false,\n \"signedContractId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "additionalInformation": { "signedDocumentNom151": "nom151 signature", "signedDocumentBase64": "base64 of signed document", "signedDocumentWithNomSignatureBase64": "base64 of signed contract with attached nom151 signature" } } ``` --- - Path: `api-reference/chat` - URL: https://developer.incode.com/api-reference/chat/ - Markdown: https://developer.incode.com/api-reference/chat.md - Endpoint: `POST /omni/chat` # Send conference chat `POST /omni/chat` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Store conference chat. The executive should send the whole chat at the end of conference call (just before finish is called). ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewId` | string | | Interview id. | | `chat` | array[ChatDto] | yes | | | `chat.date` | integer (int64) | yes | UTC timestamp. | | `chat.body` | string | yes | Single message in chat. | | `chat.author` | string | | Author of the message. Enum: `user`, `interviewer` | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/chat \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "interviewId": "", "chat": [], "chat.date": 0, "chat.body": "", "chat.author": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/chat", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "interviewId": "", "chat": [], "chat.date": 0, "chat.body": "", "chat.author": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/chat", headers=headers, json={ "interviewId": "", "chat": [], "chat.date": 0, "chat.body": "", "chat.author": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/chat")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"interviewId\": \"\",\n \"chat\": [],\n \"chat.date\": 0,\n \"chat.body\": \"\",\n \"chat.author\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/code-generate` - URL: https://developer.incode.com/api-reference/code-generate/ - Markdown: https://developer.incode.com/api-reference/code-generate.md - Endpoint: `GET /omni/code/generate` # Generate interview code `GET /omni/code/generate` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Generate interview code for this session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 interviewCode: String. 6 characters. Newly generated code to be verified before connecting to video conference. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/code/generate \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/code/generate", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/code/generate", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/code/generate")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/code-verify` - URL: https://developer.incode.com/api-reference/code-verify/ - Markdown: https://developer.incode.com/api-reference/code-verify.md - Endpoint: `POST /omni/code/verify` # Verify interview code `POST /omni/code/verify` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Verify interview code before connecting to video conference. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewCode` | string | | Interview code to be verified against given session. | ## Responses ### 200 Custom error status: - 4014: Invalid interview code Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/code/verify \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "interviewCode": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/code/verify", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "interviewCode": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/code/verify", headers=headers, json={ "interviewCode": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/code/verify")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"interviewCode\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/compare-sms-otp` - URL: https://developer.incode.com/api-reference/compare-sms-otp/ - Markdown: https://developer.incode.com/api-reference/compare-sms-otp.md - Endpoint: `GET /omni/compare/sms-otp` # Compare/Validate OTP code obtained through SMS for onboarding `GET /omni/compare/sms-otp` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Send OTP code obtained through SMS to validate an onboarding. Phone number is obtained from interview data, so phone step it's required. Success will be false if code sent doesn't match. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `code` | query | string | yes | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/compare/sms-otp \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/compare/sms-otp", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/compare/sms-otp", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/compare/sms-otp")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/conference-add-event` - URL: https://developer.incode.com/api-reference/conference-add-event/ - Markdown: https://developer.incode.com/api-reference/conference-add-event.md - Endpoint: `POST /omni/conference/add/event` # Add conference event `POST /omni/conference/add/event` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Send (OpenTok) conference event. Any connection issue caught by webapp could be reported using this call. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `get_version` | integer (int64) | | | | `interviewId` | string | yes | Interview ID for which event is reported. | | `opentokSessionId` | string | yes | Opentok session ID of current video conference. | | `eventType` | string | yes | Opentok event type. Could be anything that Opentok sends, e.g. StreamDisconnected, StreamReconnected, VideoDisabled, VideoEnabled... | | `details` | string | | Any description that Opentok sends. | | `eventSource` | string | yes | Indicate event caught on customer or executive side. Enum: `customer`, `executive` | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/conference/add/event \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "get_version": 0, "interviewId": "", "opentokSessionId": "", "eventType": "", "details": "", "eventSource": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/conference/add/event", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "get_version": 0, "interviewId": "", "opentokSessionId": "", "eventType": "", "details": "", "eventSource": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/conference/add/event", headers=headers, json={ "get_version": 0, "interviewId": "", "opentokSessionId": "", "eventType": "", "details": "", "eventSource": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/conference/add/event")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"get_version\": 0,\n \"interviewId\": \"\",\n \"opentokSessionId\": \"\",\n \"eventType\": \"\",\n \"details\": \"\",\n \"eventSource\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/conference-get-events` - URL: https://developer.incode.com/api-reference/conference-get-events/ - Markdown: https://developer.incode.com/api-reference/conference-get-events.md - Endpoint: `GET /omni/conference/get/events` # Fetch conference events `GET /omni/conference/get/events` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch conference events for given 'interviewId'. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | yes | Interview id. | | `api-version` | header | string | yes | | ## Responses ### 200 OK ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/conference/get/events \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/conference/get/events", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/conference/get/events", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/conference/get/events")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/conference-photo` - URL: https://developer.incode.com/api-reference/conference-photo/ - Markdown: https://developer.incode.com/api-reference/conference-photo.md - Endpoint: `POST /omni/conference/photo` # Store conference photos `POST /omni/conference/photo` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment A bank executive can ask the customer to additionally capture his face or document. These will be stored in DB. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | | Base64 string representation of the image. | | `interviewId` | string | | ID of interview. | | `origin` | string | yes | This parameter indicates which type of photo is taken Enum: `selfie`, `front`, `back`, `poa` | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/conference/photo \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "interviewId": "", "origin": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/conference/photo", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "interviewId": "", "origin": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/conference/photo", headers=headers, json={ "base64Image": "", "interviewId": "", "origin": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/conference/photo")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"interviewId\": \"\",\n \"origin\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/conference-report-issue` - URL: https://developer.incode.com/api-reference/conference-report-issue/ - Markdown: https://developer.incode.com/api-reference/conference-report-issue.md - Endpoint: `POST /omni/conference/report-issue` # Report conference issue `POST /omni/conference/report-issue` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment An executive can report any issue by this call. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewId` | string | yes | Interview ID for which issue is reported. | | `opentokSessionId` | string | yes | Opentok session ID of current video conference. | | `details` | string | yes | Any description that Opentok sends. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/conference/report-issue \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "interviewId": "", "opentokSessionId": "", "details": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/conference/report-issue", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "interviewId": "", "opentokSessionId": "", "details": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/conference/report-issue", headers=headers, json={ "interviewId": "", "opentokSessionId": "", "details": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/conference/report-issue")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"interviewId\": \"\",\n \"opentokSessionId\": \"\",\n \"details\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/credentials-mdl` - URL: https://developer.incode.com/api-reference/credentials-mdl/ - Markdown: https://developer.incode.com/api-reference/credentials-mdl.md - Endpoint: `POST /omni/credentials/mdl` # Issue a device-bound mDL for the current interview `POST /omni/credentials/mdl` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Builds credential claims from the interview identified by the access token and issues a device-bound ISO/IEC 18013-5 mDL bound to the supplied device public key. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `devicePublicKey` | string | | Holder device public key as Base64 (standard) X.509 SubjectPublicKeyInfo DER, EC P-256. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `docType` | string | | mdoc docType, e.g. org.iso.18013.5.1.mDL. | | `issuerSigned` | string | | Base64 (standard) of the CBOR-encoded IssuerSigned (nameSpaces + issuerAuth). | | `expiresAt` | string (date-time) | | When the mDL stops being valid (MSO validityInfo.validUntil). | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/credentials/mdl \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "devicePublicKey": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/credentials/mdl", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "devicePublicKey": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/credentials/mdl", headers=headers, json={ "devicePublicKey": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/credentials/mdl")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"devicePublicKey\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "docType": "string", "issuerSigned": "string", "expiresAt": "string" } ``` --- - Path: `api-reference/cross-doc-data-check-results` - URL: https://developer.incode.com/api-reference/cross-doc-data-check-results/ - Markdown: https://developer.incode.com/api-reference/cross-doc-data-check-results.md - Endpoint: `GET /omni/cross-doc-data-check/results` # Get cross-document comparison results `GET /omni/cross-doc-data-check/results` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch cross-document data check results for a given interview ID. If no ID is provided, it defaults to the user's ID from the JWT. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | | | `api-version` | header | string | yes | | ## Responses ### 200 Response contains a map of results with detailed comparison information. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/cross-doc-data-check/results \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/cross-doc-data-check/results", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/cross-doc-data-check/results", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/cross-doc-data-check/results")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "additionalProp1": [ { "interviewId": "string", "comparisonName": "string", "comparisonId": "string", "result": "OK", "leftValueDetails": { "documentType": "string", "fieldName": "string", "value": {}, "sourceNotFound": true }, "rightValueDetails": { "documentType": "string", "fieldName": "string", "value": {}, "sourceNotFound": true }, "severity": "ultra_low" } ], "additionalProp2": [ { "interviewId": "string", "comparisonName": "string", "comparisonId": "string", "result": "OK", "leftValueDetails": { "documentType": "string", "fieldName": "string", "value": {}, "sourceNotFound": true }, "rightValueDetails": { "documentType": "string", "fieldName": "string", "value": {}, "sourceNotFound": true }, "severity": "ultra_low" } ] } ``` --- - Path: `api-reference/curp-validation-error-codes` - URL: https://developer.incode.com/api-reference/curp-validation-error-codes/ - Markdown: https://developer.incode.com/api-reference/curp-validation-error-codes.md - Endpoint: `POST /omni/add/curp` # CURP Validation Error Codes `POST /omni/add/curp` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add curp and the validation process result to interview. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `curp` | string | | User's curp. Has to be in valid format. If it isn't present, then curp value from interview is used. | ## Responses ### 200 Respuesta con validación de CURP ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ### 500 Internal error during CURP validation. ### 504 The request to validate the CURP exceeded the allowed time limit ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/add/curp \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "curp": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/add/curp", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "curp": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/add/curp", headers=headers, json={ "curp": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/curp")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"curp\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "curp": "XXXX820814HDFABC01", "sex": "MUJER", "nationality": "MEX", "result": "success", "requestData": { "name": "JUANA", "firstLastName": "PEREZ", "secondLastName": "LOPEZ", "gender": "M", "birthDate": "14/08/1982", "state": "DF" }, "transactionId": "transaction1234567890", "renapo_valid": true, "names": "JUANA", "paternal_surname": "PEREZ", "mothers_maiden_name": "LOPEZ", "birthdate": "14/08/1982", "entity_birth": "DF", "probation_document": "1", "probation_document_data": { "foja": "", "numEntidadReg": "09", "libro": "", "NumRegExtranjeros": "", "cveEntidadNac": "DF", "numActa": "00001", "CRIP": "", "tomo": "", "cveEntidadEmisora": "", "anioReg": "1982", "cveMunicipioReg": "001", "FolioCarta": "" }, "status_curp": "RCN", "deceasedStatus": "ALIVE" } ``` --- - Path: `api-reference/delete-interviews` - URL: https://developer.incode.com/api-reference/delete-interviews/ - Markdown: https://developer.incode.com/api-reference/delete-interviews.md - Endpoint: `POST /omni/delete/interviews` # Delete Multiple onboarding sessions with multiple options. `POST /omni/delete/interviews` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment > **Deprecated** — this endpoint is marked deprecated in the Omni API specification. Delete all onboarding sessions by given array of interview ids. The endpoint is executed asynchronously. Note: Requires admin login token reference - /executive/log-in Please, bear in mind that usage of this API endpoint for deletion of Customer Data will mean that Incode will no longer have access to it nor will be able to review or analyze any issue related to deleted Customer Data. After deletion, as Incode will not be able to retrieve the deleted Customer Data, any potential claims related to such data will be waived by Customer. Finally, for clarity purposes, Incode may continue to process information derived from Customer Data that has been deidentified, anonymized, and/or aggregated such that the data is no longer considered Personal Data under applicable Data Protection Laws and in a manner that does not identify individuals or Customer to improve its services and defend its legitimate interests. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewIds` | array[string] | | | | `cleanerConfiguration` | CleanerConfigurationDto | | | | `cleanerConfiguration.deletePiiFieldsOnly` | boolean | | Flag indicating if this is partial delete, where only PII fields should be removed. | | `cleanerConfiguration.piiFieldsToKeep` | array[string] | | | | `cleanerConfiguration.keepEnrolledUser` | boolean | | Flag indicating if user that was previously enrolled from this session should stay enrolled in the system after this session is deleted | | `cleanerConfiguration.keepTemplates` | boolean | | Flag indicating if face templates created during onboarding process, should remain in DB | | `cleanerConfiguration.keepImages` | boolean | | Flag indicating if images captured during onboarding process should remain in the system | | `cleanerConfiguration.keepDeviceFingerprints` | boolean | | Flag indicating if device fingerprint stored during onboarding process should remain in the system | | `cleanerConfiguration.keepEvents` | boolean | | Flag indicating if events stored during onboarding process should remain in the system | | `cleanerConfiguration.keepValidationTests` | boolean | | Flag indicating if validation tests stored during onboarding process should remain in the system | | `cleanerConfiguration.keepVideoArchives` | boolean | | Flag indicating if video archives stored during onboarding process should remain in the system | | `cleanerConfiguration.keepConferenceEvents` | boolean | | Flag indicating if events stored during conference video call should remain in the system | | `cleanerConfiguration.keepChats` | boolean | | Flag indicating if chat stored during conference video call should remain in the system | | `cleanerConfiguration.keepStats` | boolean | | Flag indicating if statistics stored during onboarding process should remain in the system | | `cleanerConfiguration.deletionMode` | string | | Specifies the type of deletion to perform. Enum: `BIOMETRICS`, `PII`, `FULL` | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `taskId` | string | | | | `statusUri` | string | | | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/delete/interviews \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "interviewIds": [], "cleanerConfiguration": "", "cleanerConfiguration.deletePiiFieldsOnly": false, "cleanerConfiguration.piiFieldsToKeep": [], "cleanerConfiguration.keepEnrolledUser": false, "cleanerConfiguration.keepTemplates": false, "cleanerConfiguration.keepImages": false, "cleanerConfiguration.keepDeviceFingerprints": false, "cleanerConfiguration.keepEvents": false, "cleanerConfiguration.keepValidationTests": false, "cleanerConfiguration.keepVideoArchives": false, "cleanerConfiguration.keepConferenceEvents": false, "cleanerConfiguration.keepChats": false, "cleanerConfiguration.keepStats": false, "cleanerConfiguration.deletionMode": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/delete/interviews", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "interviewIds": [], "cleanerConfiguration": "", "cleanerConfiguration.deletePiiFieldsOnly": false, "cleanerConfiguration.piiFieldsToKeep": [], "cleanerConfiguration.keepEnrolledUser": false, "cleanerConfiguration.keepTemplates": false, "cleanerConfiguration.keepImages": false, "cleanerConfiguration.keepDeviceFingerprints": false, "cleanerConfiguration.keepEvents": false, "cleanerConfiguration.keepValidationTests": false, "cleanerConfiguration.keepVideoArchives": false, "cleanerConfiguration.keepConferenceEvents": false, "cleanerConfiguration.keepChats": false, "cleanerConfiguration.keepStats": false, "cleanerConfiguration.deletionMode": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/delete/interviews", headers=headers, json={ "interviewIds": [], "cleanerConfiguration": "", "cleanerConfiguration.deletePiiFieldsOnly": False, "cleanerConfiguration.piiFieldsToKeep": [], "cleanerConfiguration.keepEnrolledUser": False, "cleanerConfiguration.keepTemplates": False, "cleanerConfiguration.keepImages": False, "cleanerConfiguration.keepDeviceFingerprints": False, "cleanerConfiguration.keepEvents": False, "cleanerConfiguration.keepValidationTests": False, "cleanerConfiguration.keepVideoArchives": False, "cleanerConfiguration.keepConferenceEvents": False, "cleanerConfiguration.keepChats": False, "cleanerConfiguration.keepStats": False, "cleanerConfiguration.deletionMode": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/delete/interviews")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"interviewIds\": [],\n \"cleanerConfiguration\": \"\",\n \"cleanerConfiguration.deletePiiFieldsOnly\": false,\n \"cleanerConfiguration.piiFieldsToKeep\": [],\n \"cleanerConfiguration.keepEnrolledUser\": false,\n \"cleanerConfiguration.keepTemplates\": false,\n \"cleanerConfiguration.keepImages\": false,\n \"cleanerConfiguration.keepDeviceFingerprints\": false,\n \"cleanerConfiguration.keepEvents\": false,\n \"cleanerConfiguration.keepValidationTests\": false,\n \"cleanerConfiguration.keepVideoArchives\": false,\n \"cleanerConfiguration.keepConferenceEvents\": false,\n \"cleanerConfiguration.keepChats\": false,\n \"cleanerConfiguration.keepStats\": false,\n \"cleanerConfiguration.deletionMode\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "taskId": "string", "statusUri": "string" } ``` --- - Path: `api-reference/delete-watchlist-single-record` - URL: https://developer.incode.com/api-reference/delete-watchlist-single-record/ - Markdown: https://developer.incode.com/api-reference/delete-watchlist-single-record.md - Endpoint: `POST /omni/delete/watchlist/single-record` # Delete custom watchlist entry `POST /omni/delete/watchlist/single-record` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Works with Admin Token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `id` | string | | Id of entry in watchlist database | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/delete/watchlist/single-record \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "id": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/delete/watchlist/single-record", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "id": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/delete/watchlist/single-record", headers=headers, json={ "id": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/delete/watchlist/single-record")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"id\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/device-stats` - URL: https://developer.incode.com/api-reference/device-stats/ - Markdown: https://developer.incode.com/api-reference/device-stats.md - Endpoint: `POST /omni/device/stats` # Update device stats `POST /omni/device/stats` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Sends information about collected capture frame statistics ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `inspectorOpened` | boolean | | Flag indicating web browser inspector detected | | `frontIdStatsAnalysisStatus` | string | | Status of the front ID capture analysis Enum: `PASS`, `UNCLEAR`, `FAIL` | | `backIdStatsAnalysisStatus` | string | | Status of the back ID capture analysis Enum: `PASS`, `UNCLEAR`, `FAIL` | | `selfieStatsAnalysisStatus` | string | | Status of the selfie ID capture analysis Enum: `PASS`, `UNCLEAR`, `FAIL` | | `motionStatus` | string | | Status of motion analysis Enum: `PASS`, `UNCLEAR`, `FAIL` | | `virtualCameraDetected` | boolean | | Flag indicating virtual camera was detected | | `cameraLabelInspectionStatus` | string | | Status of the camera label inspection Enum: `PASS`, `UNCLEAR`, `FAIL` | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/device/stats \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "inspectorOpened": false, "frontIdStatsAnalysisStatus": "", "backIdStatsAnalysisStatus": "", "selfieStatsAnalysisStatus": "", "motionStatus": "", "virtualCameraDetected": false, "cameraLabelInspectionStatus": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/device/stats", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "inspectorOpened": false, "frontIdStatsAnalysisStatus": "", "backIdStatsAnalysisStatus": "", "selfieStatsAnalysisStatus": "", "motionStatus": "", "virtualCameraDetected": false, "cameraLabelInspectionStatus": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/device/stats", headers=headers, json={ "inspectorOpened": False, "frontIdStatsAnalysisStatus": "", "backIdStatsAnalysisStatus": "", "selfieStatsAnalysisStatus": "", "motionStatus": "", "virtualCameraDetected": False, "cameraLabelInspectionStatus": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/device/stats")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"inspectorOpened\": false,\n \"frontIdStatsAnalysisStatus\": \"\",\n \"backIdStatsAnalysisStatus\": \"\",\n \"selfieStatsAnalysisStatus\": \"\",\n \"motionStatus\": \"\",\n \"virtualCameraDetected\": false,\n \"cameraLabelInspectionStatus\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/es-documents-signed-v2` - URL: https://developer.incode.com/api-reference/es-documents-signed-v2/ - Markdown: https://developer.incode.com/api-reference/es-documents-signed-v2.md - Endpoint: `GET /omni/es/documents/signed/v2` # Get signed documents `GET /omni/es/documents/signed/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used to get signed documents for a session ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | | | | `pageNo` | query | integer (int32) | | | | `pageSize` | query | integer (int32) | | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `documents` | array[ESignedDocumentDto] | | | | `documents.documentRef` | string | | | | `documents.documentUrl` | string | | | | `total` | integer (int32) | | | | `more` | boolean | | | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/es/documents/signed/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/es/documents/signed/v2", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/es/documents/signed/v2", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/es/documents/signed/v2")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "documents": [ { "documentRef": "string", "documentUrl": "string" } ], "total": 0, "more": true } ``` --- - Path: `api-reference/executive-events-find` - URL: https://developer.incode.com/api-reference/executive-events-find/ - Markdown: https://developer.incode.com/api-reference/executive-events-find.md - Endpoint: `POST /omni/executive-events/find` # Fetch audit logs `POST /omni/executive-events/find` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Use this API to retrieve records of activities performed within your organization. These logs include key events such as changes to organization settings, executive actions, updates to flows, workflows and user identities, as well as changes made to organization’s watchlist. Note: Requires admin login token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `avoidCounting` | query | boolean | | | | `pageable` | query | Pageable | yes | | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `codes` | array[string] | | | | `before` | string (date-time) | | | | `after` | string (date-time) | | | | `executiveIds` | array[string] | | | | `entityTypes` | array[string] | | | | `entityIds` | array[string] | | | | `applications` | array[string] | | | | `email` | string | | | | `ipAddress` | string | | | | `userAgent` | string | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `content` | array[ExecutiveEventDto] | | | | `content.id` | string | | | | `content.code` | string | | Enum: `SESSION_DELETED`, `IDENTITY_DELETED`, `SESSION_FACE_ADDED`, `IDENTITY_FACE_ADDED`, `SESSION_MANUALLY_APPROVED`, `SESSION_MANUALLY_REJECTED`, `SESSION_VIEWED`, `SESSIONS_VIEWED`, `SESSION_PDF_DOWNLOADED`, `LOGIN_ATTEMPT`, `LOGOUT`, `USER_CREATED`, `USER_DELETED`, `USER_UPDATED`, `CONFIGURATION_CREATE`, `CONFIGURATION_CLONED`, `CONFIGURATION_RESET`, `CONFIGURATION_UPDATE`, `FLOW_CREATE`, `FLOW_UPDATE`, `FLOW_DELETE`, `FLOW_CLONE`, `IDENTITIES_REPORT_GENERATED`, `SESSIONS_REPORT_GENERATED`, `AUTHENTICATIONS_REPORT_GENERATED`, `WATCH_LISTS_REPORT_GENERATED`, `USERS_REPORT_GENERATED`, `DOUBLE_CHECK_RECORD_FETCHED`, `DOUBLE_CHECK_RECORD_UPDATED`, `DOUBLE_CHECK_FINISHED`, `SESSION_ANTIFRAUD_RESOLVED`, `WATCH_LISTS_ENTRY_CREATED`, `GOVERNMENT_VERIFICATION_PROVIDERS_UPDATED`, `GOVERNMENT_VERIFICATION_PROVIDERS_CREATED`, `GOVERNMENT_VERIFICATION_PROVIDERS_DELETED`, `WATCHLIST_PROVIDER_SETTINGS_CREATED`, `WATCHLIST_PROVIDER_SETTINGS_UPDATED`, `WATCHLIST_PROVIDER_SETTINGS_DELETED`, `PAYMENTS_PROVIDER_SETTINGS_CREATED`, `PAYMENTS_PROVIDER_SETTINGS_UPDATED`, `PAYMENTS_PROVIDER_SETTINGS_DELETED`, `PERSONAL_IDENTIFICATION_NUMBER_PROVIDERS_UPDATED`, `PERSONAL_IDENTIFICATION_NUMBER_PROVIDERS_DELETED`, `PERSONAL_IDENTIFICATION_NUMBER_PROVIDERS_CREATED`, `EKYB_PROVIDERS_UPDATED`, `EKYB_PROVIDERS_CREATED`, `EKYB_PROVIDERS_DELETED`, `EKYC_PROVIDERS_CREATED`, `EKYC_PROVIDERS_UPDATED`, `EKYC_PROVIDERS_DELETED`, `QES_PROVIDERS_UPDATED`, `QES_PROVIDERS_DELETED`, `QES_PROVIDERS_CREATED`, `GENERAL_PROVISIONING_SETTINGS_UPDATED`, `MODULES_PROVISIONING_SETTINGS_UPDATED`, `WORKFLOW_CREATED`, `WORKFLOW_IMPORTED`, `WORKFLOW_EDITED`, `WORKFLOW_UPDATED`, `WORKFLOW_DELETED`, `WORKFLOW_ACTIVATED`, `WORKFLOW_PAUSED`, `CONSENT_CREATED`, `CONSENT_UPDATED`, `CONSENT_DELETED`, `FRAUD_REPORTED`, `FRAUD_REPORT_REVOKED`, `WEBHOOK_CREATED`, `WEBHOOK_UPDATE`, `WEBHOOK_DELETE`, `WEBHOOK_AUTH_CONFIG_CREATE`, `WEBHOOK_AUTH_CONFIG_UPDATE`, `DATA_DELETION_UPDATE`, `WATCHLIST_ENTRY_DELETED`, `WATCHLIST_ENTRY_UPDATED`, `WATCHLIST_LIST_VIEWED`, `AUTHENTICATION_LIST_VIEWED`, `IDENTITY_VIEWED`, `SESSION_LIST_VIEWED`, `IDENTITY_LIST_VIEWED`, `AUDIT_LOG_REPORT_GENERATED`, `SINGLE_SESSION_REPORT_GENERATED`, `DATA_DELETION_DISABLE`, `FACE_ADDED_TO_DATABASE`, `SELFIE_ADDED_TO_IDENTITY_TEMPLATE`, `FRAUD_RING_RENAMED`, `FRAUD_RING_NOTE_ADDED` | | `content.timestamp` | string (date-time) | | | | `content.executiveId` | string | | | | `content.managedEntityType` | string | | Enum: `SESSION`, `IDENTITY`, `EXECUTIVE`, `FLOW`, `CONFIGURATION`, `WORKFLOW`, `WATCHLIST`, `PROVISIONING`, `CONSENT`, `DATA`, `WEBHOOK`, `AUDIT_LOG`, `AUTHENTICATION`, `USER`, `FRAUD_RING` | | `content.managedEntityId` | string | | | | `content.payload` | object | | | | `content.apiKey` | string | | | | `content.role` | string | | Enum: `OPEN`, `STATISTICS`, `LIMITED`, `INCODE_IDENTITY`, `INCODE_ID_USER`, `ACCESS`, `AUTHENTICATOR`, `REFRESH`, `REGISTER`, `INCODE_ID_CLIENT`, `EXECUTIVE`, `ADMIN`, `SCIM_ADMIN`, `MULTI_ORG_ADMIN`, `INTEGRATOR`, `INCODE_EXECUTIVE`, `INCODE_ADMIN`, `WIDGET_CLIENT`, `INTERNAL_SERVICE`, `AUTHORIZATION_SERVER`, `KEYCLOAK_SESSION`, `HIPAA_ADMIN`, `HIPAA_VIEWER`, `WORKFORCE_ADMIN`, `WORKFORCE_HELPDESK_STAFF`, `WORKFORCE_RECRUITER`, `SERVER`, `IDENTITY_SERVICE`, `TRUST_GRAPH_DATA_LOADER` | | `content.application` | string | | Enum: `USER_SERVICE` | | `content.ipAddress` | string | | | | `content.userAgent` | string | | | | `content.email` | string | | | | `page` | Page | | | | `page.size` | integer (int32) | | | | `page.totalElements` | integer (int64) | | | | `page.totalPages` | integer (int64) | | | | `page.currentPageNumber` | integer (int32) | | | | `total` | integer (int64) | | | | `more` | boolean | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/executive-events/find \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "codes": [], "before": "", "after": "", "executiveIds": [], "entityTypes": [], "entityIds": [], "applications": [], "email": "", "ipAddress": "", "userAgent": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/executive-events/find", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "codes": [], "before": "", "after": "", "executiveIds": [], "entityTypes": [], "entityIds": [], "applications": [], "email": "", "ipAddress": "", "userAgent": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/executive-events/find", headers=headers, json={ "codes": [], "before": "", "after": "", "executiveIds": [], "entityTypes": [], "entityIds": [], "applications": [], "email": "", "ipAddress": "", "userAgent": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/executive-events/find")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"codes\": [],\n \"before\": \"\",\n \"after\": \"\",\n \"executiveIds\": [],\n \"entityTypes\": [],\n \"entityIds\": [],\n \"applications\": [],\n \"email\": \"\",\n \"ipAddress\": \"\",\n \"userAgent\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "content": [ { "id": "string", "code": "SESSION_DELETED", "timestamp": "string", "executiveId": "string", "managedEntityType": "SESSION", "managedEntityId": "string", "payload": {}, "apiKey": "string", "role": "OPEN", "application": "USER_SERVICE", "ipAddress": "string", "userAgent": "string", "email": "string" } ], "page": { "size": 0, "totalElements": 0, "totalPages": 0, "currentPageNumber": 0 }, "total": 0, "more": true } ``` --- - Path: `api-reference/executive-log-in` - URL: https://developer.incode.com/api-reference/executive-log-in/ - Markdown: https://developer.incode.com/api-reference/executive-log-in.md - Endpoint: `POST /executive/log-in` # Login admin token `POST /executive/log-in` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Logs in an user and provides a token with high-privileges ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `email` | string | yes | | | `password` | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `token` | string | | Access token for next calls | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/executive/log-in \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "email": "", "password": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/executive/log-in", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "email": "", "password": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/executive/log-in", headers=headers, json={ "email": "", "password": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/executive/log-in")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"email\": \"\",\n \"password\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "token": "eyJhbGciOasfasiJ9.eyJleHRl2OTg5NX0.zdbAC-kE-I71" } ``` --- - Path: `api-reference/expire-interviews` - URL: https://developer.incode.com/api-reference/expire-interviews/ - Markdown: https://developer.incode.com/api-reference/expire-interviews.md - Endpoint: `POST /omni/expire/interviews` # Expire onboarding sessions by interviewIds. `POST /omni/expire/interviews` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Expire onboarding sessions given by interviewIds array, and cleanerConfiguration parameter. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewIds` | array[string] | | | | `cleanerConfiguration` | ExpireInterviewConfigurationDto | | Configuration for expiring interview | | `cleanerConfiguration.expirationConditions` | array[string] | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/expire/interviews \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "interviewIds": [], "cleanerConfiguration": "", "cleanerConfiguration.expirationConditions": [] }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/expire/interviews", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "interviewIds": [], "cleanerConfiguration": "", "cleanerConfiguration.expirationConditions": [] }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/expire/interviews", headers=headers, json={ "interviewIds": [], "cleanerConfiguration": "", "cleanerConfiguration.expirationConditions": [] }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/expire/interviews")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"interviewIds\": [],\n \"cleanerConfiguration\": \"\",\n \"cleanerConfiguration.expirationConditions\": []\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/external-send-sms` - URL: https://developer.incode.com/api-reference/external-send-sms/ - Markdown: https://developer.incode.com/api-reference/external-send-sms.md - Endpoint: `POST /omni/external/send-sms` # Send SMS with the link for onboarding `POST /omni/external/send-sms` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Used by Admins or Executives to send SMS containing generated onboarding link. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | yes | Id of onboarding session for which link is being generated. | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `smsText` | string | | Text to be shown with URL. Needs to have {0} placeholder inside for URL. | | `clientId` | string | yes | | | `shortUrl` | boolean | | Indicates whether the link should be shortened. If set to true, the link will be converted to a shortened version. | | `queryParams` | SendSmsExternalUrlParams | | Additional onboarding url query params allowed: lang | | `queryParams.lang` | string | | | | `uuid` | string | | Optional UUID to be reused for linking the onboarding session. If not provided or invalid, a new one will be generated. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Custom error status: - 4004: Could not find user Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/external/send-sms \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "smsText": "", "clientId": "", "shortUrl": false, "queryParams": "", "queryParams.lang": "", "uuid": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/external/send-sms", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "smsText": "", "clientId": "", "shortUrl": false, "queryParams": "", "queryParams.lang": "", "uuid": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/external/send-sms", headers=headers, json={ "smsText": "", "clientId": "", "shortUrl": False, "queryParams": "", "queryParams.lang": "", "uuid": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/external/send-sms")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"smsText\": \"\",\n \"clientId\": \"\",\n \"shortUrl\": false,\n \"queryParams\": \"\",\n \"queryParams.lang\": \"\",\n \"uuid\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/externalverification-ekyb` - URL: https://developer.incode.com/api-reference/externalverification-ekyb/ - Markdown: https://developer.incode.com/api-reference/externalverification-ekyb.md - Endpoint: `POST /omni/externalVerification/ekyb` # eKYB `POST /omni/externalVerification/ekyb` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint performs an eKYB check for the business specified ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `plugins` | array[string] | | | | `businessName` | string | | Name of the business | | `addressLine1` | string | | Address line 1 of the business | | `street` | string | | Street name of the business address | | `houseNo` | string | | The exterior number of the business address | | `addressLine2` | string | | Address line 2 of the business | | `city` | string | | City of the business address. | | `state` | string | | State of the business address. | | `postalCode` | string | | Postal code of the business address. | | `country` | string | | Two-letter country code of the business address | | `taxId` | string | | The tax id of the business | | `uboName` | string | | Ultimate Beneficial Owner name. Deprecated — use uboNames instead. | | `uboNames` | array[string] | | Ultimate Beneficial Owners names | | `directors` | array[string] | | Names of the directors of the business | ## Responses ### 200 Status codes for business name: - status: Success, sub_label: Verified, label: Match identified to the submitted Business Name - status: Warning, sub_label: Similar Match, label: Similar match identified to the submitted Business Name - status: Failure, sub_label: Unverified, label: Unable to identify a match to the submitted Business Name - status: Failure, sub_label: Alternate Name, label: We believe the submitted TIN is associated with "name" Status codes for address verification: - status: Success, sub_label: Verified, label: Match identified to the submitted Business Name - status: Warning, sub_label: Similar Match, label: Similar match identified to the submitted Business Name - status: Failure, sub_label: Unverified, label: Unable to identify a match to the submitted Business Name - status: Failure, sub_label: Alternate Name, label: We believe the submitted TIN is associated with "name" Status codes for address property type: - status: Success, sub_label: Commercial, label: Submitted Office Address is a Commercial property - status: Warning, sub_label: Residential, label: Submitted Office Address is a Residential property Status codes for address deliverability: - status: Success, sub_label: Deliverable, label: The USPS is able to deliver mail to the submitted Office Address - status: Failure, sub_label: Undeliverable, label: The USPS is unable to deliver mail to the submitted Office Address Example: ``` { "kyb": [ { "key": "name", "status": "success", "sub_label": "Verified", "message": "Match identified to the submitted Business Name" }, { "key": "address_verification", "status": "success", "sub_label": "Verified", "message": "Match identified to the submitted Office Address" }, { "key": "address_deliverability", "status": "success", "sub_label": "Deliverable", "message": "The USPS is able to deliver mail to the submitted Office Address" }, { "key": "address_property_type", "status": "success", "sub_label": "Commercial", "message": "Submitted Office Address is a Commercial property" } ] } ``` Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `kyb` | array[EkybVerification] | | | | `kyb.key` | string | | The name of test | | `kyb.status` | string | | Whether the test ows passed. | | `kyb.sub_label` | string | | Additional info on the status. | | `kyb.message` | string | | Human readable description of the status. | | `kyb.reasonCodes` | array[string] | | Machine-readable qualifiers for this check. The "tin" entry carries "Tax ID was not found." when the vendor returned no company for the supplied identifier; otherwise it carries exactly one of REGNO or VATNO, naming the identifier class the lookup resolved through. The "ubo_name_match" entry carries NO_SHAREHOLDER_DATA, and "directors_name_match" carries NO_DIRECTOR_DATA, when the provider returned no usable records to compare against; on those two keys the field is absent when a comparison actually ran. An "Unverified" sub_label accompanied by a no-data code means the check could not be performed, rather than that it was performed and failed. New codes may be added over time, so treat unrecognised values as informational. | | `kybSource` | EkybSourceInfo | | | | `kybSource.uboNames` | array[UboName] | | | | `kybSource.uboNames.id` | string | | | | `kybSource.uboNames.uboName` | string | | | | `businessClassification` | array[EkybVerification] | | | | `businessClassification.key` | string | | The name of test | | `businessClassification.status` | string | | Whether the test ows passed. | | `businessClassification.sub_label` | string | | Additional info on the status. | | `businessClassification.message` | string | | Human readable description of the status. | | `businessClassification.reasonCodes` | array[string] | | Machine-readable qualifiers for this check. The "tin" entry carries "Tax ID was not found." when the vendor returned no company for the supplied identifier; otherwise it carries exactly one of REGNO or VATNO, naming the identifier class the lookup resolved through. The "ubo_name_match" entry carries NO_SHAREHOLDER_DATA, and "directors_name_match" carries NO_DIRECTOR_DATA, when the provider returned no usable records to compare against; on those two keys the field is absent when a comparison actually ran. An "Unverified" sub_label accompanied by a no-data code means the check could not be performed, rather than that it was performed and failed. New codes may be added over time, so treat unrecognised values as informational. | | `status` | string | | Only present on a 202 async dispatch: PENDING until the verification finishes and the result is delivered via the EKYB_VERIFICATION_RESULT webhook. Enum: `PENDING`, `COMPLETED`, `FAILED` | | `referenceId` | string | | Only present on a 202 async dispatch: id correlating the webhook notification and the result-poll endpoint with this request. | ### 202 Async verification is enabled for the organization; the request is processed in the background and the result is delivered via the EKYB_VERIFICATION_RESULT webhook. Body carries only referenceId and status=PENDING. Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `kyb` | array[EkybVerification] | | | | `kyb.key` | string | | The name of test | | `kyb.status` | string | | Whether the test ows passed. | | `kyb.sub_label` | string | | Additional info on the status. | | `kyb.message` | string | | Human readable description of the status. | | `kyb.reasonCodes` | array[string] | | Machine-readable qualifiers for this check. The "tin" entry carries "Tax ID was not found." when the vendor returned no company for the supplied identifier; otherwise it carries exactly one of REGNO or VATNO, naming the identifier class the lookup resolved through. The "ubo_name_match" entry carries NO_SHAREHOLDER_DATA, and "directors_name_match" carries NO_DIRECTOR_DATA, when the provider returned no usable records to compare against; on those two keys the field is absent when a comparison actually ran. An "Unverified" sub_label accompanied by a no-data code means the check could not be performed, rather than that it was performed and failed. New codes may be added over time, so treat unrecognised values as informational. | | `kybSource` | EkybSourceInfo | | | | `kybSource.uboNames` | array[UboName] | | | | `kybSource.uboNames.id` | string | | | | `kybSource.uboNames.uboName` | string | | | | `businessClassification` | array[EkybVerification] | | | | `businessClassification.key` | string | | The name of test | | `businessClassification.status` | string | | Whether the test ows passed. | | `businessClassification.sub_label` | string | | Additional info on the status. | | `businessClassification.message` | string | | Human readable description of the status. | | `businessClassification.reasonCodes` | array[string] | | Machine-readable qualifiers for this check. The "tin" entry carries "Tax ID was not found." when the vendor returned no company for the supplied identifier; otherwise it carries exactly one of REGNO or VATNO, naming the identifier class the lookup resolved through. The "ubo_name_match" entry carries NO_SHAREHOLDER_DATA, and "directors_name_match" carries NO_DIRECTOR_DATA, when the provider returned no usable records to compare against; on those two keys the field is absent when a comparison actually ran. An "Unverified" sub_label accompanied by a no-data code means the check could not be performed, rather than that it was performed and failed. New codes may be added over time, so treat unrecognised values as informational. | | `status` | string | | Only present on a 202 async dispatch: PENDING until the verification finishes and the result is delivered via the EKYB_VERIFICATION_RESULT webhook. Enum: `PENDING`, `COMPLETED`, `FAILED` | | `referenceId` | string | | Only present on a 202 async dispatch: id correlating the webhook notification and the result-poll endpoint with this request. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/externalVerification/ekyb \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "plugins": [], "businessName": "", "addressLine1": "", "street": "", "houseNo": "", "addressLine2": "", "city": "", "state": "", "postalCode": "", "country": "", "taxId": "", "uboName": "", "uboNames": [], "directors": [] }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/externalVerification/ekyb", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "plugins": [], "businessName": "", "addressLine1": "", "street": "", "houseNo": "", "addressLine2": "", "city": "", "state": "", "postalCode": "", "country": "", "taxId": "", "uboName": "", "uboNames": [], "directors": [] }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/externalVerification/ekyb", headers=headers, json={ "plugins": [], "businessName": "", "addressLine1": "", "street": "", "houseNo": "", "addressLine2": "", "city": "", "state": "", "postalCode": "", "country": "", "taxId": "", "uboName": "", "uboNames": [], "directors": [] }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/externalVerification/ekyb")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"plugins\": [],\n \"businessName\": \"\",\n \"addressLine1\": \"\",\n \"street\": \"\",\n \"houseNo\": \"\",\n \"addressLine2\": \"\",\n \"city\": \"\",\n \"state\": \"\",\n \"postalCode\": \"\",\n \"country\": \"\",\n \"taxId\": \"\",\n \"uboName\": \"\",\n \"uboNames\": [],\n \"directors\": []\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "kyb": [ { "key": "string", "status": "string", "sub_label": "string", "message": "string", "reasonCodes": [ "NO_SHAREHOLDER_DATA" ] } ], "kybSource": { "uboNames": [ { "id": "string", "uboName": "string" } ] }, "businessClassification": [ { "key": "string", "status": "string", "sub_label": "string", "message": "string", "reasonCodes": [ "NO_SHAREHOLDER_DATA" ] } ], "status": "PENDING", "referenceId": "string" } ``` --- - Path: `api-reference/externalverification-ekyb-session` - URL: https://developer.incode.com/api-reference/externalverification-ekyb-session/ - Markdown: https://developer.incode.com/api-reference/externalverification-ekyb-session.md - Endpoint: `GET /omni/externalVerification/ekyb/session` # Get eKYB session data for the current session `GET /omni/externalVerification/ekyb/session` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns stored eKYB verification request/response data for the interview associated with the caller's session token. Intended for downstream onboarding steps (e.g. the business watchlist screen) to reuse data the user already entered on the eKYB form, such as `businessName`, `country` and `taxId`, without requiring an executive token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `requestData` | BusinessVerificationRequestData | | | | `requestData.plugins` | array[string] | | | | `requestData.businessName` | string | | | | `requestData.address` | string | | | | `requestData.addressLine1` | string | | | | `requestData.street` | string | | | | `requestData.houseNo` | string | | | | `requestData.addressLine2` | string | | | | `requestData.city` | string | | | | `requestData.state` | string | | | | `requestData.postalCode` | string | | | | `requestData.country` | string | | Enum: `US`, `BR`, `CA`, `CN`, `UK`, `GB`, `DE`, `FR`, `RO`, `ES`, `IT`, `IL`, `AR`, `IE`, `JP`, `SE`, `NO`, `VN`, `NL`, `NG`, `KE`, `CM`, `HK`, `IN`, `MX`, `DK`, `BG`, `MT`, `LT`, `KM`, `TR`, `EG`, `AE`, `SA`, `AU` | | `requestData.taxId` | string | | | | `requestData.uboNames` | array[string] | | | | `requestData.directors` | array[string] | | | | `verificationResult` | BusinessVerificationResultData | | | | `verificationResult.businessName` | string | | | | `verificationResult.businessClassification` | string | | | | `verificationResult.addressVerification` | string | | | | `verificationResult.cityVerification` | string | | | | `verificationResult.postalCodeVerification` | string | | | | `verificationResult.addressPropertyType` | string | | | | `verificationResult.addressDeliverability` | string | | | | `verificationResult.tinVerification` | string | | | | `verificationResult.uboNameMatch` | string | | | | `verificationResult.registrationStatus` | string | | Enum: `Active`, `Inactive`, `Unknown` | | `verificationResult.entityType` | EntityTypeData | | | | `verificationResult.entityType.entityType` | string | | | | `verificationResult.uboNameVerificationResults` | array[UboNameVerificationResultData] | | | | `verificationResult.uboNameVerificationResults.name` | string | | | | `verificationResult.uboNameVerificationResults.uboNameMatch` | string | | | | `verificationResult.uboNameVerificationResults.matchId` | string | | | | `verificationResult.uboNameVerificationResults.ownershipPercentage` | string | | | | `verificationResult.directorsVerificationResults` | array[UboNameVerificationResultData] | | | | `verificationResult.directorsVerificationResults.name` | string | | | | `verificationResult.directorsVerificationResults.uboNameMatch` | string | | | | `verificationResult.directorsVerificationResults.matchId` | string | | | | `verificationResult.directorsVerificationResults.ownershipPercentage` | string | | | | `verificationResult.people` | array[PeopleData] | | | | `verificationResult.people.name` | string | | | | `verificationResult.people.titles` | array[TitleData] | | | | `verificationResult.people.titles.title` | string | | | | `verificationResult.people.memberType` | string | | | | `verificationResult.verificationMessages` | VerificationMessages | | | | `verificationResult.verificationMessages.tinVerificationMessage` | string | | | | `externalVerificationThirdPartyRequest` | object | | | | `externalVerificationThirdPartyResponse` | object | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/externalVerification/ekyb/session \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/externalVerification/ekyb/session", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/externalVerification/ekyb/session", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/externalVerification/ekyb/session")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "requestData": { "plugins": [ "string" ], "businessName": "string", "address": "string", "addressLine1": "string", "street": "string", "houseNo": "string", "addressLine2": "string", "city": "string", "state": "string", "postalCode": "string", "country": "US", "taxId": "string", "uboNames": [ "string" ], "directors": [ "string" ] }, "verificationResult": { "businessName": "string", "businessClassification": "string", "addressVerification": "string", "cityVerification": "string", "postalCodeVerification": "string", "addressPropertyType": "string", "addressDeliverability": "string", "tinVerification": "string", "uboNameMatch": "string", "registrationStatus": "Active", "entityType": { "entityType": "string" }, "uboNameVerificationResults": [ { "name": "string", "uboNameMatch": "string", "matchId": "string", "ownershipPercentage": "string" } ], "directorsVerificationResults": [ { "name": "string", "uboNameMatch": "string", "matchId": "string", "ownershipPercentage": "string" } ], "people": [ { "name": "string", "titles": [ { "title": "string" } ], "memberType": "string" } ], "verificationMessages": { "tinVerificationMessage": "string" } }, "externalVerificationThirdPartyRequest": {}, "externalVerificationThirdPartyResponse": {} } ``` --- - Path: `api-reference/externalverification-ekyc` - URL: https://developer.incode.com/api-reference/externalverification-ekyc/ - Markdown: https://developer.incode.com/api-reference/externalverification-ekyc.md - Endpoint: `POST /omni/externalVerification/ekyc` # External Verification (eKYC) `POST /omni/externalVerification/ekyc` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint verifies phone, email, address, date of birth and tax numbers, specifically social security number (ssn). When making a request use "kyc" in the plugins array. To have the API return specific risk scores for phone, email, ssn (taxId) and address, see examples below. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `plugins` | array[string] | | | | `firstName` | string | | The following special characters are not supported: `^±!@£$%&*_+¡€#¢§¶•ªº«<>?\\/:;\|=` | | `surName` | string | | The following special characters are not supported: `^±!@£$%&*_+¡€#¢§¶•ªº«<>?\\/:;\|=` | | `middleName` | string | | The following special characters are not supported: `^±!@£$%&*_+¡€#¢§¶•ªº«<>?\\/:;\|=` | | `maternalSurname` | string | | The following special characters are not supported: `^±!@£$%&*_+¡€#¢§¶•ªº«<>?\\/:;\|=` | | `email` | string | | | | `street` | string | | | | `streetNo` | string | | | | `floor` | string | | | | `apartment` | string | | | | `postalCode` | string | | | | `countryCode` | string | | ISO 3166-1 alpha-2 format | | `phone` | string | | Use E.164 format. Hyphens are optional | | `state` | string | | | | `city` | string | | | | `idNumber` | string | | | | `idNumber1` | string | | | | `gender` | string | | | | `taxId` | string | | | | `dateOfBirth` | string (YYYY-MM-DD) | | | | `dlExpireAt` | string (YYYY-MM-DD) | | | | `fullName` | string | | | | `panNumber` | string | | Indian Permanent Account Number (PAN), format: AAAAANNNNA | | `district` | string | | District or Barangay (neighbourhood), used for Philippines KYC | | `idType` | string | | National ID type. Supported for Philippines KYC: SSS, TIN, GSIS | | `issueDate` | string (YYYY-MM-DD) | | ID document issue date. Required for Colombia Civil Register (CO_CIVIL_REGISTER_1) KYC | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `kyc` | array[EkycVerification] | | | | `kyc.key` | string | | Indicates a type of risk, such as addressRiskLevel. The overallLevel key name is an aggregate risk score for all risk types. It can be used to obtain a single risk score for a whole result set. | | `kyc.status` | string | | Explains the risk level, ie "low", "medium", or "high". When doing a social security number check, the API will return status values of nomatch, fuzzy or exact. Fuzzy means there is plausible match between the name and the social security number, like Dave and David both resolve to the same SSN. | | `kyc.sub_label` | string | | Additional info on the status. | | `kyc.message` | string | | | | `kyc.reasonCodes` | array[string] | | | | `income` | array[EkycVerification] | | | | `income.key` | string | | Indicates a type of risk, such as addressRiskLevel. The overallLevel key name is an aggregate risk score for all risk types. It can be used to obtain a single risk score for a whole result set. | | `income.status` | string | | Explains the risk level, ie "low", "medium", or "high". When doing a social security number check, the API will return status values of nomatch, fuzzy or exact. Fuzzy means there is plausible match between the name and the social security number, like Dave and David both resolve to the same SSN. | | `income.sub_label` | string | | Additional info on the status. | | `income.message` | string | | | | `income.reasonCodes` | array[string] | | | | `additionalVerificationInfo` | AdditionalVerificationInfo | | | | `additionalVerificationInfo.creditFileDetails` | CreditFileDetails | | | | `additionalVerificationInfo.creditFileDetails.creditFileNumber` | string | | | | `additionalVerificationInfo.creditFileDetails.creditFileCreationDate` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/externalVerification/ekyc \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "plugins": [], "firstName": "", "surName": "", "middleName": "", "maternalSurname": "", "email": "", "street": "", "streetNo": "", "floor": "", "apartment": "", "postalCode": "", "countryCode": "", "phone": "", "state": "", "city": "", "idNumber": "", "idNumber1": "", "gender": "", "taxId": "", "dateOfBirth": "", "dlExpireAt": "", "fullName": "", "panNumber": "", "district": "", "idType": "", "issueDate": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/externalVerification/ekyc", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "plugins": [], "firstName": "", "surName": "", "middleName": "", "maternalSurname": "", "email": "", "street": "", "streetNo": "", "floor": "", "apartment": "", "postalCode": "", "countryCode": "", "phone": "", "state": "", "city": "", "idNumber": "", "idNumber1": "", "gender": "", "taxId": "", "dateOfBirth": "", "dlExpireAt": "", "fullName": "", "panNumber": "", "district": "", "idType": "", "issueDate": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/externalVerification/ekyc", headers=headers, json={ "plugins": [], "firstName": "", "surName": "", "middleName": "", "maternalSurname": "", "email": "", "street": "", "streetNo": "", "floor": "", "apartment": "", "postalCode": "", "countryCode": "", "phone": "", "state": "", "city": "", "idNumber": "", "idNumber1": "", "gender": "", "taxId": "", "dateOfBirth": "", "dlExpireAt": "", "fullName": "", "panNumber": "", "district": "", "idType": "", "issueDate": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/externalVerification/ekyc")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"plugins\": [],\n \"firstName\": \"\",\n \"surName\": \"\",\n \"middleName\": \"\",\n \"maternalSurname\": \"\",\n \"email\": \"\",\n \"street\": \"\",\n \"streetNo\": \"\",\n \"floor\": \"\",\n \"apartment\": \"\",\n \"postalCode\": \"\",\n \"countryCode\": \"\",\n \"phone\": \"\",\n \"state\": \"\",\n \"city\": \"\",\n \"idNumber\": \"\",\n \"idNumber1\": \"\",\n \"gender\": \"\",\n \"taxId\": \"\",\n \"dateOfBirth\": \"\",\n \"dlExpireAt\": \"\",\n \"fullName\": \"\",\n \"panNumber\": \"\",\n \"district\": \"\",\n \"idType\": \"\",\n \"issueDate\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "kyc": [ { "key": "string", "status": "string", "sub_label": "string", "message": "string", "reasonCodes": [ "string" ] } ], "income": [ { "key": "string", "status": "string", "sub_label": "string", "message": "string", "reasonCodes": [ "string" ] } ], "additionalVerificationInfo": { "creditFileDetails": { "creditFileNumber": "string", "creditFileCreationDate": "string" } } } ``` --- - Path: `api-reference/externalverification-ekyc-session` - URL: https://developer.incode.com/api-reference/externalverification-ekyc-session/ - Markdown: https://developer.incode.com/api-reference/externalverification-ekyc-session.md - Endpoint: `GET /omni/externalVerification/ekyc/session` # Get eKYC session data for the current session `GET /omni/externalVerification/ekyc/session` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns stored eKYC verification request/response data for the interview associated with the caller's session token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `userData` | ExternalVerificationRequest | | | | `userData.plugins` | array[string] | | | | `userData.source` | string | | Enum: `US_DRIVERS_LICENSE_1`, `US_TELCO_1`, `US_TELCO_2`, `US_TELCO_4`, `US_TELCO_5`, `US_CREDIT_BUREAU_1`, `US_CREDIT_BUREAU_3`, `US_ADDRESS_1`, `US_CONSUMER_1`, `MX_CONSUMER_1`, `MX_CONSUMER_2`, `BR_GOVT_1`, `BR_CPF_1`, `CA_RES_CREDIT`, `CA_CREDIT_FINTRAC`, `UK_CREDIT_BUREAU_1`, `UK_VOTER_REGISTER`, `ES_PHONE_REGISTER_2`, `CL_1`, `AR_1`, `AR_RES_REGISTER`, `AR_CREDIT_BUR_1`, `GR_1`, `GT_1`, `CR_1`, `CO_1`, `PHONE_RISK_1`, `PHONE_RISK_2`, `EMAIL_RISK_1`, `RISK_ADDONS_ONLY`, `GH_CARD_VERIFY_1`, `PE_MIGRATION_INSTITUTE`, `KE_IDENTIFYAFRICA`, `INDIA_PAN`, `IN_DMV`, `NG_MONO_BVN`, `NG_MONO_NIN`, `US_CREDIT_TELCO`, `PH_RES_CREDIT`, `VE_CIVIL_REGISTER`, `CO_CIVIL_REGISTER_1`, `MX_CIVIL_REGISTER_2` | | `userData.fullName` | string | | | | `userData.firstName` | string | | | | `userData.middleName` | string | | | | `userData.surName` | string | | | | `userData.email` | string | | | | `userData.street` | string | | | | `userData.houseNo` | string | | | | `userData.postalCode` | string | | | | `userData.countryCode` | string | | | | `userData.phone` | string | | | | `userData.state` | string | | | | `userData.city` | string | | | | `userData.ssn` | string | | | | `userData.dateOfBirth` | string | | | | `userData.ipAddress` | string | | | | `userData.taxIdStatus` | string | | | | `userData.nationality` | string | | | | `userData.dlNumber` | string | | | | `userData.dlExpireAt` | string | | | | `userData.dlState` | string | | | | `userData.last4SSN` | string | | | | `userData.idNumber` | string | | | | `userData.panNumber` | string | | | | `riskData` | PremiumExternalVerification | | | | `riskData.level` | string | | | | `riskData.verifications` | object | | | | `riskData.income` | Income | | | | `riskData.income.status` | string | | | | `riskData.income.range` | string | | | | `riskData.employment` | Employment | | | | `riskData.employment.status` | string | | | | `riskData.employment.type` | string | | | | `riskData.employment.sector` | string | | | | `riskData.reasonCodes` | array[VerificationReasonCodes] | | | | `riskData.reasonCodes.key` | string | | | | `riskData.reasonCodes.reasonCodes` | array[ReasonCode] | | | | `riskData.reasonCodes.reasonCodes.reasonCode` | string | | Enum: `A40SS`, `A70SS`, `A4070SS`, `AASE`, `ACV`, `ADC`, `ADCMS`, `ADCUD`, `AFAEI`, `AFM`, `AFMNCC`, `AFMSCC`, `AHNI`, `AHR`, `AIA`, `AII`, `AIR`, `AMCC`, `AMI`, `AMICC`, `AMICCMM`, `AMICCSE`, `ANA`, `AND`, `ANF`, `APA`, `APAI`, `APCC`, `APNV`, `ARNF`, `ASC`, `ASCV`, `ASDL`, `ASU`, `AUICCM`, `AWS`, `EA1Y`, `EA2Y`, `EA4M`, `EA4Y`, `EA6M`, `EAC1F`, `EACMF`, `EADP`, `EAF1`, `EAF2`, `EAF3`, `EAF4Y`, `EAFC`, `EAG1`, `EAG2`, `EAG3`, `EAG4`, `EAG5`, `EAG6`, `EAHF`, `EALLI`, `EALSM`, `EALTW`, `EAM`, `EAMC`, `EAMF`, `EAMI`, `EAMP`, `EANA`, `EANE`, `EANI`, `EANP`, `EAPF`, `EAQ3`, `EAQ4`, `EAQM`, `EASI`, `EAVQ`, `EAW`, `EAY`, `ED4M`, `EDCH`, `EDCO`, `EDDN`, `EDHA`, `EDHC`, `EDHI`, `EDHN`, `EDI`, `EDL`, `EDLC`, `EDM`, `EDNP`, `EDPR`, `EDVH`, `EDVHC`, `EDVHI`, `EE24`, `EE90`, `EEPEII`, `EMA24`, `EMA90`, `ESG24`, `ESG90`, `EVS24`, `EVS90`, `P2OSOV`, `P3OSOV`, `P4OSOV`, `P5OSOV`, `PA2M`, `PA3M`, `PA15`, `PA24`, `PABA`, `PABM`, `PACF`, `PADU`, `PAE`, `PAHR`, `PAIN`, `PALT`, `PAM`, `PAMA`, `PAML`, `PANN`, `PANV`, `PAPM`, `PAPO`, `PAUD`, `PAV`, `PAVN`, `PAW`, `PBL`, `PBOT`, `PCC`, `PDI`, `PDL`, `PDLA`, `PE24`, `PE90`, `PECD`, `PELT`, `PES90`, `PES`, `PFIS`, `PFN`, `PFOI`, `PFOS`, `PFRD`, `PH90`, `PHAI`, `PHAO`, `PHLT`, `PHRL`, `PHSLT`, `PILE`, `PINV`, `PLEA`, `PLLT`, `PLS`, `PLST`, `PMA24`, `PMA90`, `PMAE`, `PMAIC`, `PMAOC`, `PMAOP`, `PMAOT`, `PML`, `PMNA`, `PMO`, `PMS`, `PMST`, `PMU`, `PMVS`, `PN3M`, `PNC`, `PNMB`, `PNN`, `PNNS`, `PNO`, `PNPB`, `PNRR`, `PNS`, `PNU`, `POD`, `PPC3`, `PPC5`, `PPC6`, `PPC9`, `PPGR`, `PPN`, `PPPH`, `PPRT`, `PPV`, `PRC`, `PRCO`, `PRM`, `PROM`, `PRP`, `PRSA`, `PRSK`, `PRSV`, `PSCD`, `PSDBM`, `PSFE`, `PSG24`, `PSG90`, `PSHRSN`, `PSM90`, `PSMDB`, `PSMRN`, `PSMSN`, `PSTF`, `PTFN`, `PTL`, `PTO`, `PVLA`, `PVLS`, `PVMN`, `PVOIP`, `PVRC`, `PVS24`, `PVS90`, `PVST`, `PVSTF`, `TANO`, `TDDA`, `TFAD1`, `TFADF`, `TFADI`, `TFVE`, `TFVI`, `TH3AA`, `TH3AH`, `TH3AI`, `TH3AO`, `TH3AS`, `TH3BO`, `TH3CH`, `TH3DB`, `TH3DI`, `TH3ED`, `TH3FG`, `TH3FR`, `TH3IT`, `TH3MR`, `TH3NN`, `TH3OM`, `TH3PB`, `TH3PH`, `TH3PR`, `TH3RI`, `TH3SA`, `TH3SF`, `TH3SM`, `THAAA`, `THAAH`, `THAAI`, `THAAO`, `THAAS`, `THABO`, `THACH`, `THADB`, `THADI`, `THAED`, `THAFG`, `THAFR`, `THAIT`, `THAMR`, `THANN`, `THAOM`, `THAPB`, `THAPH`, `THAPR`, `THARI`, `THASA`, `THASF`, `THASM`, `THPAA`, `THPAH`, `THPAI`, `THPAO`, `THPAS`, `THPBO`, `THPCH`, `THPDB`, `THPDI`, `THPED`, `THPFG`, `THPFR`, `THPIT`, `THPMR`, `THPNN`, `THPOM`, `THPPB`, `THPPH`, `THPPR`, `THPRI`, `THPSA`, `THPSF`, `THPSM`, `THTAH`, `THTAV`, `THTBE`, `THTBP`, `THTDI`, `THTED`, `THTES`, `THTFG`, `THTFR`, `THTGP`, `THTHE`, `THTIA`, `THTIH`, `THTIP`, `THTMX`, `THTNN`, `THTOM`, `THTPR`, `THTRP`, `THTSG`, `THTVP`, `TIAWB`, `TIAWF`, `TINO`, `TL3AA`, `TL3AH`, `TL3AI`, `TL3AO`, `TL3AS`, `TL3BO`, `TL3CH`, `TL3DB`, `TL3DI`, `TL3ED`, `TL3FG`, `TL3FR`, `TL3IT`, `TL3MR`, `TL3NN`, `TL3OM`, `TL3PB`, `TL3PH`, `TL3PR`, `TL3RI`, `TL3SA`, `TL3SF`, `TL3SM`, `TLAAA`, `TLAAH`, `TLAAI`, `TLAAO`, `TLAAS`, `TLABO`, `TLACH`, `TLADB`, `TLADI`, `TLAED`, `TLAFG`, `TLAFR`, `TLAIT`, `TLAMR`, `TLANN`, `TLAOM`, `TLAPB`, `TLAPH`, `TLAPR`, `TLARI`, `TLASA`, `TLASF`, `TLASM`, `TLGPD`, `TLPAA`, `TLPAH`, `TLPAI`, `TLPAO`, `TLPAS`, `TLPBO`, `TLPCH`, `TLPDB`, `TLPDI`, `TLPED`, `TLPFG`, `TLPFR`, `TLPIT`, `TLPMR`, `TLPNN`, `TLPOM`, `TLPPB`, `TLPPH`, `TLPPR`, `TLPRI`, `TLPSA`, `TLPSF`, `TLPSM`, `TLTAH`, `TLTAV`, `TLTBE`, `TLTBP`, `TLTDI`, `TLTED`, `TLTES`, `TLTFG`, `TLTFR`, `TLTGP`, `TLTHE`, `TLTIA`, `TLTIH`, `TLTIP`, `TLTMX`, `TLTNN`, `TLTOM`, `TLTPR`, `TLTRP`, `TLTSG`, `TLTVP`, `TMAI`, `TMFSI`, `TNAPD`, `TNASM`, `TNPID`, `TNPIE`, `TNPIN`, `TNPIP`, `TNPIR`, `TNPIS`, `TNPIZ`, `TNPMS`, `TOAB`, `TOAF`, `TPAI`, `TPDNV`, `TPSMT`, `TSAC`, `TSAF`, `TSBF`, `TSBG`, `TSBH`, `TSBI`, `TSBJ`, `TBK`, `TSBN`, `TSBO`, `TSCG`, `TSCH`, `TSDC`, `TSDD`, `TSDE`, `TSDF`, `TSDG`, `TSDH`, `TSDI`, `TSDJ`, `TSDK`, `TSDL`, `TSDM`, `TSDN`, `TSDO`, `TSDP`, `TSMA`, `TSMB`, `TSMC`, `TNSA`, `TSNB`, `TSNC`, `TSOA`, `TSKU`, `TSLI`, `TSLJ`, `TSLK`, `TSLN`, `TSLO`, `TSDV`, `TSNA`, `TSNV`, `TSOD`, `TSOP`, `TSPNA`, `TSPNM`, `TSR`, `TSRD`, `TSRF`, `TSSF`, `TSTUT`, `TTIQ`, `TXHR`, `TXMTW`, `TXNA`, `TXR`, `TXTW`, `TXVHR`, `TSRP` | | `riskData.reasonCodes.reasonCodes.description` | string | | | | `riskData.additionalVerificationInfo` | AdditionalVerificationInfo | | | | `riskData.additionalVerificationInfo.creditFileDetails` | CreditFileDetails | | | | `riskData.additionalVerificationInfo.creditFileDetails.creditFileNumber` | string | | | | `riskData.additionalVerificationInfo.creditFileDetails.creditFileCreationDate` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/externalVerification/ekyc/session \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/externalVerification/ekyc/session", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/externalVerification/ekyc/session", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/externalVerification/ekyc/session")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "userData": { "plugins": [ "string" ], "source": "US_DRIVERS_LICENSE_1", "fullName": "string", "firstName": "string", "middleName": "string", "surName": "string", "email": "string", "street": "string", "houseNo": "string", "postalCode": "string", "countryCode": "string", "phone": "string", "state": "string", "city": "string", "ssn": "string", "dateOfBirth": "string", "ipAddress": "string", "taxIdStatus": "string", "nationality": "string", "dlNumber": "string", "dlExpireAt": "string", "dlState": "string", "last4SSN": "string", "idNumber": "string", "panNumber": "string" }, "riskData": { "level": "string", "verifications": {}, "income": { "status": "string", "range": "string" }, "employment": { "status": "string", "type": "string", "sector": "string" }, "reasonCodes": [ { "key": "string", "reasonCodes": [ { "reasonCode": "A40SS", "description": "string" } ] } ], "additionalVerificationInfo": { "creditFileDetails": { "creditFileNumber": "string", "creditFileCreationDate": "string" } } } } ``` --- - Path: `api-reference/externalverification-ekyc-unified` - URL: https://developer.incode.com/api-reference/externalverification-ekyc-unified/ - Markdown: https://developer.incode.com/api-reference/externalverification-ekyc-unified.md - Endpoint: `POST /omni/externalVerification/ekyc/unified` # Unified start + eKYC + finish (low-latency) `POST /omni/externalVerification/ekyc/unified` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Runs session start and eKYC verification in parallel and fires finish-status asynchronously, returning once both the start and eKYC legs have resolved. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `start` | StartRequest | yes | Fields used to initialize the onboarding session (same shape as /omni/start). | | `start.language` | string | | Language code to be used when doing speech to text. Possible values: en-US, es-ES, pt-BR. | | `start.externalId` | string | | Id that identifies user in clients system should be used for externalId. (Deprecated, use externalCustomerId instead) | | `start.externalCustomerId` | string | | Id that identifies user in clients external system. | | `start.uuid` | string | | uuid key used in redis, can be used as an alternative to sending interviewId. | | `start.configurationId` | string | | Id of the flow to be used for this onboarding. | | `start.redirectionUrl` | string | | Url the user will be redirected to after finishing the onboarding successfully. | | `start.integrationReference` | string | | Optional integration reference. | | `start.urlUuid` | string | | Url uuid key used in redis. Will be validated in start if qrPhishingResistance is ON. | | `start.customFields` | object | | Used to send any additional information in key value pair format. Max fields: {maxEntries}, max key length: {keyMaxLength}, max value length: {valueMaxLength} | | `ekyc` | EkycVerificationRequest | yes | Fields used for the eKYC verification (same shape as /omni/externalVerification/ekyc). | | `ekyc.plugins` | array[string] | | | | `ekyc.firstName` | string | | The following special characters are not supported: `^±!@£$%&*_+¡€#¢§¶•ªº«<>?\\/:;\|=` | | `ekyc.surName` | string | | The following special characters are not supported: `^±!@£$%&*_+¡€#¢§¶•ªº«<>?\\/:;\|=` | | `ekyc.middleName` | string | | The following special characters are not supported: `^±!@£$%&*_+¡€#¢§¶•ªº«<>?\\/:;\|=` | | `ekyc.maternalSurname` | string | | The following special characters are not supported: `^±!@£$%&*_+¡€#¢§¶•ªº«<>?\\/:;\|=` | | `ekyc.email` | string | | | | `ekyc.street` | string | | | | `ekyc.streetNo` | string | | | | `ekyc.floor` | string | | | | `ekyc.apartment` | string | | | | `ekyc.postalCode` | string | | | | `ekyc.countryCode` | string | | ISO 3166-1 alpha-2 format | | `ekyc.phone` | string | | Use E.164 format. Hyphens are optional | | `ekyc.state` | string | | | | `ekyc.city` | string | | | | `ekyc.idNumber` | string | | | | `ekyc.idNumber1` | string | | | | `ekyc.gender` | string | | | | `ekyc.taxId` | string | | | | `ekyc.dateOfBirth` | string (YYYY-MM-DD) | | | | `ekyc.dlExpireAt` | string (YYYY-MM-DD) | | | | `ekyc.fullName` | string | | | | `ekyc.panNumber` | string | | Indian Permanent Account Number (PAN), format: AAAAANNNNA | | `ekyc.district` | string | | District or Barangay (neighbourhood), used for Philippines KYC | | `ekyc.idType` | string | | National ID type. Supported for Philippines KYC: SSS, TIN, GSIS | | `ekyc.issueDate` | string (YYYY-MM-DD) | | ID document issue date. Required for Colombia Civil Register (CO_CIVIL_REGISTER_1) KYC | | `finishAsync` | boolean | | When true (default), finish-session runs asynchronously after the response is sent. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewId` | string | | Identifier of the onboarding session created by /start. | | `token` | string | | JWT token for subsequent calls (X-Incode-Hardware-Id header). | | `interviewCode` | string | | Short onboarding code from /start. | | `flowType` | string | | Flow type of the configuration used. Enum: `configuration`, `flow`, `workflow` | | `ekyc` | EkycVerificationResponse | | eKYC verification result. | | `ekyc.kyc` | array[EkycVerification] | | | | `ekyc.kyc.key` | string | | Indicates a type of risk, such as addressRiskLevel. The overallLevel key name is an aggregate risk score for all risk types. It can be used to obtain a single risk score for a whole result set. | | `ekyc.kyc.status` | string | | Explains the risk level, ie "low", "medium", or "high". When doing a social security number check, the API will return status values of nomatch, fuzzy or exact. Fuzzy means there is plausible match between the name and the social security number, like Dave and David both resolve to the same SSN. | | `ekyc.kyc.sub_label` | string | | Additional info on the status. | | `ekyc.kyc.message` | string | | | | `ekyc.kyc.reasonCodes` | array[string] | | | | `ekyc.income` | array[EkycVerification] | | | | `ekyc.income.key` | string | | Indicates a type of risk, such as addressRiskLevel. The overallLevel key name is an aggregate risk score for all risk types. It can be used to obtain a single risk score for a whole result set. | | `ekyc.income.status` | string | | Explains the risk level, ie "low", "medium", or "high". When doing a social security number check, the API will return status values of nomatch, fuzzy or exact. Fuzzy means there is plausible match between the name and the social security number, like Dave and David both resolve to the same SSN. | | `ekyc.income.sub_label` | string | | Additional info on the status. | | `ekyc.income.message` | string | | | | `ekyc.income.reasonCodes` | array[string] | | | | `ekyc.additionalVerificationInfo` | AdditionalVerificationInfo | | | | `ekyc.additionalVerificationInfo.creditFileDetails` | CreditFileDetails | | | | `ekyc.additionalVerificationInfo.creditFileDetails.creditFileNumber` | string | | | | `ekyc.additionalVerificationInfo.creditFileDetails.creditFileCreationDate` | string | | | | `ekycStatus` | string | | Status of the eKYC verification: SUCCESS, TIMEOUT, or ERROR. Enum: `SUCCESS`, `TIMEOUT`, `ERROR` | | `finishQueued` | boolean | | True when finish-session was queued for asynchronous processing. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/externalVerification/ekyc/unified \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "start": "", "start.language": "", "start.externalId": "", "start.externalCustomerId": "", "start.uuid": "", "start.configurationId": "", "start.redirectionUrl": "", "start.integrationReference": "", "start.urlUuid": "", "start.customFields": {}, "ekyc": "", "ekyc.plugins": [], "ekyc.firstName": "", "ekyc.surName": "", "ekyc.middleName": "", "ekyc.maternalSurname": "", "ekyc.email": "", "ekyc.street": "", "ekyc.streetNo": "", "ekyc.floor": "", "ekyc.apartment": "", "ekyc.postalCode": "", "ekyc.countryCode": "", "ekyc.phone": "", "ekyc.state": "", "ekyc.city": "", "ekyc.idNumber": "", "ekyc.idNumber1": "", "ekyc.gender": "", "ekyc.taxId": "", "ekyc.dateOfBirth": "", "ekyc.dlExpireAt": "", "ekyc.fullName": "", "ekyc.panNumber": "", "ekyc.district": "", "ekyc.idType": "", "ekyc.issueDate": "", "finishAsync": false }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/externalVerification/ekyc/unified", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "start": "", "start.language": "", "start.externalId": "", "start.externalCustomerId": "", "start.uuid": "", "start.configurationId": "", "start.redirectionUrl": "", "start.integrationReference": "", "start.urlUuid": "", "start.customFields": {}, "ekyc": "", "ekyc.plugins": [], "ekyc.firstName": "", "ekyc.surName": "", "ekyc.middleName": "", "ekyc.maternalSurname": "", "ekyc.email": "", "ekyc.street": "", "ekyc.streetNo": "", "ekyc.floor": "", "ekyc.apartment": "", "ekyc.postalCode": "", "ekyc.countryCode": "", "ekyc.phone": "", "ekyc.state": "", "ekyc.city": "", "ekyc.idNumber": "", "ekyc.idNumber1": "", "ekyc.gender": "", "ekyc.taxId": "", "ekyc.dateOfBirth": "", "ekyc.dlExpireAt": "", "ekyc.fullName": "", "ekyc.panNumber": "", "ekyc.district": "", "ekyc.idType": "", "ekyc.issueDate": "", "finishAsync": false }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/externalVerification/ekyc/unified", headers=headers, json={ "start": "", "start.language": "", "start.externalId": "", "start.externalCustomerId": "", "start.uuid": "", "start.configurationId": "", "start.redirectionUrl": "", "start.integrationReference": "", "start.urlUuid": "", "start.customFields": {}, "ekyc": "", "ekyc.plugins": [], "ekyc.firstName": "", "ekyc.surName": "", "ekyc.middleName": "", "ekyc.maternalSurname": "", "ekyc.email": "", "ekyc.street": "", "ekyc.streetNo": "", "ekyc.floor": "", "ekyc.apartment": "", "ekyc.postalCode": "", "ekyc.countryCode": "", "ekyc.phone": "", "ekyc.state": "", "ekyc.city": "", "ekyc.idNumber": "", "ekyc.idNumber1": "", "ekyc.gender": "", "ekyc.taxId": "", "ekyc.dateOfBirth": "", "ekyc.dlExpireAt": "", "ekyc.fullName": "", "ekyc.panNumber": "", "ekyc.district": "", "ekyc.idType": "", "ekyc.issueDate": "", "finishAsync": False }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/externalVerification/ekyc/unified")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"start\": \"\",\n \"start.language\": \"\",\n \"start.externalId\": \"\",\n \"start.externalCustomerId\": \"\",\n \"start.uuid\": \"\",\n \"start.configurationId\": \"\",\n \"start.redirectionUrl\": \"\",\n \"start.integrationReference\": \"\",\n \"start.urlUuid\": \"\",\n \"start.customFields\": {},\n \"ekyc\": \"\",\n \"ekyc.plugins\": [],\n \"ekyc.firstName\": \"\",\n \"ekyc.surName\": \"\",\n \"ekyc.middleName\": \"\",\n \"ekyc.maternalSurname\": \"\",\n \"ekyc.email\": \"\",\n \"ekyc.street\": \"\",\n \"ekyc.streetNo\": \"\",\n \"ekyc.floor\": \"\",\n \"ekyc.apartment\": \"\",\n \"ekyc.postalCode\": \"\",\n \"ekyc.countryCode\": \"\",\n \"ekyc.phone\": \"\",\n \"ekyc.state\": \"\",\n \"ekyc.city\": \"\",\n \"ekyc.idNumber\": \"\",\n \"ekyc.idNumber1\": \"\",\n \"ekyc.gender\": \"\",\n \"ekyc.taxId\": \"\",\n \"ekyc.dateOfBirth\": \"\",\n \"ekyc.dlExpireAt\": \"\",\n \"ekyc.fullName\": \"\",\n \"ekyc.panNumber\": \"\",\n \"ekyc.district\": \"\",\n \"ekyc.idType\": \"\",\n \"ekyc.issueDate\": \"\",\n \"finishAsync\": false\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "interviewId": "string", "token": "string", "interviewCode": "string", "flowType": "configuration", "ekyc": { "kyc": [ { "key": "string", "status": "string", "sub_label": "string", "message": "string", "reasonCodes": [ "string" ] } ], "income": [ { "key": "string", "status": "string", "sub_label": "string", "message": "string", "reasonCodes": [ "string" ] } ], "additionalVerificationInfo": { "creditFileDetails": { "creditFileNumber": "string", "creditFileCreationDate": "string" } } }, "ekycStatus": "SUCCESS", "finishQueued": true } ``` --- - Path: `api-reference/externalverification-income` - URL: https://developer.incode.com/api-reference/externalverification-income/ - Markdown: https://developer.incode.com/api-reference/externalverification-income.md - Endpoint: `POST /omni/externalVerification/income` # eKYC Income verification `POST /omni/externalVerification/income` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint performs an eKYC income check ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `taxId` | string | yes | 11 digit CPF | | `country` | string | yes | Two letter Alpha-2 country code. (Must be BR). | ## Responses ### 200 Example: ``` { "income": [ { "key": "employment_type", "status": "success", "sub_label": "Type", "message": "ENTREPRENEUR \| BUSINESS OWNER" }, { "key": "employment_sector", "status": "success", "sub_label": "Sector", "message": "PRIVATE - 4639701 - COMERCIO ATACADISTA DE PRODUTOS ALIMENTICIOS EM GERAL" }, { "key": "income_range", "status": "success", "sub_label": "Estimated Income Range", "message": "9240-13200" } ] } ``` Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `kyc` | array[EkycVerification] | | | | `kyc.key` | string | | Indicates a type of risk, such as addressRiskLevel. The overallLevel key name is an aggregate risk score for all risk types. It can be used to obtain a single risk score for a whole result set. | | `kyc.status` | string | | Explains the risk level, ie "low", "medium", or "high". When doing a social security number check, the API will return status values of nomatch, fuzzy or exact. Fuzzy means there is plausible match between the name and the social security number, like Dave and David both resolve to the same SSN. | | `kyc.sub_label` | string | | Additional info on the status. | | `kyc.message` | string | | | | `kyc.reasonCodes` | array[string] | | | | `income` | array[EkycVerification] | | | | `income.key` | string | | Indicates a type of risk, such as addressRiskLevel. The overallLevel key name is an aggregate risk score for all risk types. It can be used to obtain a single risk score for a whole result set. | | `income.status` | string | | Explains the risk level, ie "low", "medium", or "high". When doing a social security number check, the API will return status values of nomatch, fuzzy or exact. Fuzzy means there is plausible match between the name and the social security number, like Dave and David both resolve to the same SSN. | | `income.sub_label` | string | | Additional info on the status. | | `income.message` | string | | | | `income.reasonCodes` | array[string] | | | | `additionalVerificationInfo` | AdditionalVerificationInfo | | | | `additionalVerificationInfo.creditFileDetails` | CreditFileDetails | | | | `additionalVerificationInfo.creditFileDetails.creditFileNumber` | string | | | | `additionalVerificationInfo.creditFileDetails.creditFileCreationDate` | string | | | ### 400 Example: ``` { "timestamp": 1722948860110, "status": 400, "error": "Both country and taxId are mandatory fields must be submitted for successful request", "message": "Both country and taxId are mandatory fields must be submitted for successful request", "path": "/omni/externalVerification/income" } ``` Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/externalVerification/income \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "taxId": "", "country": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/externalVerification/income", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "taxId": "", "country": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/externalVerification/income", headers=headers, json={ "taxId": "", "country": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/externalVerification/income")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"taxId\": \"\",\n \"country\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "kyc": [ { "key": "string", "status": "string", "sub_label": "string", "message": "string", "reasonCodes": [ "string" ] } ], "income": [ { "key": "string", "status": "string", "sub_label": "string", "message": "string", "reasonCodes": [ "string" ] } ], "additionalVerificationInfo": { "creditFileDetails": { "creditFileNumber": "string", "creditFileCreationDate": "string" } } } ``` --- - Path: `api-reference/finalize-document` - URL: https://developer.incode.com/api-reference/finalize-document/ - Markdown: https://developer.incode.com/api-reference/finalize-document.md - Endpoint: `POST /omni/finalize/document` # Finalize document processing `POST /omni/finalize/document` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Finalize document processing for multi-page documents with optional page capture ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `type` | string | yes | Type of document image for which processing is being finalized. Enum: `selfie`, `authenticationSelfie`, `sorSelfie`, `videoSelfie`, `croppedFace`, `croppedAuthenticationSelfie`, `croppedFrameAnalysisSelfie`, `croppedIDFace`, `croppedNfcFace`, `document`, `originalSignature`, `signature`, `initials`, `fullFrameFrontID`, `fullFrameBackID`, `croppedFrontID`, `refCroppedFrontID`, `croppedBackID`, `refCroppedBackID`, `croppedOriginalFrontID`, `croppedOriginalBackID`, `confSelfie`, `confFrontID`, `confBackID`, `confPoa`, `addressStatement`, `medicalDoc`, `secondId`, `thirdId`, `contract`, `signedContract`, `videoSelfieCompareID`, `videoSelfieCompareOcr`, `videoSelfieCompareBackID`, `videoSelfieCompareBackOcr`, `otherDocument1`, `otherDocument2`, `otherDocument3`, `paymentProof`, `consent`, `annotationImg`, `externalScreen`, `eSignDocument`, `sessionExport`, `zoomedFrontId`, `zoomedBackId`, `zoomedSelfie`, `regionBasedTemplate`, `renaperCropped`, `voiceConsentSelfie`, `v5cLogbook`, `v5cMultiPageLogbook`, `carInvoice`, `circulationCard`, `financeSettlement`, `faceRecordingFrame`, `signatureImageID`, `ghostSignatureImageID`, `ghostPortraitImageID`, `fingerprintImageID`, `documentNumberCropImageID`, `ineMexScan` | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `status` | string | | AddDocumentStatus Enum: `SUCCESS`, `PROCESS_DOC_ERROR`, `SESSION_ERROR`, `ADD_NEXT_PAGE`, `OPTIONAL_PAGE_CAPTURE`, `CLASSIFICATION_ERROR`, `MULTI_PAGE_CLASSIFICATION_ERROR`, `V5C_REGISTRATION_NUMBER_MISMATCH`, `V5C_REFERENCE_NUMBER_MISMATCH`, `V5C_NUMBER_MISMATCH`, `FSL_AGREEMENT_REFERENCE_MISMATCH`, `FSL_NAME_MISMATCH`, `MANDATORY_FIELD_MISSING`, `UNSUPPORTED_PAGE_NUMBERS`, `VALIDATION_ERROR`, `UNEXPECTED_ERROR`, `FINALIZE_ERROR_NO_PAGES`, `UNSUPPORTED_MP_DOCUMENT_TYPE` | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/finalize/document \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "type": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/finalize/document", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "type": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/finalize/document", headers=headers, json={ "type": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/finalize/document")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"type\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "status": "SUCCESS" } ``` --- - Path: `api-reference/finish` - URL: https://developer.incode.com/api-reference/finish/ - Markdown: https://developer.incode.com/api-reference/finish.md - Endpoint: `PUT /omni/finish` # Finish interview `PUT /omni/finish` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Finish the interview and remove customer from the queue. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewId` | string | | Interview id. | | `status` | string | | Status of finished interview Enum: `NO_CONFERENCE`, `APPROVED`, `REJECTED`, `ABANDONED`, `NEEDS_REVIEW`, `REJECTED_BY_RISK`, `COMPLETED` | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `urls` | array[string] | | | | `uuid` | string | | ID of newly created customer (if onboarding was approved). | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X PUT https://demo-api.incodesmile.com/omni/finish \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "interviewId": "", "status": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/finish", { method: "PUT", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "interviewId": "", "status": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.put("https://demo-api.incodesmile.com/omni/finish", headers=headers, json={ "interviewId": "", "status": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/finish")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("PUT", HttpRequest.BodyPublishers.ofString("{\n \"interviewId\": \"\",\n \"status\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "urls": [ "string" ], "uuid": "string" } ``` --- - Path: `api-reference/finish-status` - URL: https://developer.incode.com/api-reference/finish-status/ - Markdown: https://developer.incode.com/api-reference/finish-status.md - Endpoint: `GET /omni/finish-status` # Mark onboarding complete `GET /omni/finish-status` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment > **Deprecated** — this endpoint is marked deprecated in the Omni API specification. Mark onboarding done. NOTE: This call is **deprecated**, use [POST /finish-status](#/Onboarding/finishSessionPost) instead. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `flowId` | query | string | | | | `interviewId` | query | string | | | | `api-version` | header | string | yes | | ## Responses ### 200 Response: - redirectionUrl: String. Url to be redirected when onboarding is done - action: String. Possible values: none, approved, manualReview, rejected. Refers to the action performed based on the flow score configurations if applicable. Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `redirectionUrl` | string | | | | `action` | string | | | | `customerId` | string | | | | `scoreStatus` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/finish-status \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/finish-status", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/finish-status", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/finish-status")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "redirectionUrl": "string", "action": "string", "customerId": "string", "scoreStatus": "OK" } ``` --- - Path: `api-reference/finish-status-post` - URL: https://developer.incode.com/api-reference/finish-status-post/ - Markdown: https://developer.incode.com/api-reference/finish-status-post.md - Endpoint: `POST /omni/finish-status` # Mark onboarding complete `POST /omni/finish-status` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Mark onboarding done ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `flowId` | query | string | | | | `interviewId` | query | string | | | | `api-version` | header | string | yes | | ## Responses ### 200 Response: - redirectionUrl: String. Url to be redirected when onboarding is done - action: String. Possible values: none, approved, manualReview, rejected. Refers to the action performed based on the flow score configurations if applicable. Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `redirectionUrl` | string | | | | `action` | string | | | | `customerId` | string | | | | `scoreStatus` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/finish-status \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/finish-status", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/finish-status", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/finish-status")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "redirectionUrl": "string", "action": "string", "customerId": "string", "scoreStatus": "OK" } ``` --- - Path: `api-reference/fiscal-qr-url-response` - URL: https://developer.incode.com/api-reference/fiscal-qr-url-response/ - Markdown: https://developer.incode.com/api-reference/fiscal-qr-url-response.md - Endpoint: `GET /omni/fiscal-qr-url-response/{interviewId}` # Get fiscal qr url response `GET /omni/fiscal-qr-url-response/{interviewId}` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Get the information obtained from a fiscal qr url added to the session. (México only) ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | path | string | yes | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/fiscal-qr-url-response/{interviewId} \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/fiscal-qr-url-response/{interviewId}", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/fiscal-qr-url-response/{interviewId}", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/fiscal-qr-url-response/{interviewId}")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/form-answers` - URL: https://developer.incode.com/api-reference/form-answers/ - Markdown: https://developer.incode.com/api-reference/form-answers.md - Endpoint: `GET /omni/form/answers` # Fetch Form Answers `GET /omni/form/answers` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Retrieves all questions and answers that a user has responded to during a session, regardless of the form module configurations used. Works with Admin Token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | yes | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `answers` | array[FormAnswerDto] | | The answers provided by the user | | `answers.question` | string | | The question presented to the user | | `answers.answerDetails` | FormAnswerDetailsDto | | Details on user's answer | | `answers.answerDetails.singleAnswer` | string | | The user's answer to the question. Date Format: Dates in responses are returned as milliseconds since the Unix epoch (UTC) Country Code Format: Country codes in responses are returned using ISO 3166-1 alpha-3 format. For example, "USA" for the United States of America, "GBR" for Great Britain. | | `answers.answerDetails.selectedAnswers` | array[string] | | Field intended to support multiple selected answers by the user. Currently, this functionality is not supported and will always return as an empty array. | | `answers.inputType` | string | | Indicates the type of input used for the answer Enum: `NUMBER`, `CPF`, `COUNTRY`, `NATIONALITY`, `DATE`, `PHONE`, `EMAIL`, `TEXT`, `MULTISELECT`, `YESNO`, `SELECT` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/form/answers \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/form/answers", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/form/answers", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/form/answers")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "answers": [ { "question": "string", "answerDetails": { "singleAnswer": "string", "selectedAnswers": [ "string" ] }, "inputType": "NUMBER" } ] } ``` --- - Path: `api-reference/frame-analysis-analyze` - URL: https://developer.incode.com/api-reference/frame-analysis-analyze/ - Markdown: https://developer.incode.com/api-reference/frame-analysis-analyze.md - Endpoint: `POST /omni/frame-analysis/analyze` # Analysis of all faces from selfie image `POST /omni/frame-analysis/analyze` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Authenticate users by comparing base64 image from request and user's existing face templates. Each face from the image is analyzed, and relevant attributes are extracted. In case of failure, error description is returned. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | yes | Base64 representation of image. | | `videoRef` | string | | Reference of video from which frame is extracted. | | `frameRef` | string | | Reference of frame that should be analyzed. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `identities` | array[AnalyzedIdentityDto] | | List of identities analyzed from input base64image. | | `identities.identityId` | string | | Id of recognized customer. | | `identities.estimatedAge` | integer (int32) | | Estimated age based on extracted face. | | `identities.error` | FrameAnalysisErrorDto | | Error name. Possible error names are: LENSES_DETECTED, FACE_MASK_DETECTED, HEAD_COVER_DETECTED, CLOSED_EYES_DETECTED, SPOOF_ATTEMPT_DETECTED, USER_IS_NOT_RECOGNIZED | | `identities.error.name` | string | | | | `videoRef` | string | | Reference of video from which frame is extracted. | | `frameRef` | string | | Reference of frame that is analyzed. | | `error` | FrameAnalysisErrorDto | | Error name. Possible error name is: FACE_EXTRACTION_FAILED | | `error.name` | string | | | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/frame-analysis/analyze \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "videoRef": "", "frameRef": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/frame-analysis/analyze", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "videoRef": "", "frameRef": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/frame-analysis/analyze", headers=headers, json={ "base64Image": "", "videoRef": "", "frameRef": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/frame-analysis/analyze")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"videoRef\": \"\",\n \"frameRef\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "identities": [ { "identityId": "string", "estimatedAge": 0, "error": { "name": "string" } } ], "videoRef": "string", "frameRef": "string", "error": { "name": "string" } } ``` --- - Path: `api-reference/frame-analysis-analyze-third-party` - URL: https://developer.incode.com/api-reference/frame-analysis-analyze-third-party/ - Markdown: https://developer.incode.com/api-reference/frame-analysis-analyze-third-party.md - Endpoint: `POST /omni/frame-analysis/analyze/third-party` # Analysis of all faces from selfie image `POST /omni/frame-analysis/analyze/third-party` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Authenticate users by comparing base64 image from request and user's existing face templates. Each face from the image is analyzed, and relevant attributes are extracted. In case of failure, error description is returned. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | yes | Base64 representation of image. | | `videoRef` | string | | Reference of video from which frame is extracted. | | `frameRef` | string | | Reference of frame that should be analyzed. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `identities` | array[AnalyzedIdentityDto] | | List of identities analyzed from input base64image. | | `identities.identityId` | string | | Id of recognized customer. | | `identities.estimatedAge` | integer (int32) | | Estimated age based on extracted face. | | `identities.error` | FrameAnalysisErrorDto | | Error name. Possible error names are: LENSES_DETECTED, FACE_MASK_DETECTED, HEAD_COVER_DETECTED, CLOSED_EYES_DETECTED, SPOOF_ATTEMPT_DETECTED, USER_IS_NOT_RECOGNIZED | | `identities.error.name` | string | | | | `videoRef` | string | | Reference of video from which frame is extracted. | | `frameRef` | string | | Reference of frame that is analyzed. | | `error` | FrameAnalysisErrorDto | | Error name. Possible error name is: FACE_EXTRACTION_FAILED | | `error.name` | string | | | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/frame-analysis/analyze/third-party \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "videoRef": "", "frameRef": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/frame-analysis/analyze/third-party", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "videoRef": "", "frameRef": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/frame-analysis/analyze/third-party", headers=headers, json={ "base64Image": "", "videoRef": "", "frameRef": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/frame-analysis/analyze/third-party")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"videoRef\": \"\",\n \"frameRef\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "identities": [ { "identityId": "string", "estimatedAge": 0, "error": { "name": "string" } } ], "videoRef": "string", "frameRef": "string", "error": { "name": "string" } } ``` --- - Path: `api-reference/generatesessionrecordingdownloadurl` - URL: https://developer.incode.com/api-reference/generatesessionrecordingdownloadurl/ - Markdown: https://developer.incode.com/api-reference/generatesessionrecordingdownloadurl.md - Endpoint: `GET /omni/generateSessionRecordingDownloadUrl` # Get url to download session recording `GET /omni/generateSessionRecordingDownloadUrl` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Get url to download session recording ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | | | | `type` | query | string | yes | Enum: `frontId`, `backId`, `merged`, `selfie`, `authenticationattempt` | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `url` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/generateSessionRecordingDownloadUrl \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/generateSessionRecordingDownloadUrl", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/generateSessionRecordingDownloadUrl", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/generateSessionRecordingDownloadUrl")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "url": "string" } ``` --- - Path: `api-reference/generatevideoselfiedownloadurl` - URL: https://developer.incode.com/api-reference/generatevideoselfiedownloadurl/ - Markdown: https://developer.incode.com/api-reference/generatevideoselfiedownloadurl.md - Endpoint: `GET /omni/generateVideoSelfieDownloadUrl` # Get download URL of videoselfie `GET /omni/generateVideoSelfieDownloadUrl` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Get URL for downloading video recording of video selfie. This is temporary pre-signed url, that expires in 1 hour ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | | Session ID for which url is generated. In case not set, interviewId will be determined from token from header. | | `api-version` | header | string | yes | | ## Responses ### 200 OK ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/generateVideoSelfieDownloadUrl \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/generateVideoSelfieDownloadUrl", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/generateVideoSelfieDownloadUrl", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/generateVideoSelfieDownloadUrl")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/get-archives` - URL: https://developer.incode.com/api-reference/get-archives/ - Markdown: https://developer.incode.com/api-reference/get-archives.md - Endpoint: `GET /omni/get/archives` # Fetch video archive urls `GET /omni/get/archives` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch URLs of video archives from given 'interviewId' or if omitted for given 'since' timestamp. If not provided, 'since' will be defaulted to time of first created archive. The maximum fetch size is 1000. In case maximum fetch size is reached, a new fetch should be triggered, using 'startTime' of last record from previous fetch as 'since'. URLs returned are temporary URLs, which expire in 5 days. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | | In case this parameter is provided, 'since' is ignored, and response will contain single interview requested. | | `since` | query | integer (int64) | | Timestamp — beginning of export. If omitted, it will be defaulted to time of first created archive. | | `api-version` | header | string | yes | | ## Responses ### 200 - archives: Array of archive objects - interviewId: String. ID of interview. - name: String. Name of the user in conference call. - url: String. URL of archive file. - startTime: Long. Timestamp of archive creation. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/archives \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/archives", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/archives", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/archives")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/get-chat` - URL: https://developer.incode.com/api-reference/get-chat/ - Markdown: https://developer.incode.com/api-reference/get-chat.md - Endpoint: `GET /omni/get/chat` # Fetch conference chat `GET /omni/get/chat` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch conference chat for given 'interviewId'.Works with Admin Token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | yes | Interview id. | | `api-version` | header | string | yes | | ## Responses ### 200 OK ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/chat \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/chat", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/chat", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/chat")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/get-combined-consent` - URL: https://developer.incode.com/api-reference/get-combined-consent/ - Markdown: https://developer.incode.com/api-reference/get-combined-consent.md - Endpoint: `GET /omni/get/combined-consent` # Get combined consent for requested language `GET /omni/get/combined-consent` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetches combined consent for requested language. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Consent id | | `language` | query | string | yes | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `id` | string | | | | `languageCode` | string | | Enum: `ps-AF`, `sv-AX`, `sq-AL`, `ar-DZ`, `en-AS`, `ca-AD`, `pt-AO`, `en-AI`, `en-AQ`, `en-AG`, `es-AR`, `hy-AM`, `nl-AW`, `en-AU`, `de-AT`, `az-AZ`, `en-BS`, `ar-BH`, `bn-BD`, `en-BB`, `be-BY`, `nl-BE`, `en-BZ`, `fr-BJ`, `en-BM`, `dz-BT`, `es-BO`, `nl-BQ`, `bs-BA`, `en-BW`, `no-BV`, `pt-BR`, `en-IO`, `ms-BN`, `bg-BG`, `fr-BF`, `rn-BI`, `pt-CV`, `km-KH`, `fr-CM`, `en-CA`, `fr-CA`, `en-KY`, `fr-CF`, `fr-TD`, `es-CL`, `zh-CN`, `en-CX`, `ms-CC`, `es-CO`, `ar-KM`, `fr-CG`, `fr-CD`, `en-CK`, `es-CR`, `fr-CI`, `hr-HR`, `es-CU`, `nl-CW`, `el-CY`, `cs-CZ`, `da-DK`, `fr-DJ`, `en-DM`, `es-DO`, `es-EC`, `ar-EG`, `es-SV`, `es-GQ`, `aa-ER`, `et-EE`, `am-ET`, `en-FK`, `fo-FO`, `en-FJ`, `fi-FI`, `fr-FR`, `fr-GF`, `fr-PF`, `fr-TF`, `fr-GA`, `en-GM`, `ka-GE`, `de-DE`, `en-GH`, `en-GI`, `el-GR`, `kl-GL`, `en-GD`, `fr-GP`, `en-GU`, `es-GT`, `en-GG`, `fr-GN`, `pt-GW`, `en-GY`, `fr-HT`, `en-HM`, `it-VA`, `es-HN`, `zh-HK`, `hu-HU`, `is-IS`, `hi-IN`, `id-ID`, `fa-IR`, `ar-IQ`, `ga-IE`, `en-IM`, `he-IL`, `it-IT`, `en-JM`, `ja-JP`, `en-JE`, `ar-JO`, `kk-KZ`, `sw-KE`, `en-KI`, `ko-KP`, `ko-KR`, `ar-KW`, `ky-KG`, `lo-LA`, `lv-LV`, `ar-LB`, `en-LS`, `en-LR`, `ar-LY`, `de-LI`, `lt-LT`, `fr-LU`, `zh-MO`, `mg-MG`, `ny-MW`, `ms-MY`, `dv-MV`, `fr-ML`, `mt-MT`, `mh-MH`, `fr-MQ`, `ar-MR`, `en-MU`, `fr-YT`, `es-MX`, `en-FM`, `ro-MD`, `fr-MC`, `mn-MN`, `sr-ME`, `en-MS`, `ar-MA`, `pt-MZ`, `my-MM`, `en-NA`, `na-NR`, `ne-NP`, `nl-NL`, `fr-NC`, `en-NZ`, `es-NI`, `fr-NE`, `en-NG`, `en-NU`, `en-NF`, `mk_MK`, `en-MP`, `no-NO`, `ar-OM`, `ur-PK`, `en-PW`, `ar-PS`, `es-PA`, `en-PG`, `es-PY`, `es-PE`, `en-PH`, `en-PN`, `pl-PL`, `pt-PT`, `es-PR`, `ar-QA`, `fr-RE`, `ro-RO`, `ru-RU`, `rw-RW`, `fr-BL`, `en-SH`, `en-KN`, `en-LC`, `fr-MF`, `fr-PM`, `en-VC`, `sm-WS`, `it-SM`, `pt-ST`, `ar-SA`, `fr-SN`, `sr-RS`, `en-SC`, `en-SL`, `en-SG`, `nl-SX`, `sk-SK`, `sl-SI`, `en-SB`, `so-SO`, `en-ZA`, `en-GS`, `en-SS`, `es-ES`, `si-LK`, `ar-SD`, `nl-SR`, `no-SJ`, `en-SZ`, `sv-SE`, `de-CH`, `ar-SY`, `zh-TW`, `tg-TJ`, `sw-TZ`, `th-TH`, `pt-TL`, `fr-TG`, `en-TK`, `to-TO`, `en-TT`, `ar-TN`, `tr-TR`, `tk-TM`, `en-TC`, `tvl`, `sw-UG`, `uk-UA`, `ar-AE`, `en-GB`, `en-US`, `en-UM`, `es-UY`, `uz-UZ`, `bi-VU`, `es-VE`, `vi-VN`, `en-VG`, `en-VI`, `fr-WF`, `ar-EH`, `ar-YE`, `en-ZM`, `en-ZW`, `en`, `es`, `pt`, `fr`, `de`, `ar` | | `title` | string | | | | `terms` | string | | | | `isDefault` | boolean | | | | `consents` | array[ConsentCheckbox] | | | | `consents.checkboxId` | string | | | | `consents.consentText` | string | | | | `consents.consentType` | string | | | | `consents.origin` | string | | Enum: `USER`, `SHARED` | | `consents.optional` | boolean | | | | `consents.editable` | boolean | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/combined-consent \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/combined-consent", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/combined-consent", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/combined-consent")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "id": "string", "languageCode": "ps-AF", "title": "string", "terms": "string", "isDefault": true, "consents": [ { "checkboxId": "string", "consentText": "string", "consentType": "string", "origin": "USER", "optional": true, "editable": true } ] } ``` --- - Path: `api-reference/get-concatenated-images` - URL: https://developer.incode.com/api-reference/get-concatenated-images/ - Markdown: https://developer.incode.com/api-reference/get-concatenated-images.md - Endpoint: `POST /omni/get/concatenated-images` # Fetch concatenated images `POST /omni/get/concatenated-images` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Concatenates requested images from user. Resulting image keep the largest width of the requested images and preserves the order. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Id of onboarding for which images are requested. If not present, it will be extracted from token. | | `api-version` | header | string | yes | | ## Request body Image types that are requested. Requested images are limited to crops only, because full frames can potentially lead to big payload in response Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `images` | array[string] | yes | | ## Responses ### 200 For each requested image type, response contains line in format: {imageType}: String (base64) Base64 representation of image. Additionally, if signature image is requested, response will contain an array of all signatures. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/get/concatenated-images \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "images": [] }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/concatenated-images", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "images": [] }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/get/concatenated-images", headers=headers, json={ "images": [] }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/concatenated-images")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"images\": []\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/get-conference-feedback` - URL: https://developer.incode.com/api-reference/get-conference-feedback/ - Markdown: https://developer.incode.com/api-reference/get-conference-feedback.md - Endpoint: `GET /omni/get/conference/feedback` # Fetch conference feedback `GET /omni/get/conference/feedback` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used for fetching conference feedback for the interview/session. Works with Admin Token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | ID of interview. If omitted the interview ID from token is used (current session) | | `api-version` | header | string | yes | | ## Responses ### 200 conferenceFeedback: String. Feedback saved for interview. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/conference/feedback \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/conference/feedback", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/conference/feedback", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/conference/feedback")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/get-conference-notes` - URL: https://developer.incode.com/api-reference/get-conference-notes/ - Markdown: https://developer.incode.com/api-reference/get-conference-notes.md - Endpoint: `GET /omni/get/conference/notes` # Fetch notes `GET /omni/get/conference/notes` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used for fetching conference notes for interview/session. Works with Admin Token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | ID of interview. If omitted, the interview ID from teh token is used (current session) | | `api-version` | header | string | yes | | ## Responses ### 200 notes: String. Notes saved for interview. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/conference/notes \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/conference/notes", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/conference/notes", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/conference/notes")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/get-conference-status` - URL: https://developer.incode.com/api-reference/get-conference-status/ - Markdown: https://developer.incode.com/api-reference/get-conference-status.md - Endpoint: `GET /omni/get/conference-status` # Fetch conference status `GET /omni/get/conference-status` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns data about conference session for given ID. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | | ID of onboarding for which data is requested. If not present, it will be extracted from the token. | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `conferenceStatus` | string | | Enum: `NO_CONFERENCE`, `APPROVED`, `REJECTED`, `ABANDONED`, `NEEDS_REVIEW`, `REJECTED_BY_RISK`, `COMPLETED` | | `executiveId` | string | | | | `conferenceStartTime` | integer (int64) | | UTC timestamp | | `conferenceEndTime` | integer (int64) | | UTC timestamp | | `conferenceDuration` | integer (int64) | | Conference duration in milliseconds. | | `conferenceTermAndConditionsAccepted` | boolean | | | | `creditBureauConsentGiven` | boolean | | | | `applicantDataConfirmed` | boolean | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/conference-status \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/conference-status", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/conference-status", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/conference-status")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "conferenceStatus": "NO_CONFERENCE", "executiveId": "string", "conferenceStartTime": 0, "conferenceEndTime": 0, "conferenceDuration": 0, "conferenceTermAndConditionsAccepted": true, "creditBureauConsentGiven": true, "applicantDataConfirmed": true } ``` --- - Path: `api-reference/get-contracts-links` - URL: https://developer.incode.com/api-reference/get-contracts-links/ - Markdown: https://developer.incode.com/api-reference/get-contracts-links.md - Endpoint: `GET /omni/get/contracts-links` # Get contracts links `GET /omni/get/contracts-links` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetches temporary link of the contracts uploaded for the current session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `additionalInformation` | object | | | ```json { "success": true, "sessionStatus": "Alive", "additionalInformation": { "document ID1": "Temporary URL to uploaded document with ID1", "document ID2": "Temporary URL to uploaded document with ID2", "document ID3": "Temporary URL to uploaded document with ID3" } } ``` ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/contracts-links \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/contracts-links", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/contracts-links", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/contracts-links")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "additionalInformation": { "document ID1": "Temporary URL to uploaded document with ID1", "document ID2": "Temporary URL to uploaded document with ID2", "document ID3": "Temporary URL to uploaded document with ID3" } } ``` --- - Path: `api-reference/get-custom-fields` - URL: https://developer.incode.com/api-reference/get-custom-fields/ - Markdown: https://developer.incode.com/api-reference/get-custom-fields.md - Endpoint: `GET /omni/get/custom-fields` # Get custom fields `GET /omni/get/custom-fields` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used for fetching custom fields for current session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `customFields` | object | | Map. Map of custom fields with type that was inserted. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/custom-fields \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/custom-fields", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/custom-fields", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/custom-fields")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "customFields": {} } ``` --- - Path: `api-reference/get-device-info` - URL: https://developer.incode.com/api-reference/get-device-info/ - Markdown: https://developer.incode.com/api-reference/get-device-info.md - Endpoint: `GET /omni/get/device-info` # Fetch device info `GET /omni/get/device-info` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch information about device user was using during onboarding ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Represents interview id for which device data are requested. If it is not present it will be read from token. | | `returnData` | query | boolean | | If it is set to true, string representation of map which contains all data that enters the hash will be returned. | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `ipAddress` | string | | IP address of the device from which onboarding is being executed. | | `hash` | string | | Hash is generated out of data specific to user device and browser: userAgent, webdriver, language, colorDepth, deviceMemory, hardwareConcurrency, screenResolution, availableScreenResolution, timezoneOffset, timezone, sessionStorage, localStorage, indexedDb, cpuClass, platform, plugins, canvas, webgl, webglVendorAndRenderer, adBlock, hasLiedLanguages, hasLiedResolution, hasLiedOs, hasLiedBrowser, touchSupport, fonts, audio. | | `deviceType` | string | | Device type Enum: `IOS`, `ANDROID`, `WEBAPP` | | `osVersion` | string | | | | `deviceModel` | string | | | | `sdkVersion` | string | | | | `browser` | string | | | | `hasLiedBrowser` | boolean | | | | `longitude` | number (float) | | User's geolocation longitude. | | `latitude` | number (float) | | User's geolocation latitude. | | `location` | string | | User's location at the moment of onboarding process. | | `getmAdminArea` | string | | State | | `getmSubAdminArea` | string | | County | | `getmLocality` | string | | City | | `getmSubLocality` | string | | Neighborhood, common name | | `getmThoroughfare` | string | | Street name. | | `getmSubThoroughfare` | string | | Number. | | `getmPostalCode` | string | | Zip code | | `getmCountryCode` | string | | Country code | | `getmCountryName` | string | | Country name | | `hostingApp` | string | | Hosting App | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/device-info \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/device-info", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/device-info", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/device-info")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "ipAddress": "string", "hash": "string", "deviceType": "IOS", "osVersion": "string", "deviceModel": "string", "sdkVersion": "string", "browser": "string", "hasLiedBrowser": true, "longitude": 0, "latitude": 0, "location": "string", "getmAdminArea": "CA", "getmSubAdminArea": "Santa Clara", "getmLocality": "string", "getmSubLocality": "Mission District", "getmThoroughfare": "string", "getmSubThoroughfare": "string", "getmPostalCode": 95014, "getmCountryCode": "US", "getmCountryName": "United States", "hostingApp": "Onboarding" } ``` --- - Path: `api-reference/get-email` - URL: https://developer.incode.com/api-reference/get-email/ - Markdown: https://developer.incode.com/api-reference/get-email.md - Endpoint: `GET /omni/get/email` # Get email `GET /omni/get/email` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Get email from interview previously added via [Add email](ref:addemail) endpoint ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `email` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/email \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/email", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/email", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/email")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "email": "string" } ``` --- - Path: `api-reference/get-fingerprints` - URL: https://developer.incode.com/api-reference/get-fingerprints/ - Markdown: https://developer.incode.com/api-reference/get-fingerprints.md - Endpoint: `GET /omni/get/fingerprints` # Get Fingerprints `GET /omni/get/fingerprints` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used for fetching fingerprints for current session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `type` | integer (int32) | | | | `fingerprints` | array[Fingerprint] | yes | | | `fingerprints.index` | integer (int32) | | | | `fingerprints.base64Fingerprint` | string | | | | `fingerprints.fingerprintMetadata` | FingerprintMetadata | | | | `fingerprints.fingerprintMetadata.device` | string | | | | `fingerprints.fingerprintMetadata.resolution` | string | | | | `fingerprints.fingerprintMetadata.qualityScore` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/fingerprints \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/fingerprints", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/fingerprints", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/fingerprints")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "type": 0, "fingerprints": [ { "index": 0, "base64Fingerprint": "string", "fingerprintMetadata": { "device": "string", "resolution": "string", "qualityScore": "string" } } ] } ``` --- - Path: `api-reference/get-id-summary` - URL: https://developer.incode.com/api-reference/get-id-summary/ - Markdown: https://developer.incode.com/api-reference/get-id-summary.md - Endpoint: `GET /omni/get/id-summary` # Get ID Summary `GET /omni/get/id-summary` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns success information about addFront and addBack. Also returns onlyFront flag. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Id of onboarding for which data are requested. If not present, it will be extracted from token. | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `onlyFront` | boolean | | | | `addFrontResult` | IdSummaryDocumentSideResult | | | | `addFrontResult.classification` | boolean | | | | `addFrontResult.readability` | boolean | | | | `addFrontResult.sharpness` | integer (int32) | | | | `addFrontResult.glare` | integer (int32) | | | | `addBackResult` | IdSummaryDocumentSideResult | | | | `addBackResult.classification` | boolean | | | | `addBackResult.readability` | boolean | | | | `addBackResult.sharpness` | integer (int32) | | | | `addBackResult.glare` | integer (int32) | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/id-summary \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/id-summary", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/id-summary", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/id-summary")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "onlyFront": true, "addFrontResult": { "classification": true, "readability": true, "sharpness": 0, "glare": 0 }, "addBackResult": { "classification": true, "readability": true, "sharpness": 0, "glare": 0 } } ``` --- - Path: `api-reference/get-images` - URL: https://developer.incode.com/api-reference/get-images/ - Markdown: https://developer.incode.com/api-reference/get-images.md - Endpoint: `POST /omni/get/images` # Fetch images `POST /omni/get/images` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns images for user ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Id of onboarding for which images are requested. If not present, it will be extracted from token. | | `api-version` | header | string | yes | | ## Request body Image types that are requested. It is strongly advised to fetch one image at the time, as response payload can be potentially big Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `images` | array[string] | yes | | ## Responses ### 200 For each requested image type, response contains line in format: {imageType}: String (base64) Base64 representation of image. Additionally, if signature image is requested, response will contain an array of all signatures. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/get/images \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "images": [] }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/images", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "images": [] }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/get/images", headers=headers, json={ "images": [] }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/images")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"images\": []\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/get-images-second-id` - URL: https://developer.incode.com/api-reference/get-images-second-id/ - Markdown: https://developer.incode.com/api-reference/get-images-second-id.md - Endpoint: `POST /omni/get/images-second-id` # Fetch images second id `POST /omni/get/images-second-id` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns images for second id of user ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Id of onboarding for which images are requested. If not present, it will be extracted from token. | | `api-version` | header | string | yes | | ## Request body Image types that are requested. It is strongly advised to fetch one image at the time, as response payload can be potentially big Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `images` | array[string] | yes | | ## Responses ### 200 For each requested image type, response contains line in format: {imageType}: String (base64) Base64 representation of image. Additionally, if signature image is requested, response will contain an array of all signatures. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/get/images-second-id \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "images": [] }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/images-second-id", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "images": [] }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/get/images-second-id", headers=headers, json={ "images": [] }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/images-second-id")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"images\": []\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/get-images-second-id-v2` - URL: https://developer.incode.com/api-reference/get-images-second-id-v2/ - Markdown: https://developer.incode.com/api-reference/get-images-second-id-v2.md - Endpoint: `POST /omni/get/images-second-id/v2` # Fetch image links for second id `POST /omni/get/images-second-id/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns seconnd id images temporary links for requested images. Links are valid for one hour ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `images` | array[string] | yes | | ## Responses ### 200 For each requested image type, response contains line in format: {imageType}: String (base64). Base64 representation of image. Additionally, if signature image is requested, response will contain an array of all signatures. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/get/images-second-id/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "images": [] }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/images-second-id/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "images": [] }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/get/images-second-id/v2", headers=headers, json={ "images": [] }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/images-second-id/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"images\": []\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/get-images-v2` - URL: https://developer.incode.com/api-reference/get-images-v2/ - Markdown: https://developer.incode.com/api-reference/get-images-v2.md - Endpoint: `POST /omni/get/images/v2` # Fetch image links `POST /omni/get/images/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns images temporary links for requested images. Links are valid for one hour ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Id of onboarding for which images are requested. If not present, it will be extracted from token | | `api-version` | header | string | yes | | ## Request body Image types that are requested Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `images` | array[string] | yes | | ## Responses ### 200 For each requested image type, response contains line in format: {imageType}: String (base64). Base64 representation of image. Additionally, if signature image is requested, response will contain an array of all signatures. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/get/images/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "images": [] }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/images/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "images": [] }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/get/images/v2", headers=headers, json={ "images": [] }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/images/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"images\": []\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/get-imss` - URL: https://developer.incode.com/api-reference/get-imss/ - Markdown: https://developer.incode.com/api-reference/get-imss.md - Endpoint: `GET /omni/get/imss` # Fetch IMSS labor history `GET /omni/get/imss` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch user's labor history from IMSS. Interview id is extracted from jwt token. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewId` | string | | | | `requestId` | string | | | | `workHistory` | WorkHistoryDto | | | | `workHistory.name` | string | | | | `workHistory.curp` | string | | | | `workHistory.apiKey` | string | | | | `workHistory.nss` | string | | | | `workHistory.quotedWeeks` | QuotedWeeksDto | | | | `workHistory.quotedWeeks.discountedWeeks` | integer (int32) | | | | `workHistory.quotedWeeks.listedWeeks` | integer (int32) | | | | `workHistory.quotedWeeks.reinstatedWeeks` | integer (int32) | | | | `workHistory.laborHistoryList` | array[LaborHistory] | | | | `workHistory.laborHistoryList.nombrePatron` | string | | | | `workHistory.laborHistoryList.entidadFederativa` | string | | | | `workHistory.laborHistoryList.fechaAlta` | string | | | | `workHistory.laborHistoryList.fechaBaja` | string | | | | `workHistory.laborHistoryList.salarioBaseCotizacion` | string | | | | `workHistory.laborHistoryList.registroPatronal` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/imss \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/imss", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/imss", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/imss")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "interviewId": "string", "requestId": "string", "workHistory": { "name": "string", "curp": "string", "apiKey": "string", "nss": "string", "quotedWeeks": { "discountedWeeks": 0, "listedWeeks": 0, "reinstatedWeeks": 0 }, "laborHistoryList": [ { "nombrePatron": "string", "entidadFederativa": "string", "fechaAlta": "string", "fechaBaja": "string", "salarioBaseCotizacion": "string", "registroPatronal": "string" } ] } } ``` --- - Path: `api-reference/get-interviewer-info` - URL: https://developer.incode.com/api-reference/get-interviewer-info/ - Markdown: https://developer.incode.com/api-reference/get-interviewer-info.md - Endpoint: `GET /omni/get/interviewer-info` # Connect to conference call `GET /omni/get/interviewer-info` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Get interviewer name for given interview ID read from token. If the interviewer is not yet assigned to interview, null will be returned. This method also returns credentials for OpenTok session. It is recommended to call this method after [Get-user's-position](#/Conference/getQueueIndex) returns 0 in response. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewerName` | string | | The name of the executive who is on a conference call with the user. | | `apiKey` | integer (int32) | | Used for establishing a conference connection via OpenTok. | | `interviewToken` | string | | Used for establishing a conference connection via OpenTok. | | `sessionId` | string | | Used for establishing a conference connection via OpenTok. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/interviewer-info \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/interviewer-info", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/interviewer-info", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/interviewer-info")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "interviewerName": "string", "apiKey": 0, "interviewToken": "string", "sessionId": "string" } ``` --- - Path: `api-reference/get-ocr-data` - URL: https://developer.incode.com/api-reference/get-ocr-data/ - Markdown: https://developer.incode.com/api-reference/get-ocr-data.md - Endpoint: `GET /omni/get/ocr-data` # Fetch ocr data `GET /omni/get/ocr-data` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns data about user read from id and address statement. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Id of onboarding for which data are requested. If not present, it will be extracted from token. | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | NameBean | | | | `name.fullName` | string | | | | `name.fullNameNativeScript` | string | | | | `name.firstNameNativeScript` | string | | | | `name.paternalLastNameNativeScript` | string | | | | `name.maternalLastNameNativeScript` | string | | | | `name.machineReadableFullName` | string | | Full name from Barcode or MRZ | | `name.firstName` | string | | | | `name.middleName` | string | | | | `name.givenName` | string | | | | `name.givenNameMrz` | string | | | | `name.initials` | string | | Initials as returned by bank-ID schemes (e.g. iDIN) — the only given-name evidence they provide | | `name.nameSuffix` | string | | | | `name.paternalLastName` | string | | | | `name.maternalLastName` | string | | | | `name.lastNameMrz` | string | | | | `name.familyName` | string | | | | `address` | string | | Address as read from id. Address can have two or three lines. Lines are separated by \\n | | `addressFields` | AddressBean | | | | `addressFields.street` | string | | Street line in the way it is read from address string. | | `addressFields.streetName` | string | | Street name without exterior and interior numbers. | | `addressFields.colony` | string | | Colony line the way it is read from address string. (Not applicable for all countries) | | `addressFields.postalCode` | string | | Postal code in the way it is read from address string. | | `addressFields.city` | string | | City in the way it is read from address string. | | `addressFields.state` | string | | State in the way it is read from address string. | | `addressFields.stateName` | string | | Full StateName. | | `addressFields.district` | string | | District in the way it is read from address string. | | `addressFields.stateCode` | string | | State code if applicable. | | `addressFields.addressCountryCode` | string | | Address country code if applicable. | | `addressFields.label` | string | | Full address label. | | `addressFields.exteriorNumber` | string | | Exterior street number. | | `addressFields.interiorNumber` | string | | Interior street number. | | `addressFields.addressLine1` | string | | The primary line in the address that contains the most essential details for locating a place. | | `addressFields.streetType` | string | | Street type | | `fullAddress` | boolean | | This field is set to true if address from id is full (has three lines) or not (For Mexican Voter IDs only). | | `invalidAddress` | boolean | | This field checks for a valid street, numeric postal code with 5 digits, and that both colony and city have values. (Only checked for Mexican IDs) | | `checkedAddress` | string | | Address as obtained after processing with geocoder geolocation api. | | `checkedAddressBean` | AddressBean | | | | `checkedAddressBean.street` | string | | Street line in the way it is read from address string. | | `checkedAddressBean.streetName` | string | | Street name without exterior and interior numbers. | | `checkedAddressBean.colony` | string | | Colony line the way it is read from address string. (Not applicable for all countries) | | `checkedAddressBean.postalCode` | string | | Postal code in the way it is read from address string. | | `checkedAddressBean.city` | string | | City in the way it is read from address string. | | `checkedAddressBean.state` | string | | State in the way it is read from address string. | | `checkedAddressBean.stateName` | string | | Full StateName. | | `checkedAddressBean.district` | string | | District in the way it is read from address string. | | `checkedAddressBean.stateCode` | string | | State code if applicable. | | `checkedAddressBean.addressCountryCode` | string | | Address country code if applicable. | | `checkedAddressBean.label` | string | | Full address label. | | `checkedAddressBean.exteriorNumber` | string | | Exterior street number. | | `checkedAddressBean.interiorNumber` | string | | Interior street number. | | `checkedAddressBean.addressLine1` | string | | The primary line in the address that contains the most essential details for locating a place. | | `checkedAddressBean.streetType` | string | | Street type | | `exteriorNumber` | string | | Exterior street number. | | `interiorNumber` | string | | Interior street number. | | `addressFromStatement` | string | | Address as read from address statement. Lines are separated by \\n. | | `addressFieldsFromStatement` | AddressBean | | | | `addressFieldsFromStatement.street` | string | | Street line in the way it is read from address string. | | `addressFieldsFromStatement.streetName` | string | | Street name without exterior and interior numbers. | | `addressFieldsFromStatement.colony` | string | | Colony line the way it is read from address string. (Not applicable for all countries) | | `addressFieldsFromStatement.postalCode` | string | | Postal code in the way it is read from address string. | | `addressFieldsFromStatement.city` | string | | City in the way it is read from address string. | | `addressFieldsFromStatement.state` | string | | State in the way it is read from address string. | | `addressFieldsFromStatement.stateName` | string | | Full StateName. | | `addressFieldsFromStatement.district` | string | | District in the way it is read from address string. | | `addressFieldsFromStatement.stateCode` | string | | State code if applicable. | | `addressFieldsFromStatement.addressCountryCode` | string | | Address country code if applicable. | | `addressFieldsFromStatement.label` | string | | Full address label. | | `addressFieldsFromStatement.exteriorNumber` | string | | Exterior street number. | | `addressFieldsFromStatement.interiorNumber` | string | | Interior street number. | | `addressFieldsFromStatement.addressLine1` | string | | The primary line in the address that contains the most essential details for locating a place. | | `addressFieldsFromStatement.streetType` | string | | Street type | | `invalidAddressFromStatement` | boolean | | This field checks for a valid street, numeric postal code with 5 digits, and tha both colony and city have values. (Only checked for Mexican POA) | | `addressStatementEmissionDate` | integer (int64) | | Issue date of address statement. The value is presented in UTC milliseconds. | | `documentType` | string | | Type of address statement document. Possible values: - Mexico: liverpool, citibanamex, cfe, telcel, izzi, axtel, telmex, oapas, sacmex, opdm, naturgy, drenaje, totalplay, dhc, att, cea, smapa, megacable, jmas, amicsa, caev - Bolivia: cre - Uruguay: ute - Unknown document: otherPoa Enum: `a1`, `aggm`, `apg`, `energieAg`, `cre`, `aforeAzteca`, `amd`, `amicsa`, `att`, `axtel`, `bancoppel`, `bancoAzteca`, `banorte`, `bbva`, `cab`, `caev`, `capa`, `cea`, `cfe`, `citibanamex`, `cmapa`, `cmapaGrande`, `cmapas`, `cmas`, `cmasBlue`, `comapa`, `comapaRed`, `coppel`, `dapa`, `dhc`, `drenaje`, `ecogas`, `engie`, `gasNatural`, `h`, `hsbc`, `inbursa`, `infonavit`, `interapas`, `isagas`, `izzi`, `jad`, `japam`, `japama`, `japami`, `japay`, `jiapaz`, `jmas`, `jras`, `jumapac`, `jumapam`, `lerdo`, `liverpool`, `mas`, `megacable`, `naturgy`, `oapas`, `odapas`, `ooapas`, `opdm`, `oroapa`, `sacmex`, `sacmexCdmx`, `santander`, `sapa`, `sapal`, `sapamuy`, `sapasa`, `sapasma`, `scotiabank`, `seapal`, `siapa`, `simapag`, `simapas`, `simas`, `smapa`, `smapac`, `smapam`, `smapas`, `spectrum`, `stori`, `sura`, `tam`, `telcel`, `telmex`, `totalplay`, `veolia`, `victoria`, `wizz`, `asylumSeeker`, `refugeeId`, `refugeeStatus`, `ute`, `telkom`, `tmobile`, `verizon`, `xfinity`, `aforeCoppel`, `americanExpress`, `ap`, `telnor`, `wellsFargo`, `otherPoa` | | `addressStatementTimestamps` | array[AddressStatementDate] | | | | `addressStatementTimestamps.get_version` | integer (int64) | | | | `addressStatementTimestamps.dateType` | string | | Description of timestamp. | | `addressStatementTimestamps.addressStatementTimestamp` | integer (int64) | | UTC timestamp. | | `poaName` | string | | Extracted name from address statement. | | `typeOfId` | string | | Enum: `Unknown`, `Passport`, `Visa`, `DriversLicense`, `IdentificationCard`, `Permit`, `Currency`, `ResidenceDocument`, `TravelDocument`, `BirthCertificate`, `VehicleRegistration`, `Other`, `WeaponLicense`, `TribalIdentification`, `VoterIdentification`, `Military`, `TaxIdentification`, `FederalID`, `MedicalCard` | | `documentFrontSubtype` | string | | Additional info about ID type (front side) | | `documentBackSubtype` | string | | Additional info about ID type (back side) | | `issueFront` | integer (int32) | | Issue year (per classification model) of the ID (front side) | | `issueBack` | integer (int32) | | Issue year (per classification model) of the ID (back side) | | `birthDate` | integer (int64) | | Date of birth is presented in UTC milliseconds. | | `gender` | string | | Gender values are presented in English. "M" for male, "F" for female and "X" for non-binary. Enum: `M`, `F`, `X` | | `claveDeElector` | string | | Clave de elector as read from id. For Mexican IDs only. | | `curp` | string | | Curp as read form id. For Mexican IDs only. | | `numeroEmisionCredencial` | string | | Numero Emision Credencial as read from id. (For Mexican IDs only). | | `cic` | string | | Cic as read from id. (This field is read from back side of id; For Mexican IDs only). | | `ocr` | string | | Ocr as read from id. (This field is read from back side of id; For Mexican IDs only). | | `documentNumber` | string | | Document number. | | `documentNumberSource` | string | | Document number source. Enum: `FORM`, `OCR` | | `personalNumber` | string | | Personal number. | | `nationalNumber` | string | | National number. | | `refNumber` | string | | Document Reference Number. | | `taxIdNumber` | string | | Personal tax identification number. | | `nue` | string | | NUE number as read from id. (for Resident Cards) | | `externalId` | string | | External user id. | | `issuedAt` | string | | Date of issue UTC timestamp. | | `expireAt` | string | | Expiration date UTC timestamp. | | `expirationDate` | integer (int32) | | Expiration year of id. | | `issueDate` | integer (int32) | | Issue year of id. | | `registrationDate` | integer (int32) | | Registration date read from id. | | `dlClassDetails` | array[DLClassDetails] | | | | `dlClassDetails.dlClass` | string | | Driver's license class. | | `dlClassDetails.validFromDate` | integer (int64) | | DL class valid from UTC timestamp | | `dlClassDetails.validToDate` | integer (int64) | | DL class valid to UTC timestamp. | | `dlClassDetails.additionalCodes` | string | | Additional codes associated with DL class. | | `dlClassDetails.restrictions` | array[string] | | Restriction codes associated with DL class. | | `issuingCountry` | string | | Issuing country of document. | | `issuingState` | string | | Issuing state of document. | | `birthPlace` | string | | Birth place as read from id. | | `printingNumber` | string | | Printing number (número de impresión) printed below the barcode on Colombian IDs. | | `duplicateNumber` | string | | Number of duplicates (número de duplicados) printed below the barcode on Colombian IDs. | | `preparationNumber` | string | | Preparation number (número de preparación) printed below the barcode on Colombian IDs. | | `issuingAuthority` | string | | Issuing Authority as read from id. | | `height` | string | | Person's height as read from id. | | `weight` | string | | Person's weight. | | `eyeColor` | string | | Person's eye color. | | `hairColor` | string | | Person's hair color. | | `religion` | string | | Person's religion. | | `bloodType` | string | | Person's blood type. | | `maritalStatus` | string | | Person's marital status. | | `nationality` | string | | Person's nationality. | | `race` | string | | Person's race. | | `nationalityMrz` | string | | Person's nationality as it appears in MRZ (if present). | | `nationalityAlpha3` | string | | Person's nationality Alpha3 code format. Only for Brazilian IDs. | | `governmentComparisonResults` | GovernmentComparisonResults | | Government validation data. Only for supported government validation countries. | | `governmentComparisonResults.paternalLastNameValid` | boolean | | Indicates validity of person's paternal last name through government validation apis. | | `governmentComparisonResults.maternalLastNameValid` | boolean | | Indicates validity of person's maternal last name through government validation apis. | | `governmentComparisonResults.firstNameValid` | boolean | | Indicates validity of person's first name through government validation apis. | | `governmentComparisonResults.curpValid` | boolean | | Indicates CURP validity through RENAPO/CURP provider validation. | | `governmentComparisonResults.ineCurpValid` | boolean | | Indicates CURP validity through INE government validation (separate from RENAPO). | | `governmentComparisonResults.ocrValid` | boolean | | Indicates ocr validity through government validation apis. | | `governmentComparisonResults.claveDeElectorValid` | boolean | | Indicates "clave de elector" validity through government validation apis. | | `governmentComparisonResults.numeroEmisionCredencialValid` | boolean | | Indicates "numero emision credencial" validity through government validation apis. | | `governmentComparisonResults.registrationDateValid` | boolean | | Indicates registration date validity through government validation apis. | | `governmentComparisonResults.issueDateValid` | boolean | | Indicates issue date validity through government validation apis. | | `notExtracted` | integer (int32) | | Number of not extracted OCR fields. Only for Mexican IDs. | | `notExtractedDetails` | array[string] | | | | `classes` | string | | Person's driver licence classes. | | `cond` | string | | Person's driver licence conditions. | | `mentions` | string | | Person's driver licence mentions. | | `restrictions` | string | | Person's driver licence restrictions. | | `mrz1` | string | | First MRZ line. | | `mrz2` | string | | Second MRZ line. | | `mrz3` | string | | Third MRZ line. | | `fullNameMrz` | string | | Person's full name read from MRZ. | | `documentNumberCheckDigit` | string | | Document number check digit read from MRZ. | | `dateOfBirthCheckDigit` | string | | Date of birth check digit read from MRZ. | | `expirationDateCheckDigit` | string | | Expiration date check digit read from MRZ. | | `barcodeRawData` | string | | Full unformatted data read from 2D barcode. | | `fathersName` | string | | Person's father's name. Only for Brazilian and Indian IDs. | | `mothersName` | string | | Person's mother's name. Only for Brazilian IDs. | | `fathersIdNumber` | string | | Person's father's Id Number. In the context of minors identity validation. | | `mothersIdNumber` | string | | Person's mother's Id Number. In the context of minors identity validation. | | `spouseName` | string | | Person's spouse's name. | | `federalRevenueNumber` | string | | Federal revenue number. Only for Brazilian IDs. | | `originDocumentId` | string | | Origin document ID. Only for Brazilian IDs. | | `driversLicenseCategory` | string | | Driver's licence category. Only for Brazilian IDs. | | `controlNumber` | string | | Control number. Only for Brazilian IDs. | | `renach` | string | | Renach. Only for Brazilian IDs. | | `additionalAttrs` | array[string] | | Additional document attributes. | | `ocrDataConfidence` | OcrDataConfidence | | Structure containing ocr reliability confidence for each extracted ocr field. Confidence values are Floats between 0 and 1. | | `ocrDataConfidence.birthDateConfidence` | number (float) | | | | `ocrDataConfidence.nameConfidence` | number (float) | | | | `ocrDataConfidence.nameNativeScriptConfidence` | number (float) | | | | `ocrDataConfidence.firstNameNativeScriptConfidence` | number (float) | | | | `ocrDataConfidence.paternalLastNameNativeScriptConfidence` | number (float) | | | | `ocrDataConfidence.maternalLastNameNativeScriptConfidence` | number (float) | | | | `ocrDataConfidence.givenNameConfidence` | number (float) | | | | `ocrDataConfidence.firstNameConfidence` | number (float) | | | | `ocrDataConfidence.middleNameConfidence` | number (float) | | | | `ocrDataConfidence.nameSuffixConfidence` | number (float) | | | | `ocrDataConfidence.mothersSurnameConfidence` | number (float) | | | | `ocrDataConfidence.fathersSurnameConfidence` | number (float) | | | | `ocrDataConfidence.nickNameConfidence` | number (float) | | | | `ocrDataConfidence.fullNameMrzConfidence` | number (float) | | | | `ocrDataConfidence.mothersNameConfidence` | number (float) | | | | `ocrDataConfidence.fathersNameConfidence` | number (float) | | | | `ocrDataConfidence.mothersIdNumberConfidence` | number (float) | | | | `ocrDataConfidence.fathersIdNumberConfidence` | number (float) | | | | `ocrDataConfidence.spouseNameConfidence` | number (float) | | | | `ocrDataConfidence.birthNameConfidence` | number (float) | | | | `ocrDataConfidence.addressConfidence` | number (float) | | | | `ocrDataConfidence.streetConfidence` | number (float) | | | | `ocrDataConfidence.colonyConfidence` | number (float) | | | | `ocrDataConfidence.postalCodeConfidence` | number (float) | | | | `ocrDataConfidence.cityConfidence` | number (float) | | | | `ocrDataConfidence.stateConfidence` | number (float) | | | | `ocrDataConfidence.districtConfidence` | number (float) | | | | `ocrDataConfidence.stateCodeConfidence` | number (float) | | | | `ocrDataConfidence.countryCodeConfidence` | number (float) | | | | `ocrDataConfidence.genderConfidence` | number (float) | | | | `ocrDataConfidence.issueDateConfidence` | number (float) | | | | `ocrDataConfidence.expirationDateConfidence` | number (float) | | | | `ocrDataConfidence.issuedAtConfidence` | number (float) | | | | `ocrDataConfidence.expireAtConfidence` | number (float) | | | | `ocrDataConfidence.issuingAuthorityConfidence` | number (float) | | | | `ocrDataConfidence.mrz1Confidence` | number (float) | | | | `ocrDataConfidence.mrz2Confidence` | number (float) | | | | `ocrDataConfidence.mrz3Confidence` | number (float) | | | | `ocrDataConfidence.mrzFullConfidence` | number (float) | | | | `ocrDataConfidence.documentNumberConfidence` | number (float) | | | | `ocrDataConfidence.backNumberConfidence` | number (float) | | | | `ocrDataConfidence.personalNumberConfidence` | number (float) | | | | `ocrDataConfidence.nationalNumberConfidence` | number (float) | | | | `ocrDataConfidence.claveDeElectorConfidence` | number (float) | | | | `ocrDataConfidence.numeroEmisionCredencialConfidence` | number (float) | | | | `ocrDataConfidence.curpConfidence` | number (float) | | | | `ocrDataConfidence.nueConfidence` | number (float) | | | | `ocrDataConfidence.registrationDateConfidence` | number (float) | | | | `ocrDataConfidence.heightConfidence` | number (float) | | | | `ocrDataConfidence.birthPlaceConfidence` | number (float) | | | | `ocrDataConfidence.bloodTypeConfidence` | number (float) | | | | `ocrDataConfidence.eyeColorConfidence` | number (float) | | | | `ocrDataConfidence.classesConfidence` | number (float) | | | | `ocrDataConfidence.condConfidence` | number (float) | | | | `ocrDataConfidence.mentionsConfidence` | number (float) | | | | `ocrDataConfidence.refNumberConfidence` | number (float) | | | | `ocrDataConfidence.weightConfidence` | number (float) | | | | `ocrDataConfidence.hairConfidence` | number (float) | | | | `ocrDataConfidence.restrictionsConfidence` | number (float) | | | | `ocrDataConfidence.nationalityConfidence` | number (float) | | | | `ocrDataConfidence.nationalityMrzConfidence` | number (float) | | | | `ocrDataConfidence.nationalityAlpha3Confidence` | number (float) | | | | `ocrDataConfidence.maritalStatusConfidence` | number (float) | | | | `ocrDataConfidence.raceConfidence` | number (float) | | | | `ocrDataConfidence.taxIdNumberConfidence` | number (float) | | | | `ocrDataConfidence.jurisdictionCodeConfidence` | number (float) | | | | `additionalDocumentAttempts` | array[AdditionalDocumentAttemptDto] | | | | `additionalDocumentAttempts.status` | string | | Enum: `SUCCESS`, `VALIDATION_ERROR`, `FAIL` | | `additionalDocumentAttempts.attemptTimestamp` | integer (int64) | | | | `additionalDocumentAttempts.imagesUrl` | array[string] | | | | `additionalDocumentAttempts.attemptType` | string | | Enum: `POA`, `DOCUMENT_CAPTURE` | | `additionalDocumentAttempts.antiSpoofResult` | PoaAntiSpoofResult | | | | `additionalDocumentAttempts.antiSpoofResult.status` | string | | Enum: `PASS`, `FAIL`, `NOT_EXECUTED` | | `additionalDocumentAttempts.antiSpoofResult.kinds` | array[string] | | | | `additionalDocumentAttempts.antiSpoofResult.confidence` | number (float) | | | | `additionalDocumentAttempts.antiSpoofResult.details` | array[Detail] | | | | `additionalDocumentAttempts.antiSpoofResult.details.kind` | string | | | | `additionalDocumentAttempts.antiSpoofResult.details.error` | string | | | | `additionalDocumentAttempts.antiSpoofResult.details.loc` | string | | | | `additionalDocumentAttempts.antiSpoofResult.details.explanation` | string | | | | `additionalDocumentAttempts.documentType` | string | yes | | | `documentSubmissionMethod` | string | | Method used to submit the document. Enum: `CAPTURED_DOCUMENT`, `UPLOADED_FILE`, `IMPORTED_CREDENTIAL` | | `credentialsProvider` | string | | Credentials provider used when documentSubmissionMethod is IMPORTED_CREDENTIAL. Enum: `APPLE`, `GOOGLE`, `DIGILOCKER`, `SAMSUNG`, `TRINSIC`, `NETHERLANDS_IDIN`, `FINNISH_TRUST_NETWORK` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/ocr-data \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/ocr-data", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/ocr-data", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/ocr-data")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "name": { "fullName": "string", "fullNameNativeScript": "string", "firstNameNativeScript": "string", "paternalLastNameNativeScript": "string", "maternalLastNameNativeScript": "string", "machineReadableFullName": "string", "firstName": "string", "middleName": "string", "givenName": "string", "givenNameMrz": "string", "initials": "string", "nameSuffix": "string", "paternalLastName": "string", "maternalLastName": "string", "lastNameMrz": "string", "familyName": "string" }, "address": "string", "addressFields": { "street": "string", "streetName": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string", "exteriorNumber": "string", "interiorNumber": "string", "addressLine1": "string", "streetType": "string" }, "fullAddress": true, "invalidAddress": true, "checkedAddress": "string", "checkedAddressBean": { "street": "string", "streetName": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string", "exteriorNumber": "string", "interiorNumber": "string", "addressLine1": "string", "streetType": "string" }, "exteriorNumber": "string", "interiorNumber": "string", "addressFromStatement": "string", "addressFieldsFromStatement": { "street": "string", "streetName": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string", "exteriorNumber": "string", "interiorNumber": "string", "addressLine1": "string", "streetType": "string" }, "invalidAddressFromStatement": true, "addressStatementEmissionDate": 0, "documentType": "a1", "addressStatementTimestamps": [ { "get_version": 0, "dateType": "string", "addressStatementTimestamp": 0 } ], "poaName": "string", "typeOfId": "Unknown", "documentFrontSubtype": "string", "documentBackSubtype": "string", "issueFront": 0, "issueBack": 0, "birthDate": 0, "gender": "M", "claveDeElector": "string", "curp": "string", "numeroEmisionCredencial": "string", "cic": "string", "ocr": "string", "documentNumber": "string", "documentNumberSource": "FORM", "personalNumber": "string", "nationalNumber": "string", "refNumber": "string", "taxIdNumber": "string", "nue": "string", "externalId": "string", "issuedAt": "string", "expireAt": "string", "expirationDate": 0, "issueDate": 0, "registrationDate": 0, "dlClassDetails": [ { "dlClass": "string", "validFromDate": 0, "validToDate": 0, "additionalCodes": "string", "restrictions": [ "string" ] } ], "issuingCountry": "string", "issuingState": "string", "birthPlace": "string", "printingNumber": "string", "duplicateNumber": "string", "preparationNumber": "string", "issuingAuthority": "string", "height": "string", "weight": "string", "eyeColor": "string", "hairColor": "string", "religion": "string", "bloodType": "string", "maritalStatus": "string", "nationality": "string", "race": "string", "nationalityMrz": "string", "nationalityAlpha3": "string", "governmentComparisonResults": { "paternalLastNameValid": true, "maternalLastNameValid": true, "firstNameValid": true, "curpValid": true, "ineCurpValid": true, "ocrValid": true, "claveDeElectorValid": true, "numeroEmisionCredencialValid": true, "registrationDateValid": true, "issueDateValid": true }, "notExtracted": 0, "notExtractedDetails": [ "string" ], "classes": "string", "cond": "string", "mentions": "string", "restrictions": "string", "mrz1": "string", "mrz2": "string", "mrz3": "string", "fullNameMrz": "string", "documentNumberCheckDigit": "string", "dateOfBirthCheckDigit": "string", "expirationDateCheckDigit": "string", "barcodeRawData": "string", "fathersName": "string", "mothersName": "string", "fathersIdNumber": "string", "mothersIdNumber": "string", "spouseName": "string", "federalRevenueNumber": "string", "originDocumentId": "string", "driversLicenseCategory": "string", "controlNumber": "string", "renach": "string", "additionalAttrs": [ "DOCUMENTO_INFANTIL" ], "ocrDataConfidence": { "birthDateConfidence": 0, "nameConfidence": 0, "nameNativeScriptConfidence": 0, "firstNameNativeScriptConfidence": 0, "paternalLastNameNativeScriptConfidence": 0, "maternalLastNameNativeScriptConfidence": 0, "givenNameConfidence": 0, "firstNameConfidence": 0, "middleNameConfidence": 0, "nameSuffixConfidence": 0, "mothersSurnameConfidence": 0, "fathersSurnameConfidence": 0, "nickNameConfidence": 0, "fullNameMrzConfidence": 0, "mothersNameConfidence": 0, "fathersNameConfidence": 0, "mothersIdNumberConfidence": 0, "fathersIdNumberConfidence": 0, "spouseNameConfidence": 0, "birthNameConfidence": 0, "addressConfidence": 0, "streetConfidence": 0, "colonyConfidence": 0, "postalCodeConfidence": 0, "cityConfidence": 0, "stateConfidence": 0, "districtConfidence": 0, "stateCodeConfidence": 0, "countryCodeConfidence": 0, "genderConfidence": 0, "issueDateConfidence": 0, "expirationDateConfidence": 0, "issuedAtConfidence": 0, "expireAtConfidence": 0, "issuingAuthorityConfidence": 0, "mrz1Confidence": 0, "mrz2Confidence": 0, "mrz3Confidence": 0, "mrzFullConfidence": 0, "documentNumberConfidence": 0, "backNumberConfidence": 0, "personalNumberConfidence": 0, "nationalNumberConfidence": 0, "claveDeElectorConfidence": 0, "numeroEmisionCredencialConfidence": 0, "curpConfidence": 0, "nueConfidence": 0, "registrationDateConfidence": 0, "heightConfidence": 0, "birthPlaceConfidence": 0, "bloodTypeConfidence": 0, "eyeColorConfidence": 0, "classesConfidence": 0, "condConfidence": 0, "mentionsConfidence": 0, "refNumberConfidence": 0, "weightConfidence": 0, "hairConfidence": 0, "restrictionsConfidence": 0, "nationalityConfidence": 0, "nationalityMrzConfidence": 0, "nationalityAlpha3Confidence": 0, "maritalStatusConfidence": 0, "raceConfidence": 0, "taxIdNumberConfidence": 0, "jurisdictionCodeConfidence": 0 }, "additionalDocumentAttempts": [ { "status": "SUCCESS", "attemptTimestamp": 0, "imagesUrl": [ "string" ], "attemptType": "POA", "antiSpoofResult": { "status": "PASS", "kinds": [ "string" ], "confidence": 0, "details": [ { "kind": "string", "error": "string", "loc": "string", "explanation": "string" } ] }, "documentType": "string" } ], "documentSubmissionMethod": "CAPTURED_DOCUMENT", "credentialsProvider": "APPLE" } ``` --- - Path: `api-reference/get-ocr-data-second-id` - URL: https://developer.incode.com/api-reference/get-ocr-data-second-id/ - Markdown: https://developer.incode.com/api-reference/get-ocr-data-second-id.md - Endpoint: `GET /omni/get/ocr-data-second-id` # Fetch ocr data for second id `GET /omni/get/ocr-data-second-id` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns data about user read from the second id. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Id of onboarding for which data are requested. If not present, it will be extracted from token. | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | NameBean | | | | `name.fullName` | string | | | | `name.fullNameNativeScript` | string | | | | `name.firstNameNativeScript` | string | | | | `name.paternalLastNameNativeScript` | string | | | | `name.maternalLastNameNativeScript` | string | | | | `name.machineReadableFullName` | string | | Full name from Barcode or MRZ | | `name.firstName` | string | | | | `name.middleName` | string | | | | `name.givenName` | string | | | | `name.givenNameMrz` | string | | | | `name.initials` | string | | Initials as returned by bank-ID schemes (e.g. iDIN) — the only given-name evidence they provide | | `name.nameSuffix` | string | | | | `name.paternalLastName` | string | | | | `name.maternalLastName` | string | | | | `name.lastNameMrz` | string | | | | `name.familyName` | string | | | | `address` | string | | Address as read from id. Address can have two or three lines. Lines are separated by \\n | | `addressFields` | AddressBean | | | | `addressFields.street` | string | | Street line in the way it is read from address string. | | `addressFields.streetName` | string | | Street name without exterior and interior numbers. | | `addressFields.colony` | string | | Colony line the way it is read from address string. (Not applicable for all countries) | | `addressFields.postalCode` | string | | Postal code in the way it is read from address string. | | `addressFields.city` | string | | City in the way it is read from address string. | | `addressFields.state` | string | | State in the way it is read from address string. | | `addressFields.stateName` | string | | Full StateName. | | `addressFields.district` | string | | District in the way it is read from address string. | | `addressFields.stateCode` | string | | State code if applicable. | | `addressFields.addressCountryCode` | string | | Address country code if applicable. | | `addressFields.label` | string | | Full address label. | | `addressFields.exteriorNumber` | string | | Exterior street number. | | `addressFields.interiorNumber` | string | | Interior street number. | | `addressFields.addressLine1` | string | | The primary line in the address that contains the most essential details for locating a place. | | `addressFields.streetType` | string | | Street type | | `fullAddress` | boolean | | This field is set to true if address from id is full (has three lines) or not (For Mexican Voter IDs only). | | `invalidAddress` | boolean | | This field checks for a valid street, numeric postal code with 5 digits, and that both colony and city have values. (Only checked for Mexican IDs) | | `checkedAddress` | string | | Address as obtained after processing with geocoder geolocation api. | | `checkedAddressBean` | AddressBean | | | | `checkedAddressBean.street` | string | | Street line in the way it is read from address string. | | `checkedAddressBean.streetName` | string | | Street name without exterior and interior numbers. | | `checkedAddressBean.colony` | string | | Colony line the way it is read from address string. (Not applicable for all countries) | | `checkedAddressBean.postalCode` | string | | Postal code in the way it is read from address string. | | `checkedAddressBean.city` | string | | City in the way it is read from address string. | | `checkedAddressBean.state` | string | | State in the way it is read from address string. | | `checkedAddressBean.stateName` | string | | Full StateName. | | `checkedAddressBean.district` | string | | District in the way it is read from address string. | | `checkedAddressBean.stateCode` | string | | State code if applicable. | | `checkedAddressBean.addressCountryCode` | string | | Address country code if applicable. | | `checkedAddressBean.label` | string | | Full address label. | | `checkedAddressBean.exteriorNumber` | string | | Exterior street number. | | `checkedAddressBean.interiorNumber` | string | | Interior street number. | | `checkedAddressBean.addressLine1` | string | | The primary line in the address that contains the most essential details for locating a place. | | `checkedAddressBean.streetType` | string | | Street type | | `exteriorNumber` | string | | Exterior street number. | | `interiorNumber` | string | | Interior street number. | | `addressFromStatement` | string | | Address as read from address statement. Lines are separated by \\n. | | `addressFieldsFromStatement` | AddressBean | | | | `addressFieldsFromStatement.street` | string | | Street line in the way it is read from address string. | | `addressFieldsFromStatement.streetName` | string | | Street name without exterior and interior numbers. | | `addressFieldsFromStatement.colony` | string | | Colony line the way it is read from address string. (Not applicable for all countries) | | `addressFieldsFromStatement.postalCode` | string | | Postal code in the way it is read from address string. | | `addressFieldsFromStatement.city` | string | | City in the way it is read from address string. | | `addressFieldsFromStatement.state` | string | | State in the way it is read from address string. | | `addressFieldsFromStatement.stateName` | string | | Full StateName. | | `addressFieldsFromStatement.district` | string | | District in the way it is read from address string. | | `addressFieldsFromStatement.stateCode` | string | | State code if applicable. | | `addressFieldsFromStatement.addressCountryCode` | string | | Address country code if applicable. | | `addressFieldsFromStatement.label` | string | | Full address label. | | `addressFieldsFromStatement.exteriorNumber` | string | | Exterior street number. | | `addressFieldsFromStatement.interiorNumber` | string | | Interior street number. | | `addressFieldsFromStatement.addressLine1` | string | | The primary line in the address that contains the most essential details for locating a place. | | `addressFieldsFromStatement.streetType` | string | | Street type | | `invalidAddressFromStatement` | boolean | | This field checks for a valid street, numeric postal code with 5 digits, and tha both colony and city have values. (Only checked for Mexican POA) | | `addressStatementEmissionDate` | integer (int64) | | Issue date of address statement. The value is presented in UTC milliseconds. | | `documentType` | string | | Type of address statement document. Possible values: - Mexico: liverpool, citibanamex, cfe, telcel, izzi, axtel, telmex, oapas, sacmex, opdm, naturgy, drenaje, totalplay, dhc, att, cea, smapa, megacable, jmas, amicsa, caev - Bolivia: cre - Uruguay: ute - Unknown document: otherPoa Enum: `a1`, `aggm`, `apg`, `energieAg`, `cre`, `aforeAzteca`, `amd`, `amicsa`, `att`, `axtel`, `bancoppel`, `bancoAzteca`, `banorte`, `bbva`, `cab`, `caev`, `capa`, `cea`, `cfe`, `citibanamex`, `cmapa`, `cmapaGrande`, `cmapas`, `cmas`, `cmasBlue`, `comapa`, `comapaRed`, `coppel`, `dapa`, `dhc`, `drenaje`, `ecogas`, `engie`, `gasNatural`, `h`, `hsbc`, `inbursa`, `infonavit`, `interapas`, `isagas`, `izzi`, `jad`, `japam`, `japama`, `japami`, `japay`, `jiapaz`, `jmas`, `jras`, `jumapac`, `jumapam`, `lerdo`, `liverpool`, `mas`, `megacable`, `naturgy`, `oapas`, `odapas`, `ooapas`, `opdm`, `oroapa`, `sacmex`, `sacmexCdmx`, `santander`, `sapa`, `sapal`, `sapamuy`, `sapasa`, `sapasma`, `scotiabank`, `seapal`, `siapa`, `simapag`, `simapas`, `simas`, `smapa`, `smapac`, `smapam`, `smapas`, `spectrum`, `stori`, `sura`, `tam`, `telcel`, `telmex`, `totalplay`, `veolia`, `victoria`, `wizz`, `asylumSeeker`, `refugeeId`, `refugeeStatus`, `ute`, `telkom`, `tmobile`, `verizon`, `xfinity`, `aforeCoppel`, `americanExpress`, `ap`, `telnor`, `wellsFargo`, `otherPoa` | | `addressStatementTimestamps` | array[AddressStatementDate] | | | | `addressStatementTimestamps.get_version` | integer (int64) | | | | `addressStatementTimestamps.dateType` | string | | Description of timestamp. | | `addressStatementTimestamps.addressStatementTimestamp` | integer (int64) | | UTC timestamp. | | `poaName` | string | | Extracted name from address statement. | | `typeOfId` | string | | Enum: `Unknown`, `Passport`, `Visa`, `DriversLicense`, `IdentificationCard`, `Permit`, `Currency`, `ResidenceDocument`, `TravelDocument`, `BirthCertificate`, `VehicleRegistration`, `Other`, `WeaponLicense`, `TribalIdentification`, `VoterIdentification`, `Military`, `TaxIdentification`, `FederalID`, `MedicalCard` | | `documentFrontSubtype` | string | | Additional info about ID type (front side) | | `documentBackSubtype` | string | | Additional info about ID type (back side) | | `issueFront` | integer (int32) | | Issue year (per classification model) of the ID (front side) | | `issueBack` | integer (int32) | | Issue year (per classification model) of the ID (back side) | | `birthDate` | integer (int64) | | Date of birth is presented in UTC milliseconds. | | `gender` | string | | Gender values are presented in English. "M" for male, "F" for female and "X" for non-binary. Enum: `M`, `F`, `X` | | `claveDeElector` | string | | Clave de elector as read from id. For Mexican IDs only. | | `curp` | string | | Curp as read form id. For Mexican IDs only. | | `numeroEmisionCredencial` | string | | Numero Emision Credencial as read from id. (For Mexican IDs only). | | `cic` | string | | Cic as read from id. (This field is read from back side of id; For Mexican IDs only). | | `ocr` | string | | Ocr as read from id. (This field is read from back side of id; For Mexican IDs only). | | `documentNumber` | string | | Document number. | | `documentNumberSource` | string | | Document number source. Enum: `FORM`, `OCR` | | `personalNumber` | string | | Personal number. | | `nationalNumber` | string | | National number. | | `refNumber` | string | | Document Reference Number. | | `taxIdNumber` | string | | Personal tax identification number. | | `nue` | string | | NUE number as read from id. (for Resident Cards) | | `externalId` | string | | External user id. | | `issuedAt` | string | | Date of issue UTC timestamp. | | `expireAt` | string | | Expiration date UTC timestamp. | | `expirationDate` | integer (int32) | | Expiration year of id. | | `issueDate` | integer (int32) | | Issue year of id. | | `registrationDate` | integer (int32) | | Registration date read from id. | | `dlClassDetails` | array[DLClassDetails] | | | | `dlClassDetails.dlClass` | string | | Driver's license class. | | `dlClassDetails.validFromDate` | integer (int64) | | DL class valid from UTC timestamp | | `dlClassDetails.validToDate` | integer (int64) | | DL class valid to UTC timestamp. | | `dlClassDetails.additionalCodes` | string | | Additional codes associated with DL class. | | `dlClassDetails.restrictions` | array[string] | | Restriction codes associated with DL class. | | `issuingCountry` | string | | Issuing country of document. | | `issuingState` | string | | Issuing state of document. | | `birthPlace` | string | | Birth place as read from id. | | `printingNumber` | string | | Printing number (número de impresión) printed below the barcode on Colombian IDs. | | `duplicateNumber` | string | | Number of duplicates (número de duplicados) printed below the barcode on Colombian IDs. | | `preparationNumber` | string | | Preparation number (número de preparación) printed below the barcode on Colombian IDs. | | `issuingAuthority` | string | | Issuing Authority as read from id. | | `height` | string | | Person's height as read from id. | | `weight` | string | | Person's weight. | | `eyeColor` | string | | Person's eye color. | | `hairColor` | string | | Person's hair color. | | `religion` | string | | Person's religion. | | `bloodType` | string | | Person's blood type. | | `maritalStatus` | string | | Person's marital status. | | `nationality` | string | | Person's nationality. | | `race` | string | | Person's race. | | `nationalityMrz` | string | | Person's nationality as it appears in MRZ (if present). | | `nationalityAlpha3` | string | | Person's nationality Alpha3 code format. Only for Brazilian IDs. | | `governmentComparisonResults` | GovernmentComparisonResults | | Government validation data. Only for supported government validation countries. | | `governmentComparisonResults.paternalLastNameValid` | boolean | | Indicates validity of person's paternal last name through government validation apis. | | `governmentComparisonResults.maternalLastNameValid` | boolean | | Indicates validity of person's maternal last name through government validation apis. | | `governmentComparisonResults.firstNameValid` | boolean | | Indicates validity of person's first name through government validation apis. | | `governmentComparisonResults.curpValid` | boolean | | Indicates CURP validity through RENAPO/CURP provider validation. | | `governmentComparisonResults.ineCurpValid` | boolean | | Indicates CURP validity through INE government validation (separate from RENAPO). | | `governmentComparisonResults.ocrValid` | boolean | | Indicates ocr validity through government validation apis. | | `governmentComparisonResults.claveDeElectorValid` | boolean | | Indicates "clave de elector" validity through government validation apis. | | `governmentComparisonResults.numeroEmisionCredencialValid` | boolean | | Indicates "numero emision credencial" validity through government validation apis. | | `governmentComparisonResults.registrationDateValid` | boolean | | Indicates registration date validity through government validation apis. | | `governmentComparisonResults.issueDateValid` | boolean | | Indicates issue date validity through government validation apis. | | `notExtracted` | integer (int32) | | Number of not extracted OCR fields. Only for Mexican IDs. | | `notExtractedDetails` | array[string] | | | | `classes` | string | | Person's driver licence classes. | | `cond` | string | | Person's driver licence conditions. | | `mentions` | string | | Person's driver licence mentions. | | `restrictions` | string | | Person's driver licence restrictions. | | `mrz1` | string | | First MRZ line. | | `mrz2` | string | | Second MRZ line. | | `mrz3` | string | | Third MRZ line. | | `fullNameMrz` | string | | Person's full name read from MRZ. | | `documentNumberCheckDigit` | string | | Document number check digit read from MRZ. | | `dateOfBirthCheckDigit` | string | | Date of birth check digit read from MRZ. | | `expirationDateCheckDigit` | string | | Expiration date check digit read from MRZ. | | `barcodeRawData` | string | | Full unformatted data read from 2D barcode. | | `fathersName` | string | | Person's father's name. Only for Brazilian and Indian IDs. | | `mothersName` | string | | Person's mother's name. Only for Brazilian IDs. | | `fathersIdNumber` | string | | Person's father's Id Number. In the context of minors identity validation. | | `mothersIdNumber` | string | | Person's mother's Id Number. In the context of minors identity validation. | | `spouseName` | string | | Person's spouse's name. | | `federalRevenueNumber` | string | | Federal revenue number. Only for Brazilian IDs. | | `originDocumentId` | string | | Origin document ID. Only for Brazilian IDs. | | `driversLicenseCategory` | string | | Driver's licence category. Only for Brazilian IDs. | | `controlNumber` | string | | Control number. Only for Brazilian IDs. | | `renach` | string | | Renach. Only for Brazilian IDs. | | `additionalAttrs` | array[string] | | Additional document attributes. | | `ocrDataConfidence` | OcrDataConfidence | | Structure containing ocr reliability confidence for each extracted ocr field. Confidence values are Floats between 0 and 1. | | `ocrDataConfidence.birthDateConfidence` | number (float) | | | | `ocrDataConfidence.nameConfidence` | number (float) | | | | `ocrDataConfidence.nameNativeScriptConfidence` | number (float) | | | | `ocrDataConfidence.firstNameNativeScriptConfidence` | number (float) | | | | `ocrDataConfidence.paternalLastNameNativeScriptConfidence` | number (float) | | | | `ocrDataConfidence.maternalLastNameNativeScriptConfidence` | number (float) | | | | `ocrDataConfidence.givenNameConfidence` | number (float) | | | | `ocrDataConfidence.firstNameConfidence` | number (float) | | | | `ocrDataConfidence.middleNameConfidence` | number (float) | | | | `ocrDataConfidence.nameSuffixConfidence` | number (float) | | | | `ocrDataConfidence.mothersSurnameConfidence` | number (float) | | | | `ocrDataConfidence.fathersSurnameConfidence` | number (float) | | | | `ocrDataConfidence.nickNameConfidence` | number (float) | | | | `ocrDataConfidence.fullNameMrzConfidence` | number (float) | | | | `ocrDataConfidence.mothersNameConfidence` | number (float) | | | | `ocrDataConfidence.fathersNameConfidence` | number (float) | | | | `ocrDataConfidence.mothersIdNumberConfidence` | number (float) | | | | `ocrDataConfidence.fathersIdNumberConfidence` | number (float) | | | | `ocrDataConfidence.spouseNameConfidence` | number (float) | | | | `ocrDataConfidence.birthNameConfidence` | number (float) | | | | `ocrDataConfidence.addressConfidence` | number (float) | | | | `ocrDataConfidence.streetConfidence` | number (float) | | | | `ocrDataConfidence.colonyConfidence` | number (float) | | | | `ocrDataConfidence.postalCodeConfidence` | number (float) | | | | `ocrDataConfidence.cityConfidence` | number (float) | | | | `ocrDataConfidence.stateConfidence` | number (float) | | | | `ocrDataConfidence.districtConfidence` | number (float) | | | | `ocrDataConfidence.stateCodeConfidence` | number (float) | | | | `ocrDataConfidence.countryCodeConfidence` | number (float) | | | | `ocrDataConfidence.genderConfidence` | number (float) | | | | `ocrDataConfidence.issueDateConfidence` | number (float) | | | | `ocrDataConfidence.expirationDateConfidence` | number (float) | | | | `ocrDataConfidence.issuedAtConfidence` | number (float) | | | | `ocrDataConfidence.expireAtConfidence` | number (float) | | | | `ocrDataConfidence.issuingAuthorityConfidence` | number (float) | | | | `ocrDataConfidence.mrz1Confidence` | number (float) | | | | `ocrDataConfidence.mrz2Confidence` | number (float) | | | | `ocrDataConfidence.mrz3Confidence` | number (float) | | | | `ocrDataConfidence.mrzFullConfidence` | number (float) | | | | `ocrDataConfidence.documentNumberConfidence` | number (float) | | | | `ocrDataConfidence.backNumberConfidence` | number (float) | | | | `ocrDataConfidence.personalNumberConfidence` | number (float) | | | | `ocrDataConfidence.nationalNumberConfidence` | number (float) | | | | `ocrDataConfidence.claveDeElectorConfidence` | number (float) | | | | `ocrDataConfidence.numeroEmisionCredencialConfidence` | number (float) | | | | `ocrDataConfidence.curpConfidence` | number (float) | | | | `ocrDataConfidence.nueConfidence` | number (float) | | | | `ocrDataConfidence.registrationDateConfidence` | number (float) | | | | `ocrDataConfidence.heightConfidence` | number (float) | | | | `ocrDataConfidence.birthPlaceConfidence` | number (float) | | | | `ocrDataConfidence.bloodTypeConfidence` | number (float) | | | | `ocrDataConfidence.eyeColorConfidence` | number (float) | | | | `ocrDataConfidence.classesConfidence` | number (float) | | | | `ocrDataConfidence.condConfidence` | number (float) | | | | `ocrDataConfidence.mentionsConfidence` | number (float) | | | | `ocrDataConfidence.refNumberConfidence` | number (float) | | | | `ocrDataConfidence.weightConfidence` | number (float) | | | | `ocrDataConfidence.hairConfidence` | number (float) | | | | `ocrDataConfidence.restrictionsConfidence` | number (float) | | | | `ocrDataConfidence.nationalityConfidence` | number (float) | | | | `ocrDataConfidence.nationalityMrzConfidence` | number (float) | | | | `ocrDataConfidence.nationalityAlpha3Confidence` | number (float) | | | | `ocrDataConfidence.maritalStatusConfidence` | number (float) | | | | `ocrDataConfidence.raceConfidence` | number (float) | | | | `ocrDataConfidence.taxIdNumberConfidence` | number (float) | | | | `ocrDataConfidence.jurisdictionCodeConfidence` | number (float) | | | | `additionalDocumentAttempts` | array[AdditionalDocumentAttemptDto] | | | | `additionalDocumentAttempts.status` | string | | Enum: `SUCCESS`, `VALIDATION_ERROR`, `FAIL` | | `additionalDocumentAttempts.attemptTimestamp` | integer (int64) | | | | `additionalDocumentAttempts.imagesUrl` | array[string] | | | | `additionalDocumentAttempts.attemptType` | string | | Enum: `POA`, `DOCUMENT_CAPTURE` | | `additionalDocumentAttempts.antiSpoofResult` | PoaAntiSpoofResult | | | | `additionalDocumentAttempts.antiSpoofResult.status` | string | | Enum: `PASS`, `FAIL`, `NOT_EXECUTED` | | `additionalDocumentAttempts.antiSpoofResult.kinds` | array[string] | | | | `additionalDocumentAttempts.antiSpoofResult.confidence` | number (float) | | | | `additionalDocumentAttempts.antiSpoofResult.details` | array[Detail] | | | | `additionalDocumentAttempts.antiSpoofResult.details.kind` | string | | | | `additionalDocumentAttempts.antiSpoofResult.details.error` | string | | | | `additionalDocumentAttempts.antiSpoofResult.details.loc` | string | | | | `additionalDocumentAttempts.antiSpoofResult.details.explanation` | string | | | | `additionalDocumentAttempts.documentType` | string | yes | | | `documentSubmissionMethod` | string | | Method used to submit the document. Enum: `CAPTURED_DOCUMENT`, `UPLOADED_FILE`, `IMPORTED_CREDENTIAL` | | `credentialsProvider` | string | | Credentials provider used when documentSubmissionMethod is IMPORTED_CREDENTIAL. Enum: `APPLE`, `GOOGLE`, `DIGILOCKER`, `SAMSUNG`, `TRINSIC`, `NETHERLANDS_IDIN`, `FINNISH_TRUST_NETWORK` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/ocr-data-second-id \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/ocr-data-second-id", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/ocr-data-second-id", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/ocr-data-second-id")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "name": { "fullName": "string", "fullNameNativeScript": "string", "firstNameNativeScript": "string", "paternalLastNameNativeScript": "string", "maternalLastNameNativeScript": "string", "machineReadableFullName": "string", "firstName": "string", "middleName": "string", "givenName": "string", "givenNameMrz": "string", "initials": "string", "nameSuffix": "string", "paternalLastName": "string", "maternalLastName": "string", "lastNameMrz": "string", "familyName": "string" }, "address": "string", "addressFields": { "street": "string", "streetName": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string", "exteriorNumber": "string", "interiorNumber": "string", "addressLine1": "string", "streetType": "string" }, "fullAddress": true, "invalidAddress": true, "checkedAddress": "string", "checkedAddressBean": { "street": "string", "streetName": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string", "exteriorNumber": "string", "interiorNumber": "string", "addressLine1": "string", "streetType": "string" }, "exteriorNumber": "string", "interiorNumber": "string", "addressFromStatement": "string", "addressFieldsFromStatement": { "street": "string", "streetName": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string", "exteriorNumber": "string", "interiorNumber": "string", "addressLine1": "string", "streetType": "string" }, "invalidAddressFromStatement": true, "addressStatementEmissionDate": 0, "documentType": "a1", "addressStatementTimestamps": [ { "get_version": 0, "dateType": "string", "addressStatementTimestamp": 0 } ], "poaName": "string", "typeOfId": "Unknown", "documentFrontSubtype": "string", "documentBackSubtype": "string", "issueFront": 0, "issueBack": 0, "birthDate": 0, "gender": "M", "claveDeElector": "string", "curp": "string", "numeroEmisionCredencial": "string", "cic": "string", "ocr": "string", "documentNumber": "string", "documentNumberSource": "FORM", "personalNumber": "string", "nationalNumber": "string", "refNumber": "string", "taxIdNumber": "string", "nue": "string", "externalId": "string", "issuedAt": "string", "expireAt": "string", "expirationDate": 0, "issueDate": 0, "registrationDate": 0, "dlClassDetails": [ { "dlClass": "string", "validFromDate": 0, "validToDate": 0, "additionalCodes": "string", "restrictions": [ "string" ] } ], "issuingCountry": "string", "issuingState": "string", "birthPlace": "string", "printingNumber": "string", "duplicateNumber": "string", "preparationNumber": "string", "issuingAuthority": "string", "height": "string", "weight": "string", "eyeColor": "string", "hairColor": "string", "religion": "string", "bloodType": "string", "maritalStatus": "string", "nationality": "string", "race": "string", "nationalityMrz": "string", "nationalityAlpha3": "string", "governmentComparisonResults": { "paternalLastNameValid": true, "maternalLastNameValid": true, "firstNameValid": true, "curpValid": true, "ineCurpValid": true, "ocrValid": true, "claveDeElectorValid": true, "numeroEmisionCredencialValid": true, "registrationDateValid": true, "issueDateValid": true }, "notExtracted": 0, "notExtractedDetails": [ "string" ], "classes": "string", "cond": "string", "mentions": "string", "restrictions": "string", "mrz1": "string", "mrz2": "string", "mrz3": "string", "fullNameMrz": "string", "documentNumberCheckDigit": "string", "dateOfBirthCheckDigit": "string", "expirationDateCheckDigit": "string", "barcodeRawData": "string", "fathersName": "string", "mothersName": "string", "fathersIdNumber": "string", "mothersIdNumber": "string", "spouseName": "string", "federalRevenueNumber": "string", "originDocumentId": "string", "driversLicenseCategory": "string", "controlNumber": "string", "renach": "string", "additionalAttrs": [ "DOCUMENTO_INFANTIL" ], "ocrDataConfidence": { "birthDateConfidence": 0, "nameConfidence": 0, "nameNativeScriptConfidence": 0, "firstNameNativeScriptConfidence": 0, "paternalLastNameNativeScriptConfidence": 0, "maternalLastNameNativeScriptConfidence": 0, "givenNameConfidence": 0, "firstNameConfidence": 0, "middleNameConfidence": 0, "nameSuffixConfidence": 0, "mothersSurnameConfidence": 0, "fathersSurnameConfidence": 0, "nickNameConfidence": 0, "fullNameMrzConfidence": 0, "mothersNameConfidence": 0, "fathersNameConfidence": 0, "mothersIdNumberConfidence": 0, "fathersIdNumberConfidence": 0, "spouseNameConfidence": 0, "birthNameConfidence": 0, "addressConfidence": 0, "streetConfidence": 0, "colonyConfidence": 0, "postalCodeConfidence": 0, "cityConfidence": 0, "stateConfidence": 0, "districtConfidence": 0, "stateCodeConfidence": 0, "countryCodeConfidence": 0, "genderConfidence": 0, "issueDateConfidence": 0, "expirationDateConfidence": 0, "issuedAtConfidence": 0, "expireAtConfidence": 0, "issuingAuthorityConfidence": 0, "mrz1Confidence": 0, "mrz2Confidence": 0, "mrz3Confidence": 0, "mrzFullConfidence": 0, "documentNumberConfidence": 0, "backNumberConfidence": 0, "personalNumberConfidence": 0, "nationalNumberConfidence": 0, "claveDeElectorConfidence": 0, "numeroEmisionCredencialConfidence": 0, "curpConfidence": 0, "nueConfidence": 0, "registrationDateConfidence": 0, "heightConfidence": 0, "birthPlaceConfidence": 0, "bloodTypeConfidence": 0, "eyeColorConfidence": 0, "classesConfidence": 0, "condConfidence": 0, "mentionsConfidence": 0, "refNumberConfidence": 0, "weightConfidence": 0, "hairConfidence": 0, "restrictionsConfidence": 0, "nationalityConfidence": 0, "nationalityMrzConfidence": 0, "nationalityAlpha3Confidence": 0, "maritalStatusConfidence": 0, "raceConfidence": 0, "taxIdNumberConfidence": 0, "jurisdictionCodeConfidence": 0 }, "additionalDocumentAttempts": [ { "status": "SUCCESS", "attemptTimestamp": 0, "imagesUrl": [ "string" ], "attemptType": "POA", "antiSpoofResult": { "status": "PASS", "kinds": [ "string" ], "confidence": 0, "details": [ { "kind": "string", "error": "string", "loc": "string", "explanation": "string" } ] }, "documentType": "string" } ], "documentSubmissionMethod": "CAPTURED_DOCUMENT", "credentialsProvider": "APPLE" } ``` --- - Path: `api-reference/get-ocr-data-v2` - URL: https://developer.incode.com/api-reference/get-ocr-data-v2/ - Markdown: https://developer.incode.com/api-reference/get-ocr-data-v2.md - Endpoint: `GET /omni/get/ocr-data/v2` # Fetch ocr data v2 `GET /omni/get/ocr-data/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns data about user read from id and address statement wrapped in ocrData object. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Id of onboarding for which data are requested. If not present, it will be extracted from token. | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `ocrData` | OcrDataResponse | | | | `ocrData.name` | NameBean | | | | `ocrData.name.fullName` | string | | | | `ocrData.name.fullNameNativeScript` | string | | | | `ocrData.name.firstNameNativeScript` | string | | | | `ocrData.name.paternalLastNameNativeScript` | string | | | | `ocrData.name.maternalLastNameNativeScript` | string | | | | `ocrData.name.machineReadableFullName` | string | | Full name from Barcode or MRZ | | `ocrData.name.firstName` | string | | | | `ocrData.name.middleName` | string | | | | `ocrData.name.givenName` | string | | | | `ocrData.name.givenNameMrz` | string | | | | `ocrData.name.initials` | string | | Initials as returned by bank-ID schemes (e.g. iDIN) — the only given-name evidence they provide | | `ocrData.name.nameSuffix` | string | | | | `ocrData.name.paternalLastName` | string | | | | `ocrData.name.maternalLastName` | string | | | | `ocrData.name.lastNameMrz` | string | | | | `ocrData.name.familyName` | string | | | | `ocrData.address` | string | | Address as read from id. Address can have two or three lines. Lines are separated by \\n | | `ocrData.addressFields` | AddressBean | | | | `ocrData.addressFields.street` | string | | Street line in the way it is read from address string. | | `ocrData.addressFields.streetName` | string | | Street name without exterior and interior numbers. | | `ocrData.addressFields.colony` | string | | Colony line the way it is read from address string. (Not applicable for all countries) | | `ocrData.addressFields.postalCode` | string | | Postal code in the way it is read from address string. | | `ocrData.addressFields.city` | string | | City in the way it is read from address string. | | `ocrData.addressFields.state` | string | | State in the way it is read from address string. | | `ocrData.addressFields.stateName` | string | | Full StateName. | | `ocrData.addressFields.district` | string | | District in the way it is read from address string. | | `ocrData.addressFields.stateCode` | string | | State code if applicable. | | `ocrData.addressFields.addressCountryCode` | string | | Address country code if applicable. | | `ocrData.addressFields.label` | string | | Full address label. | | `ocrData.addressFields.exteriorNumber` | string | | Exterior street number. | | `ocrData.addressFields.interiorNumber` | string | | Interior street number. | | `ocrData.addressFields.addressLine1` | string | | The primary line in the address that contains the most essential details for locating a place. | | `ocrData.addressFields.streetType` | string | | Street type | | `ocrData.fullAddress` | boolean | | This field is set to true if address from id is full (has three lines) or not (For Mexican Voter IDs only). | | `ocrData.invalidAddress` | boolean | | This field checks for a valid street, numeric postal code with 5 digits, and that both colony and city have values. (Only checked for Mexican IDs) | | `ocrData.checkedAddress` | string | | Address as obtained after processing with geocoder geolocation api. | | `ocrData.checkedAddressBean` | AddressBean | | | | `ocrData.checkedAddressBean.street` | string | | Street line in the way it is read from address string. | | `ocrData.checkedAddressBean.streetName` | string | | Street name without exterior and interior numbers. | | `ocrData.checkedAddressBean.colony` | string | | Colony line the way it is read from address string. (Not applicable for all countries) | | `ocrData.checkedAddressBean.postalCode` | string | | Postal code in the way it is read from address string. | | `ocrData.checkedAddressBean.city` | string | | City in the way it is read from address string. | | `ocrData.checkedAddressBean.state` | string | | State in the way it is read from address string. | | `ocrData.checkedAddressBean.stateName` | string | | Full StateName. | | `ocrData.checkedAddressBean.district` | string | | District in the way it is read from address string. | | `ocrData.checkedAddressBean.stateCode` | string | | State code if applicable. | | `ocrData.checkedAddressBean.addressCountryCode` | string | | Address country code if applicable. | | `ocrData.checkedAddressBean.label` | string | | Full address label. | | `ocrData.checkedAddressBean.exteriorNumber` | string | | Exterior street number. | | `ocrData.checkedAddressBean.interiorNumber` | string | | Interior street number. | | `ocrData.checkedAddressBean.addressLine1` | string | | The primary line in the address that contains the most essential details for locating a place. | | `ocrData.checkedAddressBean.streetType` | string | | Street type | | `ocrData.exteriorNumber` | string | | Exterior street number. | | `ocrData.interiorNumber` | string | | Interior street number. | | `ocrData.addressFromStatement` | string | | Address as read from address statement. Lines are separated by \\n. | | `ocrData.addressFieldsFromStatement` | AddressBean | | | | `ocrData.addressFieldsFromStatement.street` | string | | Street line in the way it is read from address string. | | `ocrData.addressFieldsFromStatement.streetName` | string | | Street name without exterior and interior numbers. | | `ocrData.addressFieldsFromStatement.colony` | string | | Colony line the way it is read from address string. (Not applicable for all countries) | | `ocrData.addressFieldsFromStatement.postalCode` | string | | Postal code in the way it is read from address string. | | `ocrData.addressFieldsFromStatement.city` | string | | City in the way it is read from address string. | | `ocrData.addressFieldsFromStatement.state` | string | | State in the way it is read from address string. | | `ocrData.addressFieldsFromStatement.stateName` | string | | Full StateName. | | `ocrData.addressFieldsFromStatement.district` | string | | District in the way it is read from address string. | | `ocrData.addressFieldsFromStatement.stateCode` | string | | State code if applicable. | | `ocrData.addressFieldsFromStatement.addressCountryCode` | string | | Address country code if applicable. | | `ocrData.addressFieldsFromStatement.label` | string | | Full address label. | | `ocrData.addressFieldsFromStatement.exteriorNumber` | string | | Exterior street number. | | `ocrData.addressFieldsFromStatement.interiorNumber` | string | | Interior street number. | | `ocrData.addressFieldsFromStatement.addressLine1` | string | | The primary line in the address that contains the most essential details for locating a place. | | `ocrData.addressFieldsFromStatement.streetType` | string | | Street type | | `ocrData.invalidAddressFromStatement` | boolean | | This field checks for a valid street, numeric postal code with 5 digits, and tha both colony and city have values. (Only checked for Mexican POA) | | `ocrData.addressStatementEmissionDate` | integer (int64) | | Issue date of address statement. The value is presented in UTC milliseconds. | | `ocrData.documentType` | string | | Type of address statement document. Possible values: - Mexico: liverpool, citibanamex, cfe, telcel, izzi, axtel, telmex, oapas, sacmex, opdm, naturgy, drenaje, totalplay, dhc, att, cea, smapa, megacable, jmas, amicsa, caev - Bolivia: cre - Uruguay: ute - Unknown document: otherPoa Enum: `a1`, `aggm`, `apg`, `energieAg`, `cre`, `aforeAzteca`, `amd`, `amicsa`, `att`, `axtel`, `bancoppel`, `bancoAzteca`, `banorte`, `bbva`, `cab`, `caev`, `capa`, `cea`, `cfe`, `citibanamex`, `cmapa`, `cmapaGrande`, `cmapas`, `cmas`, `cmasBlue`, `comapa`, `comapaRed`, `coppel`, `dapa`, `dhc`, `drenaje`, `ecogas`, `engie`, `gasNatural`, `h`, `hsbc`, `inbursa`, `infonavit`, `interapas`, `isagas`, `izzi`, `jad`, `japam`, `japama`, `japami`, `japay`, `jiapaz`, `jmas`, `jras`, `jumapac`, `jumapam`, `lerdo`, `liverpool`, `mas`, `megacable`, `naturgy`, `oapas`, `odapas`, `ooapas`, `opdm`, `oroapa`, `sacmex`, `sacmexCdmx`, `santander`, `sapa`, `sapal`, `sapamuy`, `sapasa`, `sapasma`, `scotiabank`, `seapal`, `siapa`, `simapag`, `simapas`, `simas`, `smapa`, `smapac`, `smapam`, `smapas`, `spectrum`, `stori`, `sura`, `tam`, `telcel`, `telmex`, `totalplay`, `veolia`, `victoria`, `wizz`, `asylumSeeker`, `refugeeId`, `refugeeStatus`, `ute`, `telkom`, `tmobile`, `verizon`, `xfinity`, `aforeCoppel`, `americanExpress`, `ap`, `telnor`, `wellsFargo`, `otherPoa` | | `ocrData.addressStatementTimestamps` | array[AddressStatementDate] | | | | `ocrData.addressStatementTimestamps.get_version` | integer (int64) | | | | `ocrData.addressStatementTimestamps.dateType` | string | | Description of timestamp. | | `ocrData.addressStatementTimestamps.addressStatementTimestamp` | integer (int64) | | UTC timestamp. | | `ocrData.poaName` | string | | Extracted name from address statement. | | `ocrData.typeOfId` | string | | Enum: `Unknown`, `Passport`, `Visa`, `DriversLicense`, `IdentificationCard`, `Permit`, `Currency`, `ResidenceDocument`, `TravelDocument`, `BirthCertificate`, `VehicleRegistration`, `Other`, `WeaponLicense`, `TribalIdentification`, `VoterIdentification`, `Military`, `TaxIdentification`, `FederalID`, `MedicalCard` | | `ocrData.documentFrontSubtype` | string | | Additional info about ID type (front side) | | `ocrData.documentBackSubtype` | string | | Additional info about ID type (back side) | | `ocrData.issueFront` | integer (int32) | | Issue year (per classification model) of the ID (front side) | | `ocrData.issueBack` | integer (int32) | | Issue year (per classification model) of the ID (back side) | | `ocrData.birthDate` | integer (int64) | | Date of birth is presented in UTC milliseconds. | | `ocrData.gender` | string | | Gender values are presented in English. "M" for male, "F" for female and "X" for non-binary. Enum: `M`, `F`, `X` | | `ocrData.claveDeElector` | string | | Clave de elector as read from id. For Mexican IDs only. | | `ocrData.curp` | string | | Curp as read form id. For Mexican IDs only. | | `ocrData.numeroEmisionCredencial` | string | | Numero Emision Credencial as read from id. (For Mexican IDs only). | | `ocrData.cic` | string | | Cic as read from id. (This field is read from back side of id; For Mexican IDs only). | | `ocrData.ocr` | string | | Ocr as read from id. (This field is read from back side of id; For Mexican IDs only). | | `ocrData.documentNumber` | string | | Document number. | | `ocrData.documentNumberSource` | string | | Document number source. Enum: `FORM`, `OCR` | | `ocrData.personalNumber` | string | | Personal number. | | `ocrData.nationalNumber` | string | | National number. | | `ocrData.refNumber` | string | | Document Reference Number. | | `ocrData.taxIdNumber` | string | | Personal tax identification number. | | `ocrData.nue` | string | | NUE number as read from id. (for Resident Cards) | | `ocrData.externalId` | string | | External user id. | | `ocrData.issuedAt` | string | | Date of issue UTC timestamp. | | `ocrData.expireAt` | string | | Expiration date UTC timestamp. | | `ocrData.expirationDate` | integer (int32) | | Expiration year of id. | | `ocrData.issueDate` | integer (int32) | | Issue year of id. | | `ocrData.registrationDate` | integer (int32) | | Registration date read from id. | | `ocrData.dlClassDetails` | array[DLClassDetails] | | | | `ocrData.dlClassDetails.dlClass` | string | | Driver's license class. | | `ocrData.dlClassDetails.validFromDate` | integer (int64) | | DL class valid from UTC timestamp | | `ocrData.dlClassDetails.validToDate` | integer (int64) | | DL class valid to UTC timestamp. | | `ocrData.dlClassDetails.additionalCodes` | string | | Additional codes associated with DL class. | | `ocrData.dlClassDetails.restrictions` | array[string] | | Restriction codes associated with DL class. | | `ocrData.issuingCountry` | string | | Issuing country of document. | | `ocrData.issuingState` | string | | Issuing state of document. | | `ocrData.birthPlace` | string | | Birth place as read from id. | | `ocrData.printingNumber` | string | | Printing number (número de impresión) printed below the barcode on Colombian IDs. | | `ocrData.duplicateNumber` | string | | Number of duplicates (número de duplicados) printed below the barcode on Colombian IDs. | | `ocrData.preparationNumber` | string | | Preparation number (número de preparación) printed below the barcode on Colombian IDs. | | `ocrData.issuingAuthority` | string | | Issuing Authority as read from id. | | `ocrData.height` | string | | Person's height as read from id. | | `ocrData.weight` | string | | Person's weight. | | `ocrData.eyeColor` | string | | Person's eye color. | | `ocrData.hairColor` | string | | Person's hair color. | | `ocrData.religion` | string | | Person's religion. | | `ocrData.bloodType` | string | | Person's blood type. | | `ocrData.maritalStatus` | string | | Person's marital status. | | `ocrData.nationality` | string | | Person's nationality. | | `ocrData.race` | string | | Person's race. | | `ocrData.nationalityMrz` | string | | Person's nationality as it appears in MRZ (if present). | | `ocrData.nationalityAlpha3` | string | | Person's nationality Alpha3 code format. Only for Brazilian IDs. | | `ocrData.governmentComparisonResults` | GovernmentComparisonResults | | Government validation data. Only for supported government validation countries. | | `ocrData.governmentComparisonResults.paternalLastNameValid` | boolean | | Indicates validity of person's paternal last name through government validation apis. | | `ocrData.governmentComparisonResults.maternalLastNameValid` | boolean | | Indicates validity of person's maternal last name through government validation apis. | | `ocrData.governmentComparisonResults.firstNameValid` | boolean | | Indicates validity of person's first name through government validation apis. | | `ocrData.governmentComparisonResults.curpValid` | boolean | | Indicates CURP validity through RENAPO/CURP provider validation. | | `ocrData.governmentComparisonResults.ineCurpValid` | boolean | | Indicates CURP validity through INE government validation (separate from RENAPO). | | `ocrData.governmentComparisonResults.ocrValid` | boolean | | Indicates ocr validity through government validation apis. | | `ocrData.governmentComparisonResults.claveDeElectorValid` | boolean | | Indicates "clave de elector" validity through government validation apis. | | `ocrData.governmentComparisonResults.numeroEmisionCredencialValid` | boolean | | Indicates "numero emision credencial" validity through government validation apis. | | `ocrData.governmentComparisonResults.registrationDateValid` | boolean | | Indicates registration date validity through government validation apis. | | `ocrData.governmentComparisonResults.issueDateValid` | boolean | | Indicates issue date validity through government validation apis. | | `ocrData.notExtracted` | integer (int32) | | Number of not extracted OCR fields. Only for Mexican IDs. | | `ocrData.notExtractedDetails` | array[string] | | | | `ocrData.classes` | string | | Person's driver licence classes. | | `ocrData.cond` | string | | Person's driver licence conditions. | | `ocrData.mentions` | string | | Person's driver licence mentions. | | `ocrData.restrictions` | string | | Person's driver licence restrictions. | | `ocrData.mrz1` | string | | First MRZ line. | | `ocrData.mrz2` | string | | Second MRZ line. | | `ocrData.mrz3` | string | | Third MRZ line. | | `ocrData.fullNameMrz` | string | | Person's full name read from MRZ. | | `ocrData.documentNumberCheckDigit` | string | | Document number check digit read from MRZ. | | `ocrData.dateOfBirthCheckDigit` | string | | Date of birth check digit read from MRZ. | | `ocrData.expirationDateCheckDigit` | string | | Expiration date check digit read from MRZ. | | `ocrData.barcodeRawData` | string | | Full unformatted data read from 2D barcode. | | `ocrData.fathersName` | string | | Person's father's name. Only for Brazilian and Indian IDs. | | `ocrData.mothersName` | string | | Person's mother's name. Only for Brazilian IDs. | | `ocrData.fathersIdNumber` | string | | Person's father's Id Number. In the context of minors identity validation. | | `ocrData.mothersIdNumber` | string | | Person's mother's Id Number. In the context of minors identity validation. | | `ocrData.spouseName` | string | | Person's spouse's name. | | `ocrData.federalRevenueNumber` | string | | Federal revenue number. Only for Brazilian IDs. | | `ocrData.originDocumentId` | string | | Origin document ID. Only for Brazilian IDs. | | `ocrData.driversLicenseCategory` | string | | Driver's licence category. Only for Brazilian IDs. | | `ocrData.controlNumber` | string | | Control number. Only for Brazilian IDs. | | `ocrData.renach` | string | | Renach. Only for Brazilian IDs. | | `ocrData.additionalAttrs` | array[string] | | Additional document attributes. | | `ocrData.ocrDataConfidence` | OcrDataConfidence | | Structure containing ocr reliability confidence for each extracted ocr field. Confidence values are Floats between 0 and 1. | | `ocrData.ocrDataConfidence.birthDateConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.nameConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.nameNativeScriptConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.firstNameNativeScriptConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.paternalLastNameNativeScriptConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.maternalLastNameNativeScriptConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.givenNameConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.firstNameConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.middleNameConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.nameSuffixConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.mothersSurnameConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.fathersSurnameConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.nickNameConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.fullNameMrzConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.mothersNameConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.fathersNameConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.mothersIdNumberConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.fathersIdNumberConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.spouseNameConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.birthNameConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.addressConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.streetConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.colonyConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.postalCodeConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.cityConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.stateConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.districtConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.stateCodeConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.countryCodeConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.genderConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.issueDateConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.expirationDateConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.issuedAtConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.expireAtConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.issuingAuthorityConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.mrz1Confidence` | number (float) | | | | `ocrData.ocrDataConfidence.mrz2Confidence` | number (float) | | | | `ocrData.ocrDataConfidence.mrz3Confidence` | number (float) | | | | `ocrData.ocrDataConfidence.mrzFullConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.documentNumberConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.backNumberConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.personalNumberConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.nationalNumberConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.claveDeElectorConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.numeroEmisionCredencialConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.curpConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.nueConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.registrationDateConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.heightConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.birthPlaceConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.bloodTypeConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.eyeColorConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.classesConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.condConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.mentionsConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.refNumberConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.weightConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.hairConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.restrictionsConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.nationalityConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.nationalityMrzConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.nationalityAlpha3Confidence` | number (float) | | | | `ocrData.ocrDataConfidence.maritalStatusConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.raceConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.taxIdNumberConfidence` | number (float) | | | | `ocrData.ocrDataConfidence.jurisdictionCodeConfidence` | number (float) | | | | `ocrData.additionalDocumentAttempts` | array[AdditionalDocumentAttemptDto] | | | | `ocrData.additionalDocumentAttempts.status` | string | | Enum: `SUCCESS`, `VALIDATION_ERROR`, `FAIL` | | `ocrData.additionalDocumentAttempts.attemptTimestamp` | integer (int64) | | | | `ocrData.additionalDocumentAttempts.imagesUrl` | array[string] | | | | `ocrData.additionalDocumentAttempts.attemptType` | string | | Enum: `POA`, `DOCUMENT_CAPTURE` | | `ocrData.additionalDocumentAttempts.antiSpoofResult` | PoaAntiSpoofResult | | | | `ocrData.additionalDocumentAttempts.antiSpoofResult.status` | string | | Enum: `PASS`, `FAIL`, `NOT_EXECUTED` | | `ocrData.additionalDocumentAttempts.antiSpoofResult.kinds` | array[string] | | | | `ocrData.additionalDocumentAttempts.antiSpoofResult.confidence` | number (float) | | | | `ocrData.additionalDocumentAttempts.antiSpoofResult.details` | array[Detail] | | | | `ocrData.additionalDocumentAttempts.antiSpoofResult.details.kind` | string | | | | `ocrData.additionalDocumentAttempts.antiSpoofResult.details.error` | string | | | | `ocrData.additionalDocumentAttempts.antiSpoofResult.details.loc` | string | | | | `ocrData.additionalDocumentAttempts.antiSpoofResult.details.explanation` | string | | | | `ocrData.additionalDocumentAttempts.documentType` | string | yes | | | `ocrData.documentSubmissionMethod` | string | | Method used to submit the document. Enum: `CAPTURED_DOCUMENT`, `UPLOADED_FILE`, `IMPORTED_CREDENTIAL` | | `ocrData.credentialsProvider` | string | | Credentials provider used when documentSubmissionMethod is IMPORTED_CREDENTIAL. Enum: `APPLE`, `GOOGLE`, `DIGILOCKER`, `SAMSUNG`, `TRINSIC`, `NETHERLANDS_IDIN`, `FINNISH_TRUST_NETWORK` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/ocr-data/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/ocr-data/v2", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/ocr-data/v2", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/ocr-data/v2")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "ocrData": { "name": { "fullName": "string", "fullNameNativeScript": "string", "firstNameNativeScript": "string", "paternalLastNameNativeScript": "string", "maternalLastNameNativeScript": "string", "machineReadableFullName": "string", "firstName": "string", "middleName": "string", "givenName": "string", "givenNameMrz": "string", "initials": "string", "nameSuffix": "string", "paternalLastName": "string", "maternalLastName": "string", "lastNameMrz": "string", "familyName": "string" }, "address": "string", "addressFields": { "street": "string", "streetName": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string", "exteriorNumber": "string", "interiorNumber": "string", "addressLine1": "string", "streetType": "string" }, "fullAddress": true, "invalidAddress": true, "checkedAddress": "string", "checkedAddressBean": { "street": "string", "streetName": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string", "exteriorNumber": "string", "interiorNumber": "string", "addressLine1": "string", "streetType": "string" }, "exteriorNumber": "string", "interiorNumber": "string", "addressFromStatement": "string", "addressFieldsFromStatement": { "street": "string", "streetName": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string", "exteriorNumber": "string", "interiorNumber": "string", "addressLine1": "string", "streetType": "string" }, "invalidAddressFromStatement": true, "addressStatementEmissionDate": 0, "documentType": "a1", "addressStatementTimestamps": [ { "get_version": 0, "dateType": "string", "addressStatementTimestamp": 0 } ], "poaName": "string", "typeOfId": "Unknown", "documentFrontSubtype": "string", "documentBackSubtype": "string", "issueFront": 0, "issueBack": 0, "birthDate": 0, "gender": "M", "claveDeElector": "string", "curp": "string", "numeroEmisionCredencial": "string", "cic": "string", "ocr": "string", "documentNumber": "string", "documentNumberSource": "FORM", "personalNumber": "string", "nationalNumber": "string", "refNumber": "string", "taxIdNumber": "string", "nue": "string", "externalId": "string", "issuedAt": "string", "expireAt": "string", "expirationDate": 0, "issueDate": 0, "registrationDate": 0, "dlClassDetails": [ { "dlClass": "string", "validFromDate": 0, "validToDate": 0, "additionalCodes": "string", "restrictions": [ "string" ] } ], "issuingCountry": "string", "issuingState": "string", "birthPlace": "string", "printingNumber": "string", "duplicateNumber": "string", "preparationNumber": "string", "issuingAuthority": "string", "height": "string", "weight": "string", "eyeColor": "string", "hairColor": "string", "religion": "string", "bloodType": "string", "maritalStatus": "string", "nationality": "string", "race": "string", "nationalityMrz": "string", "nationalityAlpha3": "string", "governmentComparisonResults": { "paternalLastNameValid": true, "maternalLastNameValid": true, "firstNameValid": true, "curpValid": true, "ineCurpValid": true, "ocrValid": true, "claveDeElectorValid": true, "numeroEmisionCredencialValid": true, "registrationDateValid": true, "issueDateValid": true }, "notExtracted": 0, "notExtractedDetails": [ "string" ], "classes": "string", "cond": "string", "mentions": "string", "restrictions": "string", "mrz1": "string", "mrz2": "string", "mrz3": "string", "fullNameMrz": "string", "documentNumberCheckDigit": "string", "dateOfBirthCheckDigit": "string", "expirationDateCheckDigit": "string", "barcodeRawData": "string", "fathersName": "string", "mothersName": "string", "fathersIdNumber": "string", "mothersIdNumber": "string", "spouseName": "string", "federalRevenueNumber": "string", "originDocumentId": "string", "driversLicenseCategory": "string", "controlNumber": "string", "renach": "string", "additionalAttrs": [ "DOCUMENTO_INFANTIL" ], "ocrDataConfidence": { "birthDateConfidence": 0, "nameConfidence": 0, "nameNativeScriptConfidence": 0, "firstNameNativeScriptConfidence": 0, "paternalLastNameNativeScriptConfidence": 0, "maternalLastNameNativeScriptConfidence": 0, "givenNameConfidence": 0, "firstNameConfidence": 0, "middleNameConfidence": 0, "nameSuffixConfidence": 0, "mothersSurnameConfidence": 0, "fathersSurnameConfidence": 0, "nickNameConfidence": 0, "fullNameMrzConfidence": 0, "mothersNameConfidence": 0, "fathersNameConfidence": 0, "mothersIdNumberConfidence": 0, "fathersIdNumberConfidence": 0, "spouseNameConfidence": 0, "birthNameConfidence": 0, "addressConfidence": 0, "streetConfidence": 0, "colonyConfidence": 0, "postalCodeConfidence": 0, "cityConfidence": 0, "stateConfidence": 0, "districtConfidence": 0, "stateCodeConfidence": 0, "countryCodeConfidence": 0, "genderConfidence": 0, "issueDateConfidence": 0, "expirationDateConfidence": 0, "issuedAtConfidence": 0, "expireAtConfidence": 0, "issuingAuthorityConfidence": 0, "mrz1Confidence": 0, "mrz2Confidence": 0, "mrz3Confidence": 0, "mrzFullConfidence": 0, "documentNumberConfidence": 0, "backNumberConfidence": 0, "personalNumberConfidence": 0, "nationalNumberConfidence": 0, "claveDeElectorConfidence": 0, "numeroEmisionCredencialConfidence": 0, "curpConfidence": 0, "nueConfidence": 0, "registrationDateConfidence": 0, "heightConfidence": 0, "birthPlaceConfidence": 0, "bloodTypeConfidence": 0, "eyeColorConfidence": 0, "classesConfidence": 0, "condConfidence": 0, "mentionsConfidence": 0, "refNumberConfidence": 0, "weightConfidence": 0, "hairConfidence": 0, "restrictionsConfidence": 0, "nationalityConfidence": 0, "nationalityMrzConfidence": 0, "nationalityAlpha3Confidence": 0, "maritalStatusConfidence": 0, "raceConfidence": 0, "taxIdNumberConfidence": 0, "jurisdictionCodeConfidence": 0 }, "additionalDocumentAttempts": [ { "status": "SUCCESS", "attemptTimestamp": 0, "imagesUrl": [ "string" ], "attemptType": "POA", "antiSpoofResult": { "status": "PASS", "kinds": [ "string" ], "confidence": 0, "details": [ { "kind": null, "error": null, "loc": null, "explanation": null } ] }, "documentType": "string" } ], "documentSubmissionMethod": "CAPTURED_DOCUMENT", "credentialsProvider": "APPLE" } } ``` --- - Path: `api-reference/get-onboarding-status` - URL: https://developer.incode.com/api-reference/get-onboarding-status/ - Markdown: https://developer.incode.com/api-reference/get-onboarding-status.md - Endpoint: `GET /omni/get/onboarding/status` # Fetch onboarding status `GET /omni/get/onboarding/status` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Check the status of onboarding session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Represents interview id for which status is requested. If it is not present it will be read from token. | | `api-version` | header | string | yes | | ## Responses ### 200 onboardingStatus: String. A flag indicating current status of onboarding session. Possible values: - ID_VALIDATION_FINISHED - User finished with capturing of ID, - POST_PROCESSING_FINISHED - ID postprocessing finished on server, - FACE_VALIDATION_FINISHED - User finished with selfie capture, - ONBOARDING_FINISHED - User finished onboarding process, - MANUAL_REVIEW_APPROVED - Session that was in Needs Review state, manually approved by Executive, - MANUAL_REVIEW_REJECTED - Session that was in Needs Review state, manually rejected by Executive, - UNKNOWN - Unable to determine status of onboarding session - user still didn't start onboarding or user is still in the process of capturing ID. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/onboarding/status \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/onboarding/status", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/onboarding/status", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/onboarding/status")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/get-phone` - URL: https://developer.incode.com/api-reference/get-phone/ - Markdown: https://developer.incode.com/api-reference/get-phone.md - Endpoint: `GET /omni/get/phone` # Get phone `GET /omni/get/phone` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment > **Deprecated** — this endpoint is marked deprecated in the Omni API specification. Get the phone previously added to the interview. Deprecated, use GET /phone instead. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `phone` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/phone \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/phone", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/phone", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/phone")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "phone": "string" } ``` --- - Path: `api-reference/get-postprocess-isfinished` - URL: https://developer.incode.com/api-reference/get-postprocess-isfinished/ - Markdown: https://developer.incode.com/api-reference/get-postprocess-isfinished.md - Endpoint: `GET /omni/get/postprocess/isfinished` # Fetch processing status `GET /omni/get/postprocess/isfinished` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Check if session processing is done. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 finished: Boolean. A flag stating if processing is done or not. ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/postprocess/isfinished \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/postprocess/isfinished", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/postprocess/isfinished", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/postprocess/isfinished")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/get-process-batch-status` - URL: https://developer.incode.com/api-reference/get-process-batch-status/ - Markdown: https://developer.incode.com/api-reference/get-process-batch-status.md - Endpoint: `GET /omni/get/process-batch-status` # Get batch processing status `GET /omni/get/process-batch-status` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns the status of the [/omni/process/batch](#/Onboarding/processBatch) progress ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 OK ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/process-batch-status \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/process-batch-status", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/process-batch-status", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/process-batch-status")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/get-questionandanswer` - URL: https://developer.incode.com/api-reference/get-questionandanswer/ - Markdown: https://developer.incode.com/api-reference/get-questionandanswer.md - Endpoint: `GET /omni/get/questionAndAnswer` # Fetch random questions and answers for video selfie `GET /omni/get/questionAndAnswer` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch a number random questions and answers for video selfie for given apiKey. If there are no defined QA pairs for the apiKey, a random QA pair is returned from the default set. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `numberOfQuestions` | query | integer (int32) | yes | Number of questions to be returned to client | | `returnVoiceConsentQuestion` | query | boolean | | Flag stating if voice consent question should be included in response | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `questionAndAnswers` | array[QuestionAndAnswerWithId] | | | | `questionAndAnswers.id` | string | | ID of the given Question-Answer pair. | | `questionAndAnswers.question` | string | | Random question to be shown in video selfie. | | `questionAndAnswers.answer` | string | | Corresponding answer to the question. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/questionAndAnswer \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/questionAndAnswer", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/questionAndAnswer", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/questionAndAnswer")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "questionAndAnswers": [ { "id": "string", "question": "string", "answer": "string" } ] } ``` --- - Path: `api-reference/get-raw-idv-results` - URL: https://developer.incode.com/api-reference/get-raw-idv-results/ - Markdown: https://developer.incode.com/api-reference/get-raw-idv-results.md - Endpoint: `GET /omni/get/raw-idv-results` # Fetch raw IDV results `GET /omni/get/raw-idv-results` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns raw id-validation-service check results with original naming preserved (no mapping to user-service key constants, no threshold-binarization), plus the raw checkFraudRisk result. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Id of interview for which raw IDV results are requested. If not present, it will be extracted from token. | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `checkResults` | array[RawIdvCheckResultDto] | | Raw id-validation-service check results. Empty when id-validation-service was not invoked for the interview. | | `checkResults.name` | string | | Original id-validation-service check name, e.g. checkIdFaceTamper, checkIdScreenLiveness, deep_fraud. | | `checkResults.severity` | string | | Check severity: low / medium / high. Enum: `low`, `medium`, `high` | | `checkResults.version` | string | | Model version that produced the result. | | `checkResults.result` | number (float) | | Raw confidence/result value, Float in [0, 1]. Nullable when the check did not run. | | `fraudRisk` | FraudRiskDto | | Raw checkFraudRisk result. Null when no FraudRisk was produced for the interview. | | `fraudRisk.name` | string | | Check name, always checkFraudRisk. | | `fraudRisk.severity` | string | | Check severity: low / medium / high. Enum: `LOW`, `MEDIUM`, `HIGH` | | `fraudRisk.version` | string | | Model version that produced the result. | | `fraudRisk.result` | number | | Raw fraud-risk result value (full precision). | | `fraudRisk.responseText` | string | | Free-text explanation returned by the fraud-risk model. | | `fraudRisk.responseCategory` | string | | Response category returned by the fraud-risk model. | | `fraudRisk.topNFraudFeatures` | array[string] | | Top N features that contributed towards a fraud classification. | | `fraudRisk.topNLegitFeatures` | array[string] | | Top N features that contributed towards a legitimate classification. | | `fraudRisk.topNFraudCodes` | array[string] | | Raw stable feature codes for topNFraudFeatures (same order), as sent by the model. | | `fraudRisk.topNLegitCodes` | array[string] | | Raw stable feature codes for topNLegitFeatures (same order), as sent by the model. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/raw-idv-results \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/raw-idv-results", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/raw-idv-results", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/raw-idv-results")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "checkResults": [ { "name": "string", "severity": "low", "version": "string", "result": 0 } ], "fraudRisk": { "name": "string", "severity": "LOW", "version": "string", "result": 0, "responseText": "string", "responseCategory": "string", "topNFraudFeatures": [ "string" ], "topNLegitFeatures": [ "string" ], "topNFraudCodes": [ "string" ], "topNLegitCodes": [ "string" ] } } ``` --- - Path: `api-reference/get-score` - URL: https://developer.incode.com/api-reference/get-score/ - Markdown: https://developer.incode.com/api-reference/get-score.md - Endpoint: `GET /omni/get/score` # Fetch scores `GET /omni/get/score` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Get id validation, liveness and face recognition results for given interviewId. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Id of onboarding for which score is requests. If not present, it will be extracted from token. | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `authentication` | AuthenticationDto | | The result of authentication containing overall score and list of executed checks. | | `authentication.overall` | ResultBean | | Composite result for authentication score. | | `authentication.overall.value` | string | | | | `authentication.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `authentication.identityId` | string | | | | `authentication.appliedRule` | AppliedFlowRule | | Specific rule from rule engine | | `authentication.appliedRule.name` | string | | Name of the rule. | | `authentication.appliedRule.expression` | string | | A logical expression of the rule. | | `authentication.appliedRule.ruleType` | string | | Enum: `idValidation`, `secondIdValidation`, `faceValidation`, `liveness`, `deepsight`, `eKyc`, `videoselfie`, `faceAuthentication`, `total`, `phoneRisk`, `emailRisk`, `governmentValidation` | | `authentication.appliedRule.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `idValidation` | IdValidation | | Id validation of its overall score and two lists of executed tests and checks | | `idValidation.photoSecurityAndQuality` | array[IdResultBean] | | | | `idValidation.photoSecurityAndQuality.value` | string | | | | `idValidation.photoSecurityAndQuality.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `idValidation.photoSecurityAndQuality.key` | string | | | | `idValidation.idSpecific` | array[IdResultBean] | | | | `idValidation.idSpecific.value` | string | | | | `idValidation.idSpecific.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `idValidation.idSpecific.key` | string | | | | `idValidation.customFields` | array[IdResultBean] | | | | `idValidation.customFields.value` | string | | | | `idValidation.customFields.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `idValidation.customFields.key` | string | | | | `idValidation.appliedRule` | AppliedFlowRule | | Specific rule from rule engine | | `idValidation.appliedRule.name` | string | | Name of the rule. | | `idValidation.appliedRule.expression` | string | | A logical expression of the rule. | | `idValidation.appliedRule.ruleType` | string | | Enum: `idValidation`, `secondIdValidation`, `faceValidation`, `liveness`, `deepsight`, `eKyc`, `videoselfie`, `faceAuthentication`, `total`, `phoneRisk`, `emailRisk`, `governmentValidation` | | `idValidation.appliedRule.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `idValidation.overall` | ResultBean | | | | `idValidation.overall.value` | string | | | | `idValidation.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `antifraud` | AntifraudScoreValidation | | The result of antifraud check where we compare the current interview with existing interviews and customers and detect anomalies than could be signs of fraud | | `antifraud.overall` | ResultBean | | | | `antifraud.overall.value` | string | | | | `antifraud.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `secondIdValidation` | IdValidation | | Same as idValidation only applicable if onboarding is configured to capture a second id | | `secondIdValidation.photoSecurityAndQuality` | array[IdResultBean] | | | | `secondIdValidation.photoSecurityAndQuality.value` | string | | | | `secondIdValidation.photoSecurityAndQuality.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `secondIdValidation.photoSecurityAndQuality.key` | string | | | | `secondIdValidation.idSpecific` | array[IdResultBean] | | | | `secondIdValidation.idSpecific.value` | string | | | | `secondIdValidation.idSpecific.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `secondIdValidation.idSpecific.key` | string | | | | `secondIdValidation.customFields` | array[IdResultBean] | | | | `secondIdValidation.customFields.value` | string | | | | `secondIdValidation.customFields.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `secondIdValidation.customFields.key` | string | | | | `secondIdValidation.appliedRule` | AppliedFlowRule | | Specific rule from rule engine | | `secondIdValidation.appliedRule.name` | string | | Name of the rule. | | `secondIdValidation.appliedRule.expression` | string | | A logical expression of the rule. | | `secondIdValidation.appliedRule.ruleType` | string | | Enum: `idValidation`, `secondIdValidation`, `faceValidation`, `liveness`, `deepsight`, `eKyc`, `videoselfie`, `faceAuthentication`, `total`, `phoneRisk`, `emailRisk`, `governmentValidation` | | `secondIdValidation.appliedRule.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `secondIdValidation.overall` | ResultBean | | | | `secondIdValidation.overall.value` | string | | | | `secondIdValidation.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `liveness` | LivenessDto | | | | `liveness.hasHeadCover` | ResultBean | | Returns flag if the hat/cap is detected on the image. Only if hats detected option is configured | | `liveness.hasHeadCover.value` | string | | | | `liveness.hasHeadCover.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `liveness.hasClosedEyes` | ResultBean | | Returns flag if closed eyes is detected on the image. Only if hats detected option is configured | | `liveness.hasClosedEyes.value` | string | | | | `liveness.hasClosedEyes.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `liveness.physicalAttack` | ResultBean | | Returns flag if physical attack is detected. Only if this option is configured | | `liveness.physicalAttack.value` | string | | | | `liveness.physicalAttack.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `liveness.digitalAttack` | ResultBean | | Returns flag if digital attack is detected. Only if this option is configured | | `liveness.digitalAttack.value` | string | | | | `liveness.digitalAttack.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `liveness.evasionAttack` | ResultBean | | Returns flag if evasion attack is detected. Only if this option is configured | | `liveness.evasionAttack.value` | string | | | | `liveness.evasionAttack.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `liveness.deepfakeAttack` | ResultBean | | Returns flag if deepfake attack is detected. Only if digital attack is configured | | `liveness.deepfakeAttack.value` | string | | | | `liveness.deepfakeAttack.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `liveness.digitalManipulationAttack` | ResultBean | | Returns flag if digital manipulation attack is detected. Only if digital attack is configured | | `liveness.digitalManipulationAttack.value` | string | | | | `liveness.digitalManipulationAttack.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `liveness.appliedRule` | AppliedFlowRule | | Information about applied rule | | `liveness.appliedRule.name` | string | | Name of the rule. | | `liveness.appliedRule.expression` | string | | A logical expression of the rule. | | `liveness.appliedRule.ruleType` | string | | Enum: `idValidation`, `secondIdValidation`, `faceValidation`, `liveness`, `deepsight`, `eKyc`, `videoselfie`, `faceAuthentication`, `total`, `phoneRisk`, `emailRisk`, `governmentValidation` | | `liveness.appliedRule.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `liveness.spoofDetectionMethod` | string | | Information about method used Enum: `SF`, `SF_MM`, `SF_MM_V` | | `liveness.overall` | ResultBean | | Composite result for liveness score. | | `liveness.overall.value` | string | | | | `liveness.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `liveness.livenessScore` | ResultBean | | Returns flag if physical attack is detected. Only if this option is configured. Deprecated, use 'physicalAttack' instead. | | `liveness.livenessScore.value` | string | | | | `liveness.livenessScore.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight` | DeepsightScoreDto | | | | `deepsight.multimodalIntelligence` | MultimodalIntelligenceDto | | | | `deepsight.multimodalIntelligence.physicalAttack` | ResultBean | | | | `deepsight.multimodalIntelligence.physicalAttack.value` | string | | | | `deepsight.multimodalIntelligence.physicalAttack.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.multimodalIntelligence.digitalAttack` | ResultBean | | | | `deepsight.multimodalIntelligence.digitalAttack.value` | string | | | | `deepsight.multimodalIntelligence.digitalAttack.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.multimodalIntelligence.deepfakeAttack` | ResultBean | | | | `deepsight.multimodalIntelligence.deepfakeAttack.value` | string | | | | `deepsight.multimodalIntelligence.deepfakeAttack.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.multimodalIntelligence.digitalManipulationAttack` | ResultBean | | | | `deepsight.multimodalIntelligence.digitalManipulationAttack.value` | string | | | | `deepsight.multimodalIntelligence.digitalManipulationAttack.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.multimodalIntelligence.evasionAttack` | ResultBean | | | | `deepsight.multimodalIntelligence.evasionAttack.value` | string | | | | `deepsight.multimodalIntelligence.evasionAttack.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.multimodalIntelligence.spoofDetectionMethod` | string | | Enum: `SF`, `SF_MM`, `SF_MM_V` | | `deepsight.multimodalIntelligence.faceExplanation` | SpoofResultExplanationDto | | | | `deepsight.multimodalIntelligence.faceExplanation.description` | string | | | | `deepsight.multimodalIntelligence.faceExplanation.keywords` | SpoofDetectionExplanationKeywordsDto | | | | `deepsight.multimodalIntelligence.faceExplanation.keywords.category` | string | | | | `deepsight.multimodalIntelligence.faceExplanation.keywords.isDepthFlat` | boolean | | | | `deepsight.multimodalIntelligence.faceExplanation.keywords.isVideoCorrupted` | boolean | | | | `deepsight.multimodalIntelligence.faceOverall` | ResultBean | | | | `deepsight.multimodalIntelligence.faceOverall.value` | string | | | | `deepsight.multimodalIntelligence.faceOverall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.multimodalIntelligence.aiGeneratedDocument` | ResultBean | | | | `deepsight.multimodalIntelligence.aiGeneratedDocument.value` | string | | | | `deepsight.multimodalIntelligence.aiGeneratedDocument.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.multimodalIntelligence.visualAnomaly` | ResultBean | | | | `deepsight.multimodalIntelligence.visualAnomaly.value` | string | | | | `deepsight.multimodalIntelligence.visualAnomaly.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.multimodalIntelligence.documentOverall` | ResultBean | | | | `deepsight.multimodalIntelligence.documentOverall.value` | string | | | | `deepsight.multimodalIntelligence.documentOverall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.multimodalIntelligence.overall` | ResultBean | | | | `deepsight.multimodalIntelligence.overall.value` | string | | | | `deepsight.multimodalIntelligence.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.deviceTrust` | DeviceTrustScoreDto | | | | `deepsight.deviceTrust.overall` | ResultBean | | | | `deepsight.deviceTrust.overall.value` | string | | | | `deepsight.deviceTrust.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.behavioralTrust` | BehavioralTrustScoreDto | | | | `deepsight.behavioralTrust.overall` | ResultBean | | | | `deepsight.behavioralTrust.overall.value` | string | | | | `deepsight.behavioralTrust.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.cameraTrust` | CameraTrustScoreDto | | | | `deepsight.cameraTrust.overall` | ResultBean | | | | `deepsight.cameraTrust.overall.value` | string | | | | `deepsight.cameraTrust.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.overall` | ResultBean | | | | `deepsight.overall.value` | string | | | | `deepsight.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `deepsight.appliedRule` | AppliedFlowRule | | Specific rule from rule engine | | `deepsight.appliedRule.name` | string | | Name of the rule. | | `deepsight.appliedRule.expression` | string | | A logical expression of the rule. | | `deepsight.appliedRule.ruleType` | string | | Enum: `idValidation`, `secondIdValidation`, `faceValidation`, `liveness`, `deepsight`, `eKyc`, `videoselfie`, `faceAuthentication`, `total`, `phoneRisk`, `emailRisk`, `governmentValidation` | | `deepsight.appliedRule.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceCaptureAssessment` | FaceCaptureAssessmentScoreDto | | | | `faceCaptureAssessment.faceAttributes` | FaceAttributesScoreDto | | Contains face attributes | | `faceCaptureAssessment.faceAttributes.maskCheck` | ResultBean | | Shows info if the user was wearing a mask during selfie capture | | `faceCaptureAssessment.faceAttributes.maskCheck.value` | string | | | | `faceCaptureAssessment.faceAttributes.maskCheck.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceCaptureAssessment.faceAttributes.lensesCheck` | ResultBean | | Shows info if the user was wearing lenses during selfie capture | | `faceCaptureAssessment.faceAttributes.lensesCheck.value` | string | | | | `faceCaptureAssessment.faceAttributes.lensesCheck.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceCaptureAssessment.faceAttributes.hasHeadCover` | ResultBean | | Returns flag if the hat/cap is detected on the image. Only if hats detected option is configured | | `faceCaptureAssessment.faceAttributes.hasHeadCover.value` | string | | | | `faceCaptureAssessment.faceAttributes.hasHeadCover.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceCaptureAssessment.faceAttributes.hasClosedEyes` | ResultBean | | Returns flag if closed eyes is detected on the image. Only if hats detected option is configured | | `faceCaptureAssessment.faceAttributes.hasClosedEyes.value` | string | | | | `faceCaptureAssessment.faceAttributes.hasClosedEyes.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceCaptureAssessment.faceAttributes.faceOcclusion` | ResultBean | | Returns flag if captured face is occluded on the image. Only if hats detected option is configured | | `faceCaptureAssessment.faceAttributes.faceOcclusion.value` | string | | | | `faceCaptureAssessment.faceAttributes.faceOcclusion.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceCaptureAssessment.qualityChecks` | QualityChecksScoreDto | | Contains quality checks | | `faceCaptureAssessment.qualityChecks.faceBrightness` | ResultBean | | Shows status of brightness during selfie capture | | `faceCaptureAssessment.qualityChecks.faceBrightness.value` | string | | | | `faceCaptureAssessment.qualityChecks.faceBrightness.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceCaptureAssessment.qualityChecks.imageQuality` | ResultBean | | Shows status of image quality check | | `faceCaptureAssessment.qualityChecks.imageQuality.value` | string | | | | `faceCaptureAssessment.qualityChecks.imageQuality.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognition` | FaceRecognitionDto | | | | `faceRecognition.existingUser` | boolean | | Flag indicating if a user is already enrolled | | `faceRecognition.customerId` | string | | Id of enrolled user | | `faceRecognition.existingInterviewId` | string | | Session ID, in case the user is approved in another session | | `faceRecognition.existingExternalId` | string | | External ID, in case the user is approved in another session | | `faceRecognition.maskCheck` | ResultBean | | Shows info if the user was wearing a mask during selfie capture | | `faceRecognition.maskCheck.value` | string | | | | `faceRecognition.maskCheck.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognition.lensesCheck` | ResultBean | | Shows info if the user was wearing lenses during selfie capture | | `faceRecognition.lensesCheck.value` | string | | | | `faceRecognition.lensesCheck.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognition.faceBrightness` | ResultBean | | Shows status and level of brightness during selfie capture | | `faceRecognition.faceBrightness.value` | string | | | | `faceRecognition.faceBrightness.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognition.imageQuality` | ResultBean | | Shows image quality during selfie capture | | `faceRecognition.imageQuality.value` | string | | | | `faceRecognition.imageQuality.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognition.nameMatch` | ResultBean | | Shows if the name matches the previously used (only in case the user is already approved in another session) | | `faceRecognition.nameMatch.value` | string | | | | `faceRecognition.nameMatch.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognition.appliedRule` | AppliedFlowRuleDto | | Specific rule from rule engine for faceValidation | | `faceRecognition.appliedRule.name` | string | | Name of the rule. | | `faceRecognition.appliedRule.expression` | string | | A logical expression of the rule. | | `faceRecognition.appliedRule.ruleType` | string | | Enum: `idValidation`, `secondIdValidation`, `faceValidation`, `liveness`, `deepsight`, `eKyc`, `videoselfie`, `faceAuthentication`, `total`, `phoneRisk`, `emailRisk`, `governmentValidation` | | `faceRecognition.appliedRule.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognition.overall` | ResultBean | | Shows how much face from ID matches the selfie | | `faceRecognition.overall.value` | string | | | | `faceRecognition.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognition.hasHeadCover` | ResultBean | | Returns flag if the hat/cap is detected on the image. Only if hats detected option is configured | | `faceRecognition.hasHeadCover.value` | string | | | | `faceRecognition.hasHeadCover.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognition.hasClosedEyes` | ResultBean | | Returns flag if closed eyes is detected on the image. Only if hats detected option is configured | | `faceRecognition.hasClosedEyes.value` | string | | | | `faceRecognition.hasClosedEyes.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognition.faceOcclusion` | ResultBean | | Returns flag if captured face is occluded on the image. Only if hats detected option is configured | | `faceRecognition.faceOcclusion.value` | string | | | | `faceRecognition.faceOcclusion.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognitionSecondId` | FaceRecognitionDto | | Same as faceRecognition only applicable if onboarding is configured to capture a second id | | `faceRecognitionSecondId.existingUser` | boolean | | Flag indicating if a user is already enrolled | | `faceRecognitionSecondId.customerId` | string | | Id of enrolled user | | `faceRecognitionSecondId.existingInterviewId` | string | | Session ID, in case the user is approved in another session | | `faceRecognitionSecondId.existingExternalId` | string | | External ID, in case the user is approved in another session | | `faceRecognitionSecondId.maskCheck` | ResultBean | | Shows info if the user was wearing a mask during selfie capture | | `faceRecognitionSecondId.maskCheck.value` | string | | | | `faceRecognitionSecondId.maskCheck.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognitionSecondId.lensesCheck` | ResultBean | | Shows info if the user was wearing lenses during selfie capture | | `faceRecognitionSecondId.lensesCheck.value` | string | | | | `faceRecognitionSecondId.lensesCheck.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognitionSecondId.faceBrightness` | ResultBean | | Shows status and level of brightness during selfie capture | | `faceRecognitionSecondId.faceBrightness.value` | string | | | | `faceRecognitionSecondId.faceBrightness.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognitionSecondId.imageQuality` | ResultBean | | Shows image quality during selfie capture | | `faceRecognitionSecondId.imageQuality.value` | string | | | | `faceRecognitionSecondId.imageQuality.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognitionSecondId.nameMatch` | ResultBean | | Shows if the name matches the previously used (only in case the user is already approved in another session) | | `faceRecognitionSecondId.nameMatch.value` | string | | | | `faceRecognitionSecondId.nameMatch.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognitionSecondId.appliedRule` | AppliedFlowRuleDto | | Specific rule from rule engine for faceValidation | | `faceRecognitionSecondId.appliedRule.name` | string | | Name of the rule. | | `faceRecognitionSecondId.appliedRule.expression` | string | | A logical expression of the rule. | | `faceRecognitionSecondId.appliedRule.ruleType` | string | | Enum: `idValidation`, `secondIdValidation`, `faceValidation`, `liveness`, `deepsight`, `eKyc`, `videoselfie`, `faceAuthentication`, `total`, `phoneRisk`, `emailRisk`, `governmentValidation` | | `faceRecognitionSecondId.appliedRule.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognitionSecondId.overall` | ResultBean | | Shows how much face from ID matches the selfie | | `faceRecognitionSecondId.overall.value` | string | | | | `faceRecognitionSecondId.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognitionSecondId.hasHeadCover` | ResultBean | | Returns flag if the hat/cap is detected on the image. Only if hats detected option is configured | | `faceRecognitionSecondId.hasHeadCover.value` | string | | | | `faceRecognitionSecondId.hasHeadCover.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognitionSecondId.hasClosedEyes` | ResultBean | | Returns flag if closed eyes is detected on the image. Only if hats detected option is configured | | `faceRecognitionSecondId.hasClosedEyes.value` | string | | | | `faceRecognitionSecondId.hasClosedEyes.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `faceRecognitionSecondId.faceOcclusion` | ResultBean | | Returns flag if captured face is occluded on the image. Only if hats detected option is configured | | `faceRecognitionSecondId.faceOcclusion.value` | string | | | | `faceRecognitionSecondId.faceOcclusion.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `governmentValidation` | GovernmentValidation | | - recognitionConfidence: Only present in case face validation is performed as a part of government check - fingerprintConfidence: Only present in case fingerprint validation is performed as a part of government check - minimumPassingFingerprints: Only present in case fingerprint validation is performed. Maps to configured number of minimum fingerprints configured at the time of score calculation. - validationStatus: Possible values: processingIne, ok, validationError, ineConnectionError, ineInfrastructureError, moduleNotSupported, missingDocumentId, missingSelfie, userNotFound, userNotFoundInIneDb, notEnoughData, livenessFail, ineNotCurrent, ineReportedLost, ineReportedStolen, ineSignaturError, transactionLimitReached, geographicRegionNotSupported Key-value mapping: - -1: processingIne - 0: ok - 1: validationError - 2: ineConnectionError - 3: ineInfrastructureError - 4: moduleNotSupported - 5: missingDocumentId - 6: missingSelfie - 7: userNotFound - 8: userNotFoundInIneDb - 9: notEnoughData - 10: livenessFail - 11: ineNotCurrent - 12: ineReportedLost - 13: ineReportedStolen - 14: ineSignaturError - 99: geographicRegionNotSupported - 205: transactionLimitReached - ocrValidation: List of value, status, key objects. Not all of the following keys are always present: issueDate firstName, maternalLastName, paternalLastName, ocr, personalId, electorsKey, emissionNumber, registrationDate - ocrValidationOverall: Composite result for ocrValidation score - overall | | `governmentValidation.recognitionConfidence` | ResultBean | | | | `governmentValidation.recognitionConfidence.value` | string | | | | `governmentValidation.recognitionConfidence.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `governmentValidation.fingerprintConfidence` | ResultBean | | | | `governmentValidation.fingerprintConfidence.value` | string | | | | `governmentValidation.fingerprintConfidence.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `governmentValidation.minimumPassingFingerprints` | integer (int32) | | | | `governmentValidation.validationStatus` | IdResultBean | | | | `governmentValidation.validationStatus.value` | string | | | | `governmentValidation.validationStatus.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `governmentValidation.validationStatus.key` | string | | | | `governmentValidation.ocrValidation` | array[IdResultBean] | | | | `governmentValidation.ocrValidation.value` | string | | | | `governmentValidation.ocrValidation.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `governmentValidation.ocrValidation.key` | string | | | | `governmentValidation.ocrValidationOverall` | ResultBean | | | | `governmentValidation.ocrValidationOverall.value` | string | | | | `governmentValidation.ocrValidationOverall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `governmentValidation.overall` | ResultBean | | | | `governmentValidation.overall.value` | string | | | | `governmentValidation.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `governmentValidation.provider` | string | | | | `governmentValidation.appliedRule` | AppliedFlowRule | | Specific rule from rule engine | | `governmentValidation.appliedRule.name` | string | | Name of the rule. | | `governmentValidation.appliedRule.expression` | string | | A logical expression of the rule. | | `governmentValidation.appliedRule.ruleType` | string | | Enum: `idValidation`, `secondIdValidation`, `faceValidation`, `liveness`, `deepsight`, `eKyc`, `videoselfie`, `faceAuthentication`, `total`, `phoneRisk`, `emailRisk`, `governmentValidation` | | `governmentValidation.appliedRule.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `videoConference` | VideoSelfie | | - speechTranscript: Extracted text from speech, during video recording - videoSelfieLiveness: Shows liveness confidence that the person is real based on video conference - videoSelfieFaceRecognition: Shows how much face from id matches the video conference capture - speechRecognition: This shows how much the recognized speech matches the expected result - score: Overall video recording score | | `videoConference.speechTranscript` | string | | | | `videoConference.speechTranscriptWhisper` | string | | | | `videoConference.videoSelfieLiveness` | ResultBean | | | | `videoConference.videoSelfieLiveness.value` | string | | | | `videoConference.videoSelfieLiveness.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `videoConference.videoSelfieFaceRecognition` | ResultBean | | | | `videoConference.videoSelfieFaceRecognition.value` | string | | | | `videoConference.videoSelfieFaceRecognition.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `videoConference.speechRecognition` | ResultBean | | | | `videoConference.speechRecognition.value` | string | | | | `videoConference.speechRecognition.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `videoConference.score` | ResultBean | | | | `videoConference.score.value` | string | | | | `videoConference.score.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `videoConference.appliedRule` | AppliedFlowRule | | Specific rule from rule engine | | `videoConference.appliedRule.name` | string | | Name of the rule. | | `videoConference.appliedRule.expression` | string | | A logical expression of the rule. | | `videoConference.appliedRule.ruleType` | string | | Enum: `idValidation`, `secondIdValidation`, `faceValidation`, `liveness`, `deepsight`, `eKyc`, `videoselfie`, `faceAuthentication`, `total`, `phoneRisk`, `emailRisk`, `governmentValidation` | | `videoConference.appliedRule.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `curpVerification` | CurpResponse | | Only for Mex documents, in case CURP validation was performed | | `curpVerification.success` | boolean | | Flag indicating request passed successfully. | | `curpVerification.curp` | string | | Curp | | `curpVerification.sex` | string | | Sex Enum: `Mujer`, `Hombre`, `X` | | `curpVerification.nationality` | string | | Nationality | | `curpVerification.result` | string | | | | `curpVerification.transactionId` | string | | | | `curpVerification.renapo_valid` | boolean | | Flag indicating if CURP validation passed - tipoError present in response | | `curpVerification.names` | string | | Names | | `curpVerification.paternal_surname` | string | | Paternal surname | | `curpVerification.mothers_maiden_name` | string | | Mother maiden name | | `curpVerification.birthdate` | string | | Birth Date in format DD/MM/YYYY | | `curpVerification.entity_birth` | string | | Birth State | | `curpVerification.probation_document` | string | | Probation Document | | `curpVerification.probation_document_data` | object | | Key/Value structure. All keys are type of string. Available Key values: - anioReg - foja - tomo - libro - numActa - CRIP - numEntidadReg - cveMunicipioReg - NumRegExtranjeros - FolioCarta - cveEntidadNac - cveEntidadEmisora | | `curpVerification.status_curp` | string | | Status Curp | | `curpVerification.deceasedStatus` | string | | Deceased Status | | `ineScrapingValidation` | IneResult | | Only for Mex documents in case INE scraping was performed | | `ineScrapingValidation.get_version` | integer (int64) | | | | `ineScrapingValidation.scrapingStatus` | string | | Scraping status Enum: `IN_PROGRESS`, `FINISHED`, `ERROR` | | `ineScrapingValidation.success` | boolean | | Flag indicating if the process finished successfully. | | `ineScrapingValidation.result` | string | | Result Enum: `success`, `error` | | `ineScrapingValidation.resultDetails` | string | | | | `ineScrapingValidation.screenshotUrl` | string | | | | `ineScrapingValidation.cic` | string | | Cic value. | | `ineScrapingValidation.claveElector` | string | | Clave de elector. | | `ineScrapingValidation.numeroEmision` | string | | Emission number. | | `ineScrapingValidation.ocr` | string | | Ocr number. | | `ineScrapingValidation.anioRegistro` | string | | Registration year. | | `ineScrapingValidation.anioEmision` | string | | Emission year. | | `idOcrConfidence` | IdOcrConfidence | | Confidence level for read ocr data from ID | | `idOcrConfidence.overallConfidence` | ResultBean | | | | `idOcrConfidence.overallConfidence.value` | string | | | | `idOcrConfidence.overallConfidence.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `idOcrConfidenceSecondId` | IdOcrConfidence | | Same as idOcrConfidence only applicable if onboarding is configured to capture a second id | | `idOcrConfidenceSecondId.overallConfidence` | ResultBean | | | | `idOcrConfidenceSecondId.overallConfidence.value` | string | | | | `idOcrConfidenceSecondId.overallConfidence.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `incodeWatchlistScore` | IncodeWatchlistScore | | Incode watchlist score | | `incodeWatchlistScore.watchlistScore` | ResultBean | | | | `incodeWatchlistScore.watchlistScore.value` | string | | | | `incodeWatchlistScore.watchlistScore.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `incodeWatchlistScore.dataMatches` | array[string] | | | | `incodeWatchlistScore.incodeWatchlistId` | string | | | | `retryInfo` | RetryInfo | | Info about failed onboarding attempts (only if 'Onboarding flow attempts' > 0 in ID Capture module) | | `retryInfo.failedAttemptsCounter` | object | | Object with counter of failed attempts per step | | `retryInfo.stepsToRetry` | array[string] | | | | `documentOnEdgeInfo` | DocumentOnEdgeInfo | | Info about image alignment characteristic (if is on the image edge) | | `documentOnEdgeInfo.frontDocumentIsOnTheEdge` | boolean | | | | `documentOnEdgeInfo.backDocumentIsOnTheEdge` | boolean | | | | `appliedRule` | AppliedFlowRule | | Specific rule from rule engine for total | | `appliedRule.name` | string | | Name of the rule. | | `appliedRule.expression` | string | | A logical expression of the rule. | | `appliedRule.ruleType` | string | | Enum: `idValidation`, `secondIdValidation`, `faceValidation`, `liveness`, `deepsight`, `eKyc`, `videoselfie`, `faceAuthentication`, `total`, `phoneRisk`, `emailRisk`, `governmentValidation` | | `appliedRule.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `needsReviewReason` | string | | In case the overall score status is MANUAL (Needs Review), returns reason Enum: `MANUAL_CAPTURE`, `RULE_APPLIED`, `OLD_ID`, `FLOW_CONFIGURATION`, `FRONT_ID_CAPTURE_ATTEMPTS`, `BACK_ID_CAPTURE_ATTEMPTS`, `SELFIE_CAPTURE_ATTEMPTS`, `ANTIFRAUD`, `MISSING_DEPTH_DATA` | | `sessionRecording` | SessionRecording | | | | `sessionRecording.mergedRecordingQualityChecks` | SessionRecordingQualityChecksScore | | | | `sessionRecording.mergedRecordingQualityChecks.fileIsPresent` | string | | Enum: `PRESENT`, `NOT_PRESENT`, `UNKNOWN` | | `sessionRecording.mergedRecordingQualityChecks.hasVideo` | string | | Enum: `YES`, `NO`, `UNKNOWN` | | `sessionRecording.mergedRecordingQualityChecks.hasAudio` | string | | Enum: `YES`, `NO`, `UNKNOWN` | | `sessionRecording.mergedRecordingQualityChecks.fileNotEmpty` | string | | Enum: `NOT_EMPTY`, `EMPTY`, `UNKNOWN` | | `sessionRecording.mergedRecordingQualityChecks.recordingQuality` | ResultBean | | | | `sessionRecording.mergedRecordingQualityChecks.recordingQuality.value` | string | | | | `sessionRecording.mergedRecordingQualityChecks.recordingQuality.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `trustGraph` | TrustGraph | | Analysis of trust relationships and signals detected during onboarding, such as connections between devices and identities, used to assess the overall trustworthiness of the onboarding attempt. | | `trustGraph.riskResults` | TrustGraphRiskResults | | | | `trustGraph.riskResults.overall` | ResultBean | | | | `trustGraph.riskResults.overall.value` | string | | | | `trustGraph.riskResults.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `trustGraph.riskResults.reasonCategoryScores` | object | | | | `identityCrosscheck` | IdentityCrosscheck | | Simple identity crosscheck that compare names and dates of birth from different sources | | `identityCrosscheck.overall` | ResultBean | | Overall validation result | | `identityCrosscheck.overall.value` | string | | | | `identityCrosscheck.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `identityCrosscheck.checks` | object | | Individual validation checks | | `identityCrosscheck.riskLevel` | string | | Risk level assessment | | `invoiceValidation` | Invoice | | Analysis of invoice data | | `invoiceValidation.overall` | ResultBean | | | | `invoiceValidation.overall.value` | string | | | | `invoiceValidation.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `invoiceValidation.checks` | object | | | | `idValidationDeepCheck` | IdValidationDeepCheckScore | | Asynchronous secondary ID validation deep check | | `idValidationDeepCheck.overall` | ResultBean | | | | `idValidationDeepCheck.overall.value` | string | | | | `idValidationDeepCheck.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `autopilot` | AutopilotDto | | Autopilot is a machine learning based score | | `autopilot.overall` | ResultBean | | | | `autopilot.overall.value` | string | | | | `autopilot.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `autopilot.failedFeatures` | array[string] | | Deprecated; use failedFeatureDetails. | | `autopilot.legitFeatures` | array[string] | | Deprecated; use legitFeatureDetails. | | `autopilot.failedFeatureDetails` | array[AutopilotFeatureDetail] | | | | `autopilot.failedFeatureDetails.code` | string | | | | `autopilot.failedFeatureDetails.description` | string | | | | `autopilot.legitFeatureDetails` | array[AutopilotFeatureDetail] | | | | `autopilot.legitFeatureDetails.code` | string | | | | `autopilot.legitFeatureDetails.description` | string | | | | `autopilot.responseText` | string | | | | `autopilot.responseCategory` | string | | | | `overall` | ResultBean | | Composite result for previous sections | | `overall.value` | string | | | | `overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ### 403 Forbidden - Score retrieval is disabled for this organization for session users. Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/score \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/score", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/score", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/score")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "authentication": { "overall": { "value": "string", "status": "OK" }, "identityId": "string", "appliedRule": { "name": "string", "expression": "string", "ruleType": "idValidation", "status": "OK" } }, "idValidation": { "photoSecurityAndQuality": [ { "value": "string", "status": "OK", "key": "string" } ], "idSpecific": [ { "value": "string", "status": "OK", "key": "string" } ], "customFields": [ { "value": "string", "status": "OK", "key": "string" } ], "appliedRule": { "name": "string", "expression": "string", "ruleType": "idValidation", "status": "OK" }, "overall": { "value": "string", "status": "OK" } }, "antifraud": { "overall": { "value": "string", "status": "OK" } }, "secondIdValidation": { "photoSecurityAndQuality": [ { "value": "string", "status": "OK", "key": "string" } ], "idSpecific": [ { "value": "string", "status": "OK", "key": "string" } ], "customFields": [ { "value": "string", "status": "OK", "key": "string" } ], "appliedRule": { "name": "string", "expression": "string", "ruleType": "idValidation", "status": "OK" }, "overall": { "value": "string", "status": "OK" } }, "liveness": { "hasHeadCover": { "value": "string", "status": "OK" }, "hasClosedEyes": { "value": "string", "status": "OK" }, "physicalAttack": { "value": "string", "status": "OK" }, "digitalAttack": { "value": "string", "status": "OK" }, "evasionAttack": { "value": "string", "status": "OK" }, "deepfakeAttack": { "value": "string", "status": "OK" }, "digitalManipulationAttack": { "value": "string", "status": "OK" }, "appliedRule": { "name": "string", "expression": "string", "ruleType": "idValidation", "status": "OK" }, "spoofDetectionMethod": "SF", "overall": { "value": "string", "status": "OK" }, "livenessScore": { "value": "string", "status": "OK" } }, "deepsight": { "multimodalIntelligence": { "physicalAttack": { "value": "string", "status": "OK" }, "digitalAttack": { "value": "string", "status": "OK" }, "deepfakeAttack": { "value": "string", "status": "OK" }, "digitalManipulationAttack": { "value": "string", "status": "OK" }, "evasionAttack": { "value": "string", "status": "OK" }, "spoofDetectionMethod": "SF", "faceExplanation": { "description": "string", "keywords": { "category": "string", "isDepthFlat": true, "isVideoCorrupted": true } }, "faceOverall": { "value": "string", "status": "OK" }, "aiGeneratedDocument": { "value": "string", "status": "OK" }, "visualAnomaly": { "value": "string", "status": "OK" }, "documentOverall": { "value": "string", "status": "OK" }, "overall": { "value": "string", "status": "OK" } }, "deviceTrust": { "overall": { "value": "string", "status": "OK" } }, "behavioralTrust": { "overall": { "value": "string", "status": "OK" } }, "cameraTrust": { "overall": { "value": "string", "status": "OK" } }, "overall": { "value": "string", "status": "OK" }, "appliedRule": { "name": "string", "expression": "string", "ruleType": "idValidation", "status": "OK" } }, "faceCaptureAssessment": { "faceAttributes": { "maskCheck": { "value": "string", "status": "OK" }, "lensesCheck": { "value": "string", "status": "OK" }, "hasHeadCover": { "value": "string", "status": "OK" }, "hasClosedEyes": { "value": "string", "status": "OK" }, "faceOcclusion": { "value": "string", "status": "OK" } }, "qualityChecks": { "faceBrightness": { "value": "string", "status": "OK" }, "imageQuality": { "value": "string", "status": "OK" } } }, "faceRecognition": { "existingUser": true, "customerId": "string", "existingInterviewId": "string", "existingExternalId": "string", "maskCheck": { "value": "string", "status": "OK" }, "lensesCheck": { "value": "string", "status": "OK" }, "faceBrightness": { "value": "string", "status": "OK" }, "imageQuality": { "value": "string", "status": "OK" }, "nameMatch": { "value": "string", "status": "OK" }, "appliedRule": { "name": "string", "expression": "string", "ruleType": "idValidation", "status": "OK" }, "overall": { "value": "string", "status": "OK" }, "hasHeadCover": { "value": "string", "status": "OK" }, "hasClosedEyes": { "value": "string", "status": "OK" }, "faceOcclusion": { "value": "string", "status": "OK" } }, "faceRecognitionSecondId": { "existingUser": true, "customerId": "string", "existingInterviewId": "string", "existingExternalId": "string", "maskCheck": { "value": "string", "status": "OK" }, "lensesCheck": { "value": "string", "status": "OK" }, "faceBrightness": { "value": "string", "status": "OK" }, "imageQuality": { "value": "string", "status": "OK" }, "nameMatch": { "value": "string", "status": "OK" }, "appliedRule": { "name": "string", "expression": "string", "ruleType": "idValidation", "status": "OK" }, "overall": { "value": "string", "status": "OK" }, "hasHeadCover": { "value": "string", "status": "OK" }, "hasClosedEyes": { "value": "string", "status": "OK" }, "faceOcclusion": { "value": "string", "status": "OK" } }, "governmentValidation": { "recognitionConfidence": { "value": "string", "status": "OK" }, "fingerprintConfidence": { "value": "string", "status": "OK" }, "minimumPassingFingerprints": 0, "validationStatus": { "value": "string", "status": "OK", "key": "string" }, "ocrValidation": [ { "value": "string", "status": "OK", "key": "string" } ], "ocrValidationOverall": { "value": "string", "status": "OK" }, "overall": { "value": "string", "status": "OK" }, "provider": "string", "appliedRule": { "name": "string", "expression": "string", "ruleType": "idValidation", "status": "OK" } }, "videoConference": { "speechTranscript": "string", "speechTranscriptWhisper": "string", "videoSelfieLiveness": { "value": "string", "status": "OK" }, "videoSelfieFaceRecognition": { "value": "string", "status": "OK" }, "speechRecognition": { "value": "string", "status": "OK" }, "score": { "value": "string", "status": "OK" }, "appliedRule": { "name": "string", "expression": "string", "ruleType": "idValidation", "status": "OK" } }, "curpVerification": { "success": true, "curp": "string", "sex": "Mujer", "nationality": "string", "result": "string", "transactionId": "string", "renapo_valid": true, "names": "string", "paternal_surname": "string", "mothers_maiden_name": "string", "birthdate": "string", "entity_birth": "string", "probation_document": "string", "probation_document_data": {}, "status_curp": "string", "deceasedStatus": "string" }, "ineScrapingValidation": { "get_version": 0, "scrapingStatus": "IN_PROGRESS", "success": true, "result": "success", "resultDetails": "string", "screenshotUrl": "string", "cic": "string", "claveElector": "string", "numeroEmision": "string", "ocr": "string", "anioRegistro": "string", "anioEmision": "string" }, "idOcrConfidence": { "overallConfidence": { "value": "string", "status": "OK" } }, "idOcrConfidenceSecondId": { "overallConfidence": { "value": "string", "status": "OK" } }, "incodeWatchlistScore": { "watchlistScore": { "value": "string", "status": "OK" }, "dataMatches": [ "string" ], "incodeWatchlistId": "string" }, "retryInfo": { "failedAttemptsCounter": {}, "stepsToRetry": [ "frontId" ] }, "documentOnEdgeInfo": { "frontDocumentIsOnTheEdge": true, "backDocumentIsOnTheEdge": true }, "appliedRule": { "name": "string", "expression": "string", "ruleType": "idValidation", "status": "OK" }, "needsReviewReason": "MANUAL_CAPTURE", "sessionRecording": { "mergedRecordingQualityChecks": { "fileIsPresent": "PRESENT", "hasVideo": "YES", "hasAudio": "YES", "fileNotEmpty": "NOT_EMPTY", "recordingQuality": { "value": "string", "status": "OK" } } }, "trustGraph": { "riskResults": { "overall": { "value": "string", "status": "OK" }, "reasonCategoryScores": {} } }, "identityCrosscheck": { "overall": { "value": "string", "status": "OK" }, "checks": {}, "riskLevel": "LOW" }, "invoiceValidation": { "overall": { "value": "string", "status": "OK" }, "checks": {} }, "idValidationDeepCheck": { "overall": { "value": "string", "status": "OK" } }, "autopilot": { "overall": { "value": "string", "status": "OK" }, "failedFeatures": [ "string" ], "legitFeatures": [ "string" ], "failedFeatureDetails": [ { "code": "string", "description": "string" } ], "legitFeatureDetails": [ { "code": "string", "description": "string" } ], "responseText": "string", "responseCategory": "string" }, "overall": { "value": "string", "status": "OK" } } ``` --- - Path: `api-reference/get-signed-contracts-links` - URL: https://developer.incode.com/api-reference/get-signed-contracts-links/ - Markdown: https://developer.incode.com/api-reference/get-signed-contracts-links.md - Endpoint: `GET /omni/get/signed-contracts-links` # Get signed contracts links `GET /omni/get/signed-contracts-links` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetches temporary link of the signed contracts uploaded for the current session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `additionalInformation` | object | | | ```json { "success": true, "sessionStatus": "Alive", "additionalInformation": { "document ID1": "Temporary URL to signed document with ID1", "document ID2": "Temporary URL to signed document with ID2", "document ID3": "Temporary URL to signed document with ID3" } } ``` ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/signed-contracts-links \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/signed-contracts-links", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/signed-contracts-links", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/signed-contracts-links")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "additionalInformation": { "document ID1": "Temporary URL to signed document with ID1", "document ID2": "Temporary URL to signed document with ID2", "document ID3": "Temporary URL to signed document with ID3" } } ``` --- - Path: `api-reference/get-signing-ceremony-url` - URL: https://developer.incode.com/api-reference/get-signing-ceremony-url/ - Markdown: https://developer.incode.com/api-reference/get-signing-ceremony-url.md - Endpoint: `GET /omni/get/signing-ceremony-url` # Get signing ceremony URL `GET /omni/get/signing-ceremony-url` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetches signing ceremony URL for the current session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `signingCeremonyUrl` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/signing-ceremony-url \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/signing-ceremony-url", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/signing-ceremony-url", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/signing-ceremony-url")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "signingCeremonyUrl": "https://exaple.com" } ``` --- - Path: `api-reference/get-user-consent` - URL: https://developer.incode.com/api-reference/get-user-consent/ - Markdown: https://developer.incode.com/api-reference/get-user-consent.md - Endpoint: `GET /omni/get/user-consent` # Get user consent `GET /omni/get/user-consent` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetches user consent with title, content and status from session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Session id | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `title` | string | | Title of the consent. | | `content` | string | | Text content. | | `status` | boolean | | Status | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/get/user-consent \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/get/user-consent", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/get/user-consent", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/get/user-consent")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "title": "string", "content": "string", "status": true } ``` --- - Path: `api-reference/getevents` - URL: https://developer.incode.com/api-reference/getevents/ - Markdown: https://developer.incode.com/api-reference/getevents.md - Endpoint: `GET /omni/interview-events` # Fetch interview events `GET /omni/interview-events` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns the list of all events for given interview ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | yes | | | `offset` | query | integer (int32) | | | | `limit` | query | integer (int32) | | | | `codes` | query | array[string] | | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `events` | array[InterviewEventDto] | | | | `events.id` | string | | | | `events.code` | string | | | | `events.timestamp` | integer (int64) | | | | `events.clientTimestamp` | integer (int64) | | | | `events.module` | string | | | | `events.screen` | string | | | | `events.assetUrl` | string | | | | `events.videoUrl` | string | | | | `events.payload` | object | | | | `more` | boolean | | | | `interviewTotalTimeMillis` | integer (int64) | | | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/interview-events \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/interview-events", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/interview-events", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/interview-events")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "events": [ { "id": "string", "code": "string", "timestamp": 0, "clientTimestamp": 0, "module": "string", "screen": "string", "assetUrl": "string", "videoUrl": "string", "payload": {} } ], "more": true, "interviewTotalTimeMillis": 0 } ``` --- - Path: `api-reference/identity-crosscheck` - URL: https://developer.incode.com/api-reference/identity-crosscheck/ - Markdown: https://developer.incode.com/api-reference/identity-crosscheck.md - Endpoint: `POST /omni/identity-crosscheck` # Identity cross-check comparing account creation data with IDV data `POST /omni/identity-crosscheck` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Cross-checks name and date of birth from account creation against data extracted during IDV. Compares the provided data with OCR-extracted data and returns validation score with risk assessment. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | | | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | yes | Full name from account creation | | `dateOfBirth` | string | yes | Date of birth in YYYY-MM-DD format | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `sessionId` | string | | Session ID that was cross-checked | | `score` | IdentityCrosscheck | | Identity cross-check score results | | `score.overall` | ResultBean | | Overall validation result | | `score.overall.value` | string | | | | `score.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `score.checks` | object | | Individual validation checks | | `score.riskLevel` | string | | Risk level assessment | | `success` | boolean | | Success indicator | | `errorMessage` | string | | Error message if cross-check failed | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ### 404 Session or IDV data not found Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/identity-crosscheck \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "name": "", "dateOfBirth": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/identity-crosscheck", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "name": "", "dateOfBirth": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/identity-crosscheck", headers=headers, json={ "name": "", "dateOfBirth": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/identity-crosscheck")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"name\": \"\",\n \"dateOfBirth\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "sessionId": "64a7b8c9d1e2f3g4h5i6j7k8", "score": { "overall": { "value": "string", "status": "OK" }, "checks": {}, "riskLevel": "LOW" }, "success": true, "errorMessage": "IDV data not found for session" } ``` --- - Path: `api-reference/identity-reuse-documents` - URL: https://developer.incode.com/api-reference/identity-reuse-documents/ - Markdown: https://developer.incode.com/api-reference/identity-reuse-documents.md - Endpoint: `GET /omni/identity-reuse/documents` # Get identity reuse documents `GET /omni/identity-reuse/documents` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns all found identity documents across all candidate identities ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `documents` | array[IdentityReuseDocumentDto] | | | | `documents.documentId` | string | | | | `documents.type` | string | | | | `documents.countryCode` | string | | | | `documents.documentNumber` | string | | | | `documents.validatedAt` | string (date-time) | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/identity-reuse/documents \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/identity-reuse/documents", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/identity-reuse/documents", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/identity-reuse/documents")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "documents": [ { "documentId": "string", "type": "string", "countryCode": "string", "documentNumber": "string", "validatedAt": "string" } ] } ``` --- - Path: `api-reference/identity-reuse-submit` - URL: https://developer.incode.com/api-reference/identity-reuse-submit/ - Markdown: https://developer.incode.com/api-reference/identity-reuse-submit.md - Endpoint: `POST /omni/identity-reuse/submit` # Submit identity reuse decision `POST /omni/identity-reuse/submit` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Accepts or declines reuse of a previously verified identity, on another organization. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `documentId` | string | | | | `accepted` | boolean | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/identity-reuse/submit \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "documentId": "", "accepted": false }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/identity-reuse/submit", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "documentId": "", "accepted": false }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/identity-reuse/submit", headers=headers, json={ "documentId": "", "accepted": False }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/identity-reuse/submit")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"documentId\": \"\",\n \"accepted\": false\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/identity-sessionids` - URL: https://developer.incode.com/api-reference/identity-sessionids/ - Markdown: https://developer.incode.com/api-reference/identity-sessionids.md - Endpoint: `GET /omni/identity/{customerId}/sessionIds` # Fetch all passed onboardings ids for the same person `GET /omni/identity/{customerId}/sessionIds` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Get all passed onboardings ids for the same person ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `customerId` | path | string | yes | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `sessionIds` | array[string] | | | | `count` | integer (int32) | | | | `initialSessionId` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/identity/{customerId}/sessionIds \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/identity/{customerId}/sessionIds", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/identity/{customerId}/sessionIds", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/identity/{customerId}/sessionIds")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "sessionIds": [ "string" ], "count": 0, "initialSessionId": "string" } ``` --- - Path: `api-reference/identity-sessions` - URL: https://developer.incode.com/api-reference/identity-sessions/ - Markdown: https://developer.incode.com/api-reference/identity-sessions.md - Endpoint: `GET /omni/identity/{customerId}/sessions` # Fetch all passed onboardings for the same person `GET /omni/identity/{customerId}/sessions` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Get all passed onboardings for the same person ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `customerId` | path | string | yes | | | `api-version` | header | string | yes | | ## Responses ### 200 OK ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/identity/{customerId}/sessions \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/identity/{customerId}/sessions", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/identity/{customerId}/sessions", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/identity/{customerId}/sessions")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json [ { "get_version": 0, "secondDocumentInterviewId": "string", "parentInterviewId": "string", "name": "string", "fullNameMrz": "string", "displayName": "string", "phone": "string", "birthDate": "string", "address": "string", "location": "string", "longitude": 0, "latitude": 0, "gender": "string", "typeOfId": "string", "externalId": "string", "flowWalletAddress": "string", "email": "string", "mrz1": "string", "mrz2": "string", "mrz3": "string", "street": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateCode": "string", "countryCode": "string", "cic": "string", "ocr": "string", "claveDeElector": "string", "numeroEmisionCredencial": "string", "personalNumber": "string", "nationalNumber": "string", "personalIdNumber": "string", "taxIdNumber": "string", "issueFront": 0, "issueBack": 0, "issuingCountry": "string", "registrationDate": 0, "documentId": "string", "deviceType": "IOS", "height": "string", "birthPlace": "string", "bloodType": "string", "curp": "string", "recognitionConfidence": 0, "nfcRecognitionConfidence": { "nfcVsSelfieConfidence": 0, "nfcVsSelfieLogConfidence": 0, "nfcVsIdConfidence": 0, "nfcVsIdLogConfidence": 0 }, "spoofConfidence": 0, "idValidationScore": "string", "tamperedConfidence": 0, "tamperedModelVersion": "string", "fakeIdConfidence": 0, "retouchFrontConfidence": 0, "frontClassification": "Unknown", "backClassification": "Unknown", "frontIdFaceCount": 0, "manualIdCheckNeeded": true, "manualSelfieCheckNeeded": true, "frontSharpness": 0, "frontGlare": 0, "frontHorizontalResolution": 0, "frontShadowConfidence": 0, "backSharpness": 0, "backGlare": 0, "backHorizontalResolution": 0, "backShadowConfidence": 0, "issueDate": 0, "expirationDate": 0, "qr": true, "manualCorrectionBy": "string", "waitingTime": 0, "logRecognitionConfidence": 0, "readabilityConfidence": 0, "frontSeccion": "string", "printingNumber": "string", "duplicateNumber": "string", "preparationNumber": "string", "confSelfieConfidence": 0, "confSelfieLogConfidence": 0, "confFrontIDConfidence": 0, "confFrontIDLogConfidence": 0, "notes": "string", "tags": [ "string" ], "croppedIDFaceRef": "string", "croppedNfcFaceRef": "string", "fullFrameFrontIDRef": "string", "fullFrameBackIDRef": "string", "croppedFrontIDRef": "string", "croppedBackIDRef": "string", "croppedFaceRef": "string", "confSelfieRef": "string", "confFrontIDRef": "string", "confBackIDRef": "string", "additionalNames": [ { "refNumber": 0, "name": "string" } ], "additionalAttrs": [ "DOCUMENTO_INFANTIL" ], "additionalTimestamps": [ { "dateType": "string", "timestamp": 0 } ], "religion": "string", "customFields": [ { "key": "string", "value": "string" } ], "customFieldsValid": [ { "key": "string", "value": true } ], "expirationDateCheckDigit": "string", "streetName": "string", "exteriorNumber": "string", "interiorNumber": "string", "district": "string", "addressCountryCode": "string", "issuerCode": "string", "redirectionUrl": "string", "maritalStatus": "string", "race": "string", "notExtractedDetails": [ "string" ], "issuingAuthority": "string", "qrContents": [ "string" ], "conferenceFeedback": "string", "barcodeRawData": "string", "nameParsed": true, "backClassificationFailReason": "UNKNOWN_DOCUMENT_TYPE", "nameBean": { "fullName": "string", "fullNameNativeScript": "string", "firstNameNativeScript": "string", "paternalLastNameNativeScript": "string", "maternalLastNameNativeScript": "string", "machineReadableFullName": "string", "firstName": "string", "middleName": "string", "givenName": "string", "givenNameMrz": "string", "initials": "string", "nameSuffix": "string", "paternalLastName": "string", "maternalLastName": "string", "lastNameMrz": "string", "familyName": "string" }, "backTypeOfId": "string", "documentFrontSubtype": "string", "documentFrontState": "string", "documentBackSubtype": "string", "documentBackState": "string", "documentNumberCheckDigit": "string", "dateOfBirthCheckDigit": "string", "expireAt": "string", "issuedAt": "string", "issuingCountryBack": "string", "finishStatus": true, "videoSelfieTypeOfIdMatch": true, "videoSelfieBackTypeOfIdMatch": true, "videoSelfieFaceMatched": true, "videoSelfieNameOcrMatched": true, "videoSelfieBacksideOcrMatched": true, "videoSelfieVoiceConsentFaceMatched": true, "vendorValidationScore": 0, "videoSelfieRecognitionConfidence": 0, "videoSelfieLogRecognitionConfidence": 0, "videoSelfieSpoofConfidence": 0, "paperConfidence": 0, "screenConfidence": 0, "screenModelVersion": "string", "paperModelVersion": "string", "idAlterationConfidence": 0, "frontClassificationFailReason": "UNKNOWN_DOCUMENT_TYPE", "frontCroppingError": "ID_IS_CUT", "backCroppingError": "ID_IS_CUT", "frontSharpnessSource": "ML_BACKEND", "frontGlareSource": "ML_BACKEND", "backSharpnessSource": "ML_BACKEND", "backGlareSource": "ML_BACKEND", "isRealId": true, "barcodeMeta": { "ecLevel": 0, "noSegments": 0, "segmentWidth": 0, "corners": [ { "x": 0, "y": 0 } ], "cornersFullFrame": [ { "x": 0, "y": 0 } ], "rawBytes": "string", "pdf417RowNumber": 0, "pdf417ColumnNumber": 0, "pdf417CodewordLengthMin": 0, "pdf417CodewordLengthMax": 0, "pdf417CorrectedErrorsCount": 0 }, "barcodeReader": "string", "barcodeSignatureVerified": true, "fullFrameFrontIDRefs": [ { "imageRef": "string", "timestamp": 0, "exifMetadata": { "timestampOriginal": 0, "software": "string" } } ], "fullFrameBackIDRefs": [ { "imageRef": "string", "timestamp": 0, "exifMetadata": { "timestampOriginal": 0, "software": "string" } } ], "refCroppedFrontIDRef": "string", "refCroppedBackIDRef": "string", "croppedOriginalFrontIDRef": "string", "croppedOriginalBackIDRef": "string", "voiceConsentSelfieRefs": [ { "imageRef": "string", "timestamp": 0, "confidence": 0, "threshold": 0 } ], "voiceConsentSelfieRef": "string", "confPoaRef": "string", "idSegmentImagesRefs": {}, "ocrResultsId": "string", "interviewerId": "string", "interviewerName": "string", "interviewSessionId": "string", "interviewCode": "string", "oldInterviewId": "string", "externalCustomerId": "string", "nue": "string", "nss": "string", "sessionStatus": "Alive", "closedAt": 0, "deletedAt": 0, "speechOpentokSessionId": "string", "speechOpentokArchiveId": "string", "speechOffset": 0, "language": "string", "signingCeremonyUrl": "string", "videoSelfieFileIsPresent": "PRESENT", "videoSelfieHasVideo": "YES", "videoSelfieHasAudio": "YES", "videoSelfieFileNotEmpty": "NOT_EMPTY", "videoWidth": 0, "videoHeight": 0, "videoBitRate": 0, "videoDuration": 0, "videoQuality": true, "speechTranscript": "string", "speechTranscriptWhisper": "string", "processSpeechResultWhisper": true, "processSpeechResult": true, "processSpeechResultGoogleLLM": true, "sessionRecordingRefs": {}, "additionalDocumentAttempts": [ { "documentType": "ASYLUM_SEEKER", "format": "IMAGE", "status": "SUCCESS", "attemptTimestamp": 0, "classificationConfidence": 0, "image": { "imageRef": "string", "timestamp": 0, "exifMetadata": { "timestampOriginal": 0, "software": "string" } }, "multiPageDocImages": [ { "imageRef": "string", "timestamp": 0, "exifMetadata": { "timestampOriginal": null, "software": null } } ], "attemptType": "POA", "antiSpoofResult": { "status": "PASS", "kinds": [ "string" ], "confidence": 0, "details": [ { "kind": null, "error": null, "loc": null, "explanation": null } ] }, "firstName": "string", "lastName": "string", "countryOfOrigin": "string", "dateOfBirth": 0, "expiryDate": 0, "issueDate": 0, "gender": "MALE", "nationality": "string", "placeOfIssue": "string", "referenceNumber": "string", "residentialAddressLines": [ "string" ] } ], "poaName": "string", "proofOfAddress": "string", "proofOfAddressScore": 0, "addressStatementTimestamp": 0, "addressStatementTimestamps": [ { "get_version": 0, "dateType": "string", "addressStatementTimestamp": 0 } ], "documentType": "a1", "poaFields": { "street": "string", "streetName": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string", "exteriorNumber": "string", "interiorNumber": "string", "addressLine1": "string", "streetType": "string" }, "poaSuccessfullyClassified": true, "fullAddress": true, "checkedAddress": "string", "checkedAddressBean": { "street": "string", "streetName": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string", "exteriorNumber": "string", "interiorNumber": "string", "addressLine1": "string", "streetType": "string" }, "classifier": "INCODE", "bankLoginSuccess": true, "governmentRecognitionConfidence": 0, "governmentRecognitionConfidence2": 0, "governmentFingerprintConfidence": { "finger1": 0, "finger2": 0, "finger3": 0, "finger4": 0, "finger5": 0, "finger6": 0, "finger7": 0, "finger8": 0, "finger9": 0, "finger10": 0 }, "governmentValidationStatus": "PROCESSING", "governmentRecognitionThreshold": 0, "registralSituation": { "tipoSituacionRegistral": "string", "tipoReporteRoboExtravio": "string" }, "curpCecobanValidation": { "returnCode": "string", "description": "string", "uniquePopulationRegistrationKeyMatch": true }, "ineTransactionId": "string", "existingUser": true, "nameMatched": true, "existingInterviewId": "string", "existingExternalId": "string", "customerId": "string", "parentCustomerId": "string", "incodeIdCustomer": "string", "faceAuthCustomerId": "string", "incodeIdConsentGiven": true, "onlyFront": true, "onlyBack": true, "forceBackForDob": true, "hasNfcChip": true, "barcodeCapture": true, "usSmartCapture": true, "alignment": true, "frontAlignment": true, "frontAlignmentForced": true, "backAlignmentForced": true, "alreadyApprovedCustomerConfidence": 0, "punchedHolesConfidence": 0, "fakeIdInternalConfidence": 0, "mandatoryConsentGiven": true, "frontDocumentIsOnTheEdge": true, "backDocumentIsOnTheEdge": true, "backAlignment": true, "surveyData": "string", "frontIdAttempts": 0, "backIdAttempts": 0, "selfieAttempts": 0, "authenticationAttempts": 0, "onboardingAttempts": 0, "sessionContinuationCount": 0, "failedAttemptsCounter": {}, "idValidationFinished": true, "faceValidationFinished": true, "idFaceExtractionSkipped": true, "faceMatchingType": "selfieVsId", "partialOnboarding": true, "frontCaptureRedacted": true, "backCaptureRedacted": true, "multipleDocumentsInFrame": true, "callbackUrl": "string", "governmentValidationFinished": true, "conferenceStatus": "NO_CONFERENCE", "termsAccepted": true, "creditBureauConsentGiven": true, "applicantDataConfirmed": true, "configurationId": "string", "configurationName": "string", "configurationVersion": 0, "flowType": "configuration", "workflowContext": { "currentNodeId": "string", "workflowPath": [ { "nodeId": "string", "addedAt": 0 } ] }, "queueName": "string", "gdcAddressScore": "FullMatch", "gdcIdentityScore": "FullMatch", "subscribedToWatchlistUpdates": true, "onboardingStatus": "UNKNOWN", "deletedWithMode": "BIOMETRICS", "retentionRegion": { "ipRegion": "string", "ocrRegion": "string" }, "onboardingCompleteTimestamp": 0, "sessionExpiredAt": 0, "loginHint": "string", "authUuid": "string", "integrationReference": "string", "validationArchiveRef": "string", "validationArchiveNom151": "string", "selfieRef": "string", "selfieRefs": [ { "imageRef": "string", "timestamp": 0, "exifMetadata": { "timestampOriginal": 0, "software": "string" } } ], "sorSelfieRef": "string", "videoSelfieRef": "string", "documentRef": "string", "documentRefs": [ { "imageRef": "string", "timestamp": 0, "exifMetadata": { "timestampOriginal": 0, "software": "string" } } ], "signatureRef": "string", "initialsRef": "string", "secondIdRef": "string", "thirdIdRef": "string", "medicalDocImgRef": "string", "videoSelfieCompareIDRef": "string", "videoSelfieCompareOcrRef": "string", "videoSelfieCompareBackIDRef": "string", "videoSelfieCompareBackOcrRef": "string", "otherDocument1Ref": "string", "otherDocument2Ref": "string", "otherDocument3Ref": "string", "paymentProofRef": "string", "consentRef": "string", "renaperCroppedRef": "string", "signatureRefs": [ { "imageRef": "string", "signatureType": "string" } ], "initialsRefs": [ { "imageRef": "string", "signatureType": "string" } ], "contractRefs": [ "string" ], "signedContractRefs": [ "string" ], "governmentValidationProvider": "QUERTIUM", "governmentValidationShadowMode": true, "governmentValid": true, "governmentValidationResponse": {}, "governmentValidationRequest": {}, "paternalLastNameValid": true, "maternalLastNameValid": true, "firstNameValid": true, "middleNameValid": true, "suffixNameValid": true, "curpValid": true, "ineCurpValid": true, "curpValidationResponse": { "success": true, "curp": "string", "sex": "Mujer", "nationality": "string", "result": "string", "transactionId": "string", "renapo_valid": true, "names": "string", "paternal_surname": "string", "mothers_maiden_name": "string", "birthdate": "string", "entity_birth": "string", "probation_document": "string", "probation_document_data": {}, "status_curp": "string", "deceasedStatus": "string" }, "curpDataMatch": true, "renapoCurp": "string", "ineScrapingValid": true, "ineValidationResponse": { "get_version": 0, "scrapingStatus": "IN_PROGRESS", "success": true, "result": "success", "resultDetails": "string", "screenshotUrl": "string", "cic": "string", "claveElector": "string", "numeroEmision": "string", "ocr": "string", "anioRegistro": "string", "anioEmision": "string" }, "fiscalQrUrlResponse": { "success": true, "sessionStatus": "Alive", "rfc": "string", "curp": "string", "name": "string", "firstLastName": "string", "secondLastName": "string", "birthdate": "string", "denomination": "string", "regime": "string", "constitutionDate": "string", "operationStartDate": "string", "personStatus": "string", "lastSituationChangeDate": "string", "state": "string", "delegation": "string", "colony": "string", "streetType": "string", "streetName": "string", "extNumber": "string", "intNumber": "string", "postalCode": "string", "email": "string", "al": "string", "fiscalRegime": "string", "fiscalStartDate": "string", "error": "string", "result": "string" }, "ocrValid": true, "claveDeElectorValid": true, "numeroEmisionCredencialValid": true, "registrationDateValid": true, "issueDateValid": true, "birthDateValid": true, "documentNumberValid": true, "sexValid": true, "heightValid": true, "weightValid": true, "eyeColorValid": true, "addressValid": true, "addressLine2Valid": true, "cityValid": true, "stateCodeValid": true, "zipCodeValid": true, "genderValid": true, "personalNumberValid": true, "placeOfBirthValid": true, "expirationDateValid": true, "totalScore": 0, "livenessScore": 0, "faceRecognitionScore": 0, "incodeIdValidationScore": 0, "idOcrValidationScore": 0, "governmentScore": 0, "videoConferenceScore": 0, "totalScoreStatus": "OK", "livenessScoreStatus": "OK", "faceRecognitionScoreStatus": "OK", "incodeIdValidationScoreStatus": "OK", "idOcrValidationScoreStatus": "OK", "governmentScoreStatus": "OK", "videoConferenceStatus": "OK", "customWatchlistModuleEnabled": true, "incodeWatchlistScore": 0, "watchlistDataMatches": [ "string" ], "incodeWatchlistId": "string", "externalVerificationRequest": { "plugins": [ "string" ], "source": "US_DRIVERS_LICENSE_1", "fullName": "string", "firstName": "string", "middleName": "string", "surName": "string", "email": "string", "street": "string", "houseNo": "string", "postalCode": "string", "countryCode": "string", "phone": "string", "state": "string", "city": "string", "ssn": "string", "dateOfBirth": "string", "ipAddress": "string", "taxIdStatus": "string", "nationality": "string", "dlNumber": "string", "dlExpireAt": "string", "dlState": "string", "last4SSN": "string", "idNumber": "string", "panNumber": "string" }, "premiumExternalVerification": { "level": "string", "verifications": {}, "income": { "status": "string", "range": "string" }, "employment": { "status": "string", "type": "string", "sector": "string" }, "reasonCodes": [ { "key": "string", "reasonCodes": [ { "reasonCode": null, "description": null } ] } ], "additionalVerificationInfo": { "creditFileDetails": { "creditFileNumber": "string", "creditFileCreationDate": "string" } } }, "externalVerificationThirdPartyRequest": {}, "externalVerificationThirdPartyResponse": {}, "businessVerificationRequest": { "plugins": [ "string" ], "businessName": "string", "addressLine1": "string", "street": "string", "houseNo": "string", "addressLine2": "string", "city": "string", "state": "string", "postalCode": "string", "country": "US", "taxId": "string", "uboNames": [ "string" ], "directors": [ "string" ] }, "businessVerification": { "businessName": "string", "businessClassification": "string", "addressVerification": "string", "cityVerification": "string", "postalCodeVerification": "string", "addressPropertyType": "string", "addressDeliverability": "string", "tinVerification": "string", "uboNameMatch": "string", "registrationStatus": "Active", "entityType": { "entityType": "string" }, "verificationMessages": { "tinVerificationMessage": "string" }, "uboNameVerificationResults": [ { "name": "string", "uboNameMatch": "string", "matchId": "string", "ownershipPercentage": "string" } ], "directorsVerificationResults": [ { "name": "string", "uboNameMatch": "string", "matchId": "string", "ownershipPercentage": "string" } ], "people": [ { "name": "string", "titles": [ { "title": null } ], "memberType": "string" } ] }, "bavHolders": [ { "holder": "string", "id": "string", "balance": 0, "currency": "string", "address": "string", "timestamp": 0 } ], "bavLinkId": "string", "bavNumberOfRetries": 0, "rfc": "string", "rfcValidationResponse": { "validRFC": true, "status": "string", "message": "string", "rfcType": "string", "messageCode": "string", "errorMessage": "string" }, "federalRevenueNumber": "string", "mothersName": "string", "mothersIdNumber": "string", "originDocumentId": "string", "fathersName": "string", "fathersIdNumber": "string", "spouseName": "string", "driversLicenseCategory": "string", "controlNumber": "string", "renach": "string", "eyeColor": "string", "classes": "string", "cond": "string", "mentions": "string", "refNumber": "string", "restrictions": "string", "weight": "string", "hairColor": "string", "nationality": "string", "nationalityMrz": "string", "nationalityAlpha3": "string", "jurisdictionCode": "string", "medicalOcrData": [ { "key": "string", "value": {} } ], "interviewRejected": true, "approvalSource": "AUTOAPPROVE", "manualReviewStatus": "UNSET", "manualReviewReasons": [ "string" ], "manualReviewComment": "string", "faceLenses": true, "hasFaceClosedEyes": true, "hasFaceHeadCover": true, "hasFaceMask": true, "faceIsBright": true, "faceAge": 0, "hasVideoSelfieLenses": true, "hasVideoSelfieClosedEyes": true, "hasVideoSelfieHeadCover": true, "hasVideoSelfieMask": true, "digitalAttack": true, "digitalAttackSeverity": "ultra low", "digitalAttackVersion": "string", "evasionAttack": true, "evasionAttackSeverity": "ultra low", "evasionAttackVersion": "string", "spoofDetectionResult": { "overallConfidence": 0, "isSpoof": true, "status": "passed", "physicalAttack": { "confidence": 0, "isSpoof": true, "status": "passed", "severity": "ultra low", "version": "string", "checkName": "physicalAttack", "reason": "FACE_CROPPING_FAILURE" }, "digitalAttack": { "confidence": 0, "isSpoof": true, "status": "passed", "severity": "ultra low", "version": "string", "checkName": "physicalAttack", "reason": "FACE_CROPPING_FAILURE" }, "evasionAttack": { "confidence": 0, "isSpoof": true, "status": "passed", "severity": "ultra low", "version": "string", "checkName": "physicalAttack", "reason": "FACE_CROPPING_FAILURE" }, "motionAttack": { "confidence": 0, "isSpoof": true, "status": "passed", "severity": "ultra low", "version": "string", "checkName": "physicalAttack", "reason": "FACE_CROPPING_FAILURE" }, "deepfakeAttack": { "confidence": 0, "isSpoof": true, "status": "passed", "severity": "ultra low", "version": "string", "checkName": "physicalAttack", "reason": "FACE_CROPPING_FAILURE" }, "digitalManipulationAttack": { "confidence": 0, "isSpoof": true, "status": "passed", "severity": "ultra low", "version": "string", "checkName": "physicalAttack", "reason": "FACE_CROPPING_FAILURE" }, "mediaQualityResults": [ { "modality": "depth", "name": "depthQuality", "result": "passed", "parameters": "string" } ], "options": { "cameraFacingMode": "FRONTAL", "source": "MOBILE", "enforceQSV": true, "strictVideoChecks": true }, "method": "SINGLE_FRAME", "explanation": { "description": "string", "keywords": { "category": "string", "isDepthFlat": true, "isVideoCorrupted": true } }, "spoofDetectionErrorDetails": { "error": "BAD_REQUEST", "detailMessage": "string" } }, "faceCaptureAttemptId": "string", "faceCaptureRecordingAttemptId": "string", "videoSelfieCaptureAttemptId": "string", "authenticationAttemptId": "string", "onboardingAttemptId": "string", "frontIdCaptureMetadata": { "timestamp": 0, "sdkPlatform": "WEBAPP", "sdkVersion": "string", "callerId": "string", "device": { "kind": "MOBILE", "model": "string", "os": "string", "osVersion": "string", "screenDimensions": { "width": 0, "height": 0 }, "numTouchPoints": 0, "fingerprintHash": "string", "ip": "string", "backgroundMode": true, "hookDetected": true, "emulatorDetected": true, "rootDetected": true, "virtualEnvironmentDetected": true, "jailbreakDetectionDisabled": true }, "browser": { "userAgent": "string", "getUserMediaAvailability": { "webkit": true, "mozilla": true, "opera": true, "microsoft": true }, "webglFingerprint": "string", "inspectorOpened": true, "isMockedBrowser": true }, "camera": { "facingMode": "FRONTAL", "settings": {}, "capabilities": {}, "labels": [ "string" ] }, "iad": { "isDeepsightEnabled": true, "deepsightLiveness": "SINGLE_FRAME", "zoomCheck": "PASS", "exposureCompensationCheck": "PASS", "cctCheck": "PASS", "genericCheck": "PASS", "mobileTemporalCheck": "PASS", "contrastSharpnessSaturationCheck": "PASS", "frontBackCameraCheck": "PASS", "frameDuplicationCheck": "PASS", "exposureCheck": "PASS", "replayAttackCheck": "PASS", "environmentIntegrityCheck": "PASS", "extendedDeviceAndBrowserClassificationData": {}, "deviceEmulationCheck": "PASS", "contrastSharpnessSaturationData": { "initialValues": { "contrast": 0, "sharpness": 0, "saturation": 0, "metrics": 0, "isTimeoutReached": true, "framePixelDelta": 0 }, "appliedValues": [ { "contrast": null, "sharpness": null, "saturation": null, "metrics": null, "isTimeoutReached": null, "framePixelDelta": null } ] }, "genericInjectionData": { "streamInitializationTime": [ 0 ], "timeToFirstFrame": [ 0 ], "appliedConstraints": {}, "isTimeoutReached": true, "sitAborted": true, "warmInitializationTime": 0 }, "iosInjectionData": { "createStreamTime": [ 0 ], "frameStats": [ { "frameCount": null, "isBlack": null, "isUnique": null, "timestamp": null, "updatedPercentage": null } ], "appliedConstraints": {}, "isTimeoutReached": true }, "cctInjectionData": { "initialCct": 0, "minColorTemperatureParameters": [ { "value": null, "applicationTime": null, "appliedConstraints": null, "isTimeoutReached": null, "framePixelDelta": null } ], "maxColorTemperatureParameters": [ { "value": null, "applicationTime": null, "appliedConstraints": null, "isTimeoutReached": null, "framePixelDelta": null } ] }, "androidInjectionData": { "constraintsApplicationTime": [ 0 ], "appliedConstraints": [ {} ] }, "frontBackCameraData": { "cameraCheckData": [ { "type": null, "isAvailable": null, "faceDetected": null, "idDetected": null, "isTimeoutReached": null } ], "phashMinRotHamming": 0, "colorHistChiSqr": 0, "noiseMaeRatio": 0, "noiseDistroChiSqr": 0, "initialFrameCount": 0, "oppositeFrameCount": 0, "oppositeWithinPhashHammingMean": 0, "oppositeWithinPhashHammingMax": 0, "oppositeWithinNoiseMaeStdev": 0, "oppositeWithinBrightnessStdev": 0, "crossPhashHammingMean": 0, "crossPhashHammingMin": 0, "crossPhashHammingMax": 0, "crossColorHistChiSqrMean": 0, "crossNoiseMaeDelta": 0, "crossNoiseDistroChiSqrMean": 0, "crossBrightnessDelta": 0, "initialSceneFeatures": [ 0 ], "oppositeSceneFeatures": [ 0 ], "crossSceneFeatureDeltas": [ 0 ], "oppositeTemporalKurtosis": 0, "oppositeTemporalKsToGaussian": 0, "oppositeTemporalLevelsRatio": 0, "oppositeTemporalVarianceMean": 0, "oppositeTemporalVarianceStdev": 0, "initialDeviceId": "string", "oppositeDeviceId": "string", "initialGroupId": "string", "oppositeGroupId": "string", "initialFacingMode": "string", "oppositeFacingMode": "string", "initialWidth": 0, "initialHeight": 0, "oppositeWidth": 0, "oppositeHeight": 0, "initialFrameRate": 0, "oppositeFrameRate": 0, "deviceIdsDiffer": true, "groupIdsMatch": true, "experimentIncomplete": true }, "frameDuplicationData": { "validDuplicateCount": 0, "invalidDuplicateCount": 0, "continuousValidDuplicateCount": 0, "continuousInvalidDuplicateCount": 0, "isTimeoutReached": true, "initialDuplicateFramesDetected": true, "initialOpenCaptureDuplicateFramesDetected": true, "invalidInitialDuplicateFramesDetected": true, "continuousDuplicateFramesDetected": true, "numInitialDuplicateInstances": 0, "numInitialOpenCaptureDuplicateInstances": 0, "numInvalidInitialDuplicateInstances": 0, "numContinuousDuplicateInstances": 0, "preCaptureTotalFrames": 0, "preCaptureUniqueHashes": 0, "preCaptureMaxConsecutiveRun": 0, "preCaptureMaxOccurrenceCount": 0, "preCaptureMaxOccurrencePercentage": 0, "frameStats": [ { "frameCount": null, "isBlack": null, "isUnique": null, "timestamp": null, "updatedPercentage": null } ], "perPhaseStats": [ { "invalidDuplicateCount": null, "totalFrames": null, "uniqueHashes": null, "maxOccurrencePercentage": null } ] }, "zoomData": { "initialConstraints": {}, "initialZoom": 0, "maxZoomParameters": [ { "applicationTime": null, "appliedConstraints": null, "appliedZoom": null, "isTimeoutReached": null } ], "minZoomParameters": [ { "applicationTime": null, "appliedConstraints": null, "appliedZoom": null, "isTimeoutReached": null } ] }, "exposureData": { "exposureParams": [ [] ], "frames": [ [] ], "sessionDiagnostics": [ { "exposureSupported": null, "exposureApplyConstraintError": null, "exposureApplyConstraintTimeout": null, "invalidTrackStateDetected": null, "interruptedCapture": null, "cameraCaptureStatus": null, "exposureMinDelay": null, "exposureInitialDelay": null, "baselineBrightness": null } ] }, "replayAttackData": { "collisionCount": 0, "isTimeoutReached": true, "intraSessionLoop": true, "intraSessionLookahead": true, "interSessionLookahead": true, "totalFrames": 0, "uniqueHashes": 0, "maxConsecutiveRun": 0, "maxOccurrenceCount": 0, "storedSessionsCount": 0, "storedHashesCount": 0, "storedSessionSizes": [ 0 ], "intraIncodeSessionLoop": true, "interIncodeSessionLoop": true }, "environmentIntegrity": { "rootDetected": true, "storageTamperingDetected": true, "environmentHookingDetected": true, "wasmTamperingDetected": true, "challengeInterruptionDetected": true, "debugModeDetected": true }, "isMotionEnabled": true, "sensorDataReference": "string" }, "behavior": { "detectionValuesDeviation": "PASS", "monotonicBorder": "PASS", "motionStatus": "PASS" }, "captureMode": "AUTO", "hasDepth": true, "expectedDepth": true, "mediaInfo": { "videoChecksum": "string" }, "clientLogs": "string" }, "backIdCaptureMetadata": { "timestamp": 0, "sdkPlatform": "WEBAPP", "sdkVersion": "string", "callerId": "string", "device": { "kind": "MOBILE", "model": "string", "os": "string", "osVersion": "string", "screenDimensions": { "width": 0, "height": 0 }, "numTouchPoints": 0, "fingerprintHash": "string", "ip": "string", "backgroundMode": true, "hookDetected": true, "emulatorDetected": true, "rootDetected": true, "virtualEnvironmentDetected": true, "jailbreakDetectionDisabled": true }, "browser": { "userAgent": "string", "getUserMediaAvailability": { "webkit": true, "mozilla": true, "opera": true, "microsoft": true }, "webglFingerprint": "string", "inspectorOpened": true, "isMockedBrowser": true }, "camera": { "facingMode": "FRONTAL", "settings": {}, "capabilities": {}, "labels": [ "string" ] }, "iad": { "isDeepsightEnabled": true, "deepsightLiveness": "SINGLE_FRAME", "zoomCheck": "PASS", "exposureCompensationCheck": "PASS", "cctCheck": "PASS", "genericCheck": "PASS", "mobileTemporalCheck": "PASS", "contrastSharpnessSaturationCheck": "PASS", "frontBackCameraCheck": "PASS", "frameDuplicationCheck": "PASS", "exposureCheck": "PASS", "replayAttackCheck": "PASS", "environmentIntegrityCheck": "PASS", "extendedDeviceAndBrowserClassificationData": {}, "deviceEmulationCheck": "PASS", "contrastSharpnessSaturationData": { "initialValues": { "contrast": 0, "sharpness": 0, "saturation": 0, "metrics": 0, "isTimeoutReached": true, "framePixelDelta": 0 }, "appliedValues": [ { "contrast": null, "sharpness": null, "saturation": null, "metrics": null, "isTimeoutReached": null, "framePixelDelta": null } ] }, "genericInjectionData": { "streamInitializationTime": [ 0 ], "timeToFirstFrame": [ 0 ], "appliedConstraints": {}, "isTimeoutReached": true, "sitAborted": true, "warmInitializationTime": 0 }, "iosInjectionData": { "createStreamTime": [ 0 ], "frameStats": [ { "frameCount": null, "isBlack": null, "isUnique": null, "timestamp": null, "updatedPercentage": null } ], "appliedConstraints": {}, "isTimeoutReached": true }, "cctInjectionData": { "initialCct": 0, "minColorTemperatureParameters": [ { "value": null, "applicationTime": null, "appliedConstraints": null, "isTimeoutReached": null, "framePixelDelta": null } ], "maxColorTemperatureParameters": [ { "value": null, "applicationTime": null, "appliedConstraints": null, "isTimeoutReached": null, "framePixelDelta": null } ] }, "androidInjectionData": { "constraintsApplicationTime": [ 0 ], "appliedConstraints": [ {} ] }, "frontBackCameraData": { "cameraCheckData": [ { "type": null, "isAvailable": null, "faceDetected": null, "idDetected": null, "isTimeoutReached": null } ], "phashMinRotHamming": 0, "colorHistChiSqr": 0, "noiseMaeRatio": 0, "noiseDistroChiSqr": 0, "initialFrameCount": 0, "oppositeFrameCount": 0, "oppositeWithinPhashHammingMean": 0, "oppositeWithinPhashHammingMax": 0, "oppositeWithinNoiseMaeStdev": 0, "oppositeWithinBrightnessStdev": 0, "crossPhashHammingMean": 0, "crossPhashHammingMin": 0, "crossPhashHammingMax": 0, "crossColorHistChiSqrMean": 0, "crossNoiseMaeDelta": 0, "crossNoiseDistroChiSqrMean": 0, "crossBrightnessDelta": 0, "initialSceneFeatures": [ 0 ], "oppositeSceneFeatures": [ 0 ], "crossSceneFeatureDeltas": [ 0 ], "oppositeTemporalKurtosis": 0, "oppositeTemporalKsToGaussian": 0, "oppositeTemporalLevelsRatio": 0, "oppositeTemporalVarianceMean": 0, "oppositeTemporalVarianceStdev": 0, "initialDeviceId": "string", "oppositeDeviceId": "string", "initialGroupId": "string", "oppositeGroupId": "string", "initialFacingMode": "string", "oppositeFacingMode": "string", "initialWidth": 0, "initialHeight": 0, "oppositeWidth": 0, "oppositeHeight": 0, "initialFrameRate": 0, "oppositeFrameRate": 0, "deviceIdsDiffer": true, "groupIdsMatch": true, "experimentIncomplete": true }, "frameDuplicationData": { "validDuplicateCount": 0, "invalidDuplicateCount": 0, "continuousValidDuplicateCount": 0, "continuousInvalidDuplicateCount": 0, "isTimeoutReached": true, "initialDuplicateFramesDetected": true, "initialOpenCaptureDuplicateFramesDetected": true, "invalidInitialDuplicateFramesDetected": true, "continuousDuplicateFramesDetected": true, "numInitialDuplicateInstances": 0, "numInitialOpenCaptureDuplicateInstances": 0, "numInvalidInitialDuplicateInstances": 0, "numContinuousDuplicateInstances": 0, "preCaptureTotalFrames": 0, "preCaptureUniqueHashes": 0, "preCaptureMaxConsecutiveRun": 0, "preCaptureMaxOccurrenceCount": 0, "preCaptureMaxOccurrencePercentage": 0, "frameStats": [ { "frameCount": null, "isBlack": null, "isUnique": null, "timestamp": null, "updatedPercentage": null } ], "perPhaseStats": [ { "invalidDuplicateCount": null, "totalFrames": null, "uniqueHashes": null, "maxOccurrencePercentage": null } ] }, "zoomData": { "initialConstraints": {}, "initialZoom": 0, "maxZoomParameters": [ { "applicationTime": null, "appliedConstraints": null, "appliedZoom": null, "isTimeoutReached": null } ], "minZoomParameters": [ { "applicationTime": null, "appliedConstraints": null, "appliedZoom": null, "isTimeoutReached": null } ] }, "exposureData": { "exposureParams": [ [] ], "frames": [ [] ], "sessionDiagnostics": [ { "exposureSupported": null, "exposureApplyConstraintError": null, "exposureApplyConstraintTimeout": null, "invalidTrackStateDetected": null, "interruptedCapture": null, "cameraCaptureStatus": null, "exposureMinDelay": null, "exposureInitialDelay": null, "baselineBrightness": null } ] }, "replayAttackData": { "collisionCount": 0, "isTimeoutReached": true, "intraSessionLoop": true, "intraSessionLookahead": true, "interSessionLookahead": true, "totalFrames": 0, "uniqueHashes": 0, "maxConsecutiveRun": 0, "maxOccurrenceCount": 0, "storedSessionsCount": 0, "storedHashesCount": 0, "storedSessionSizes": [ 0 ], "intraIncodeSessionLoop": true, "interIncodeSessionLoop": true }, "environmentIntegrity": { "rootDetected": true, "storageTamperingDetected": true, "environmentHookingDetected": true, "wasmTamperingDetected": true, "challengeInterruptionDetected": true, "debugModeDetected": true }, "isMotionEnabled": true, "sensorDataReference": "string" }, "behavior": { "detectionValuesDeviation": "PASS", "monotonicBorder": "PASS", "motionStatus": "PASS" }, "captureMode": "AUTO", "hasDepth": true, "expectedDepth": true, "mediaInfo": { "videoChecksum": "string" }, "clientLogs": "string" }, "ocrDataConfidence": { "birthDateConfidence": 0, "nameConfidence": 0, "nameNativeScriptConfidence": 0, "firstNameNativeScriptConfidence": 0, "paternalLastNameNativeScriptConfidence": 0, "maternalLastNameNativeScriptConfidence": 0, "givenNameConfidence": 0, "firstNameConfidence": 0, "middleNameConfidence": 0, "nameSuffixConfidence": 0, "mothersSurnameConfidence": 0, "fathersSurnameConfidence": 0, "nickNameConfidence": 0, "fullNameMrzConfidence": 0, "mothersNameConfidence": 0, "fathersNameConfidence": 0, "mothersIdNumberConfidence": 0, "fathersIdNumberConfidence": 0, "spouseNameConfidence": 0, "birthNameConfidence": 0, "addressConfidence": 0, "streetConfidence": 0, "colonyConfidence": 0, "postalCodeConfidence": 0, "cityConfidence": 0, "stateConfidence": 0, "districtConfidence": 0, "stateCodeConfidence": 0, "countryCodeConfidence": 0, "genderConfidence": 0, "issueDateConfidence": 0, "expirationDateConfidence": 0, "issuedAtConfidence": 0, "expireAtConfidence": 0, "issuingAuthorityConfidence": 0, "mrz1Confidence": 0, "mrz2Confidence": 0, "mrz3Confidence": 0, "mrzFullConfidence": 0, "documentNumberConfidence": 0, "backNumberConfidence": 0, "personalNumberConfidence": 0, "nationalNumberConfidence": 0, "claveDeElectorConfidence": 0, "numeroEmisionCredencialConfidence": 0, "curpConfidence": 0, "nueConfidence": 0, "registrationDateConfidence": 0, "heightConfidence": 0, "birthPlaceConfidence": 0, "bloodTypeConfidence": 0, "eyeColorConfidence": 0, "classesConfidence": 0, "condConfidence": 0, "mentionsConfidence": 0, "refNumberConfidence": 0, "weightConfidence": 0, "hairConfidence": 0, "restrictionsConfidence": 0, "nationalityConfidence": 0, "nationalityMrzConfidence": 0, "nationalityAlpha3Confidence": 0, "maritalStatusConfidence": 0, "raceConfidence": 0, "taxIdNumberConfidence": 0, "jurisdictionCodeConfidence": 0 }, "userConsentTitle": "string", "userConsentText": "string", "userConsentStatus": true, "mlConsentStatus": true, "signedConsents": [ { "consentType": "ML", "regulationType": "US", "signed": true, "consentId": "string", "signedTime": 0 } ], "frontIdCaptureType": "AUTO", "backIdCaptureType": "AUTO", "selfieCaptureType": "AUTO", "omniVersion": "string", "clientId": "string", "scoresInfoId": "string", "shadowScoresInfoId": "string", "idAlreadyUsed": true, "idAlreadyUsedInterviewId": "string", "appliedTotalRule": { "name": "string", "expression": "string", "ruleType": "idValidation", "status": "OK", "triggered": true }, "needsReviewReason": "MANUAL_CAPTURE", "documentSubmissionMethod": "CAPTURED_DOCUMENT", "credentialsProvider": "APPLE", "formName": "string", "formFirstName": "string", "formLastName": "string", "formCpf": "string", "documentNumberSource": "FORM", "antifraudResult": { "originalStatus": "FAILED", "resolved": true, "resolvedReason": "string" }, "scannerSignals": { "b900InkCheck": true, "uvDullnessFront": true, "uvDullnessBack": true, "motionDetectionFront": true, "motionDetectionBack": true }, "elUnsignedDocuments": [ { "uuid": "string", "s3location": "string", "createdTime": 0, "documentName": "string" } ], "elSignedDocuments": [ { "uuid": "string", "s3location": "string", "createdTime": 0, "signerKeyName": "string", "externalFileId": "string" } ], "elSignedSignerKeyName": "string", "otpPhoneVerified": true, "otpEmailVerified": true, "tamperedSeverity": "low", "paperSeverity": "low", "screenSeverity": "low", "idAlterationModelVersion": "string", "idAlterationSeverity": "low", "fontAlterationConfidence": 0, "fontAlterationModelVersion": "string", "fontAlterationSeverity": "low", "punchedHolesModelVersion": "string", "punchedHolesSeverity": "low", "idLaminationModelVersion": "string", "idLaminationSeverity": "low", "idLaminationConfidence": 0, "idDamageDetectionModelVersion": "string", "idDamageDetectionSeverity": "low", "idDamageDetectionConfidence": 0, "aiGeneratedDocumentSeverity": "low", "aiGeneratedDocumentModelVersion": "string", "aiGeneratedDocumentConfidence": 0, "documentVisualAnomalySeverity": "low", "documentVisualAnomalyModelVersion": "string", "documentVisualAnomalyConfidence": 0, "fakeIdSeverity": "low", "fakeIdModelVersion": "string", "fakeIdInternalSeverity": "low", "fakeIdInternalModelVersion": "string", "batchId": "string", "tamperedConfidenceCorrected": 0, "fakeIdConfidenceCorrected": 0, "paperConfidenceCorrected": 0, "screenConfidenceCorrected": 0, "faceSpoofCorrected": true, "faceMismatchCorrected": true, "labelingComplete": true, "personalIdentificationNumberProvider": "UNKNOWN", "ineReferenceId": "string", "isReportedAsFraud": true, "fraudCandidateId": "string", "cleanedExceptAuthData": true, "isPartOfExperimentGroup": true, "featureGates": {}, "userProvidedName": "string", "userProvidedBirthDate": "string", "paperFrontConfidence": 0, "paperFrontModelVersion": "string", "screenFrontConfidence": 0, "screenFrontModelVersion": "string", "paperBackConfidence": 0, "paperBackModelVersion": "string", "screenBackConfidence": 0, "screenBackModelVersion": "string", "paperFrontConfidenceCorrected": 0, "screenFrontConfidenceCorrected": 0, "paperBackConfidenceCorrected": 0, "screenBackConfidenceCorrected": 0, "idAlterationFrontConfidence": 0, "idAlterationBackConfidence": 0, "frontPunchedHoles": { "confidence": 0 }, "backPunchedHoles": { "confidence": 0 }, "faceBrightness": 0, "dlClassRestrictions": [ { "dlClass": "string", "raw": "string", "fullRaw": "string", "baseCode": "string", "subCode": "string", "payload": [ "string" ] } ], "idValidationDeepCheck": true, "acuantId": "string", "mAdminArea": "string", "mSubAdminArea": "string", "mLocality": "string", "mSubLocality": "string", "mThoroughfare": "string", "mSubThoroughfare": "string", "mPostalCode": "string", "mCountryCode": "string", "mCountryName": "string", "gWatchlistType": "person", "gWatchlistShareUrl": "string", "gWatchlistMatchStatus": "no_match", "gWatchlistRiskLevel": "low", "gWatchlistTotalHits": 0, "gWatchlistTotalMatches": 0, "gWatchlistSanctionsMatchScore": 0, "gWatchlistWarningMatchScore": 0 } ] ``` --- - Path: `api-reference/internal-dashboard-executive-log-in` - URL: https://developer.incode.com/api-reference/internal-dashboard-executive-log-in/ - Markdown: https://developer.incode.com/api-reference/internal-dashboard-executive-log-in.md - Endpoint: `POST /omni/internal/dashboard/executive/log-in` # Login admin token `POST /omni/internal/dashboard/executive/log-in` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Logs in an user and provides a token with high-privileges ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `email` | string | yes | | | `password` | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `token` | string | | Access token for next calls | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/internal/dashboard/executive/log-in \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "email": "", "password": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/internal/dashboard/executive/log-in", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "email": "", "password": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/internal/dashboard/executive/log-in", headers=headers, json={ "email": "", "password": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/internal/dashboard/executive/log-in")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"email\": \"\",\n \"password\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "token": "eyJhbGciOasfasiJ9.eyJleHRl2OTg5NX0.zdbAC-kE-I71" } ``` --- - Path: `api-reference/internal-start` - URL: https://developer.incode.com/api-reference/internal-start/ - Markdown: https://developer.incode.com/api-reference/internal-start.md - Endpoint: `POST /omni/internal/start` # Start onboarding internal `POST /omni/internal/start` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is mandatory to start any onboarding session in Incode Omni and session can be monitored on the Incode Dashboard. This endpoint is internal because it can be called only from Authentication Server. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `language` | string | | Language code to be used when doing speech to text. Possible values: en-US, es-ES, pt-BR. | | `externalId` | string | | Id that identifies user in clients system should be used for externalId. (Deprecated, use externalCustomerId instead) | | `externalCustomerId` | string | | Id that identifies user in clients external system. | | `uuid` | string | | uuid key used in redis, can be used as an alternative to sending interviewId. | | `configurationId` | string | | Id of the flow to be used for this onboarding. | | `redirectionUrl` | string | | Url the user will be redirected to after finishing the onboarding successfully. | | `integrationReference` | string | | Optional integration reference. | | `urlUuid` | string | | Url uuid key used in redis. Will be validated in start if qrPhishingResistance is ON. | | `customFields` | object | | Used to send any additional information in key value pair format. Max fields: {maxEntries}, max key length: {keyMaxLength}, max value length: {valueMaxLength} | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewId` | string | | Identifies the onboarding session that is initialized. Can be used for fetching data about that session in future calls. | | `token` | string | | Internal JWT token used for the future subsequent calls. It is the value for X-Incode-Hardware-Id header in all other calls. | | `interviewCode` | string | | This value is used for connecting to conference call. | | `flowType` | string | | (only if configurationId is sent in request). Type of the flow used. Could be flow (in most cases), or legacy type configuration (not used anymore). Enum: `configuration`, `flow`, `workflow` | | `idCaptureTimeout` | integer (int32) | | Number of seconds after which manual capture button should be shown to the user, while capturing ID when ID is detected. | | `idDetectionTimeout` | integer (int32) | | Number of seconds after which manual capture button should be shown to the user, if ID is not detected. | | `selfieCaptureTimeout` | integer (int32) | | Number of seconds after which manual capture button should be shown to the user, while capturing selfie. | | `idCaptureRetries` | integer (int32) | | Number of ID captures after which user should be taken to next screen. | | `selfieCaptureRetries` | integer (int32) | | Number of selfie captures after which user should be taken to next screen. | | `curpValidationRetries` | integer (int32) | | Number of curp validations after which user should be taken to next screen. (only for Mexico) | | `clientId` | string | | Customer specific clientId that corresponds to api key. | | `env` | string | | Server environment. Could be one of: stage, demo, saas. | | `existingSession` | boolean | | It's true if interviewId corresponds to an existing Onboarding Session. | ### 400 Custom error statuses: - 4026: Invalid uuid parameter - 4027: Invalid configurationId - 4028: Flow is not activated - 4081: Invalid parameters for validation Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/internal/start \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "language": "", "externalId": "", "externalCustomerId": "", "uuid": "", "configurationId": "", "redirectionUrl": "", "integrationReference": "", "urlUuid": "", "customFields": {} }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/internal/start", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "language": "", "externalId": "", "externalCustomerId": "", "uuid": "", "configurationId": "", "redirectionUrl": "", "integrationReference": "", "urlUuid": "", "customFields": {} }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/internal/start", headers=headers, json={ "language": "", "externalId": "", "externalCustomerId": "", "uuid": "", "configurationId": "", "redirectionUrl": "", "integrationReference": "", "urlUuid": "", "customFields": {} }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/internal/start")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"language\": \"\",\n \"externalId\": \"\",\n \"externalCustomerId\": \"\",\n \"uuid\": \"\",\n \"configurationId\": \"\",\n \"redirectionUrl\": \"\",\n \"integrationReference\": \"\",\n \"urlUuid\": \"\",\n \"customFields\": {}\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "interviewId": "string", "token": "string", "interviewCode": "string", "flowType": "configuration", "idCaptureTimeout": 0, "idDetectionTimeout": 0, "selfieCaptureTimeout": 0, "idCaptureRetries": 0, "selfieCaptureRetries": 0, "curpValidationRetries": 0, "clientId": "string", "env": "string", "existingSession": true } ``` --- - Path: `api-reference/interview` - URL: https://developer.incode.com/api-reference/interview/ - Markdown: https://developer.incode.com/api-reference/interview.md - Endpoint: `DELETE /omni/interview` # Delete PII data for single onboarding session. `DELETE /omni/interview` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Delete all PII data for onboarding sessions by given array of interview ids. Note: Works with Admin Token.Please, bear in mind that usage of this API endpoint for deletion of Customer Data will mean that Incode will no longer have access to it nor will be able to review or analyze any issue related to deleted Customer Data. After deletion, as Incode will not be able to retrieve the deleted Customer Data, any potential claims related to such data will be waived by Customer. Finally, for clarity purposes, Incode may continue to process information derived from Customer Data that has been deidentified, anonymized, and/or aggregated such that the data is no longer considered Personal Data under applicable Data Protection Laws and in a manner that does not identify individuals or Customer to improve its services and defend its legitimate interests. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | yes | Specify which interview. | | `keepCustomer` | query | boolean | | True or false. Indicates whether to keep idenity of the customer or not. Default is false(which means session and customer identity both will be deleted). | | `sendNotification` | query | boolean | | Flag to send a notification about a change interview status | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X DELETE https://demo-api.incodesmile.com/omni/interview \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/interview", { method: "DELETE", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.delete("https://demo-api.incodesmile.com/omni/interview", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/interview")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("DELETE", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/interview-events-dictionary` - URL: https://developer.incode.com/api-reference/interview-events-dictionary/ - Markdown: https://developer.incode.com/api-reference/interview-events-dictionary.md - Endpoint: `GET /omni/interview-events/dictionary` # Fetch interview event dictionary `GET /omni/interview-events/dictionary` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Returns the list of all existing interview event types ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 OK ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/interview-events/dictionary \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/interview-events/dictionary", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/interview-events/dictionary", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/interview-events/dictionary")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json [ { "code": "string", "sender": "BACKEND", "description": "string", "locales": [ { "locale": "string", "name": "string" } ] } ] ``` --- - Path: `api-reference/interviews` - URL: https://developer.incode.com/api-reference/interviews/ - Markdown: https://developer.incode.com/api-reference/interviews.md - Endpoint: `DELETE /omni/interviews` # Delete PII data for multiple onboarding sessions with multiple options. `DELETE /omni/interviews` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Delete all PII data for onboarding sessions by given array of interview ids. Note: Works with Admin Token.Please, bear in mind that usage of this API endpoint for deletion of Customer Data will mean that Incode will no longer have access to it nor will be able to review or analyze any issue related to deleted Customer Data. After deletion, as Incode will not be able to retrieve the deleted Customer Data, any potential claims related to such data will be waived by Customer. Finally, for clarity purposes, Incode may continue to process information derived from Customer Data that has been deidentified, anonymized, and/or aggregated such that the data is no longer considered Personal Data under applicable Data Protection Laws and in a manner that does not identify individuals or Customer to improve its services and defend its legitimate interests. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `filter` | DeleteInterviewsFilterDto | yes | Filter for cleaning interview | | `filter.ids` | array[string] | | List of identifiers interviews | | `filter.flowId` | string | | Flow id, if passed, then delete all interviews related to this flow | | `filter.externalId` | string | | Specify which external-id. | | `filter.externalCustomerId` | string | | Specify which external-customer-id. | | `filter.lastActiveDate` | string (date-time) | | To delete all interviews active before this date | | `config` | DeleteInterviewsConfigDto | | Configuration for cleaning interview | | `config.deletePiiDataOnly` | boolean | | Boolean, optional. Flag indicating if this is partial delete, where only PII fields should be removed. Default is true. Note: False is allowed to be used only if this organization has the required setting. | | `config.deletionMode` | string | | Specifies the type of deletion to perform. Enum: `BIOMETRICS`, `PII`, `FULL` | | `config.sendNotification` | boolean | | Flag indicating to send a notification about a change interview status | | `config.relatedEntitiesToKeep` | array[string] | | List of related entities to be saved. Works only when deletePiiDataOnly=true Enum: `identities`, `faceTemplates`, `images`, `stats`, `chats`, `deviceFingerPrints` | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `taskId` | string | | | | `statusUri` | string | | | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X DELETE https://demo-api.incodesmile.com/omni/interviews \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "filter": "", "filter.ids": [], "filter.flowId": "", "filter.externalId": "", "filter.externalCustomerId": "", "filter.lastActiveDate": "", "config": "", "config.deletePiiDataOnly": false, "config.deletionMode": "", "config.sendNotification": false, "config.relatedEntitiesToKeep": [] }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/interviews", { method: "DELETE", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "filter": "", "filter.ids": [], "filter.flowId": "", "filter.externalId": "", "filter.externalCustomerId": "", "filter.lastActiveDate": "", "config": "", "config.deletePiiDataOnly": false, "config.deletionMode": "", "config.sendNotification": false, "config.relatedEntitiesToKeep": [] }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.delete("https://demo-api.incodesmile.com/omni/interviews", headers=headers, json={ "filter": "", "filter.ids": [], "filter.flowId": "", "filter.externalId": "", "filter.externalCustomerId": "", "filter.lastActiveDate": "", "config": "", "config.deletePiiDataOnly": False, "config.deletionMode": "", "config.sendNotification": False, "config.relatedEntitiesToKeep": [] }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/interviews")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("DELETE", HttpRequest.BodyPublishers.ofString("{\n \"filter\": \"\",\n \"filter.ids\": [],\n \"filter.flowId\": \"\",\n \"filter.externalId\": \"\",\n \"filter.externalCustomerId\": \"\",\n \"filter.lastActiveDate\": \"\",\n \"config\": \"\",\n \"config.deletePiiDataOnly\": false,\n \"config.deletionMode\": \"\",\n \"config.sendNotification\": false,\n \"config.relatedEntitiesToKeep\": []\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "taskId": "string", "statusUri": "string" } ``` --- - Path: `api-reference/onboarding-authentications-authenticate` - URL: https://developer.incode.com/api-reference/onboarding-authentications-authenticate/ - Markdown: https://developer.incode.com/api-reference/onboarding-authentications-authenticate.md - Endpoint: `POST /omni/onboarding-authentications/authenticate` # Authentication with face/selfie image `POST /omni/onboarding-authentications/authenticate` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Authenticate user by comparing base64 image from request and user's existing face template. In case of One to one authentication, user is first found in DB by hint from request. At least one of criteria parameter must be sent in request. In case of One to N authentication, hint is not used. In case face doesn't match error response is returned. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | yes | Image of user's face represented in base64. | | `faceCoordinates` | FaceCoordinatesDto | | Face coordinates | | `faceCoordinates.leftEyeX` | number (float) | yes | Left eye coordinates for X | | `faceCoordinates.leftEyeY` | number (float) | yes | Left eye coordinates for Y | | `faceCoordinates.rightEyeX` | number (float) | yes | Right eye coordinates for X | | `faceCoordinates.rightEyeY` | number (float) | yes | Right eye coordinates for Y | | `faceCoordinates.mouthX` | number (float) | | Left mouth coordinates for X. Note: the field is deprecated, use leftMouthX instead | | `faceCoordinates.leftMouthX` | number (float) | | Left mouth coordinates for X | | `faceCoordinates.mouthY` | number (float) | | Left mouth coordinates for Y. Note: the field is deprecated, use leftMouthY instead | | `faceCoordinates.leftMouthY` | number (float) | | Left mouth coordinates for Y | | `faceCoordinates.rightMouthX` | number (float) | yes | Right mouth coordinates for X | | `faceCoordinates.rightMouthY` | number (float) | yes | Right mouth coordinates for Y | | `faceCoordinates.noseTipX` | number (float) | yes | Nose coordinates for X | | `faceCoordinates.noseTipY` | number (float) | yes | Nose coordinates for Y | | `faceCoordinates.x` | number (float) | yes | X coordinate of face rectangle. | | `faceCoordinates.y` | number (float) | yes | Y coordinate of face rectangle. | | `faceCoordinates.width` | number (float) | yes | Width of face rectangle. | | `faceCoordinates.height` | number (float) | yes | Height of face rectangle. | | `hint` | string | | Customer hint. Possible hints are: customer id, email, phone number... | | `recordingId` | string | | Id of recording used in spoof detection. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `overallStatus` | string | | Authentication status: FAIL/PASS. Enum: `PASS`, `FAIL` | | `captureAttemptsLimit` | CaptureAttemptsLimitDto | | Checked only if configured in the session flow. Shows remaining number of attempts, and maximum number of attempts allowed. | | `captureAttemptsLimit.max` | integer (int32) | | Maximum number of attempts to capture a photo. | | `captureAttemptsLimit.remaining` | integer (int32) | | Number of remaining attempts to capture a photo. | | `candidate` | string | | Id of matched candidate. | | `error` | OnboardingAuthenticationErrorDto | | Error name and description pair. Possible error names are: INACTIVE_SESSION, NONEXISTENT_CUSTOMER, LENSES_DETECTED, FACE_MASK_DETECTED, HEAD_COVER_DETECTED, CLOSED_EYES_DETECTED, FACE_TOO_DARK, SPOOF_ATTEMPT_DETECTED, USER_IS_NOT_RECOGNIZED, SELFIE_IMAGE_LOW_QUALITY, MULTIPLE_FACES_DETECTED, HINT_NOT_PROVIDED, FACE_NOT_FOUND, FACE_CROPPING_FAILED, FACE_TOO_SMALL, FACE_TOO_BLURRY, BAD_PHOTO_QUALITY, PROCESSING_ERROR, BAD_REQUEST | | `error.name` | string | | | | `error.message` | string | | | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/onboarding-authentications/authenticate \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "faceCoordinates": "", "faceCoordinates.leftEyeX": 0, "faceCoordinates.leftEyeY": 0, "faceCoordinates.rightEyeX": 0, "faceCoordinates.rightEyeY": 0, "faceCoordinates.mouthX": 0, "faceCoordinates.leftMouthX": 0, "faceCoordinates.mouthY": 0, "faceCoordinates.leftMouthY": 0, "faceCoordinates.rightMouthX": 0, "faceCoordinates.rightMouthY": 0, "faceCoordinates.noseTipX": 0, "faceCoordinates.noseTipY": 0, "faceCoordinates.x": 0, "faceCoordinates.y": 0, "faceCoordinates.width": 0, "faceCoordinates.height": 0, "hint": "", "recordingId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/onboarding-authentications/authenticate", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "faceCoordinates": "", "faceCoordinates.leftEyeX": 0, "faceCoordinates.leftEyeY": 0, "faceCoordinates.rightEyeX": 0, "faceCoordinates.rightEyeY": 0, "faceCoordinates.mouthX": 0, "faceCoordinates.leftMouthX": 0, "faceCoordinates.mouthY": 0, "faceCoordinates.leftMouthY": 0, "faceCoordinates.rightMouthX": 0, "faceCoordinates.rightMouthY": 0, "faceCoordinates.noseTipX": 0, "faceCoordinates.noseTipY": 0, "faceCoordinates.x": 0, "faceCoordinates.y": 0, "faceCoordinates.width": 0, "faceCoordinates.height": 0, "hint": "", "recordingId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/onboarding-authentications/authenticate", headers=headers, json={ "base64Image": "", "faceCoordinates": "", "faceCoordinates.leftEyeX": 0, "faceCoordinates.leftEyeY": 0, "faceCoordinates.rightEyeX": 0, "faceCoordinates.rightEyeY": 0, "faceCoordinates.mouthX": 0, "faceCoordinates.leftMouthX": 0, "faceCoordinates.mouthY": 0, "faceCoordinates.leftMouthY": 0, "faceCoordinates.rightMouthX": 0, "faceCoordinates.rightMouthY": 0, "faceCoordinates.noseTipX": 0, "faceCoordinates.noseTipY": 0, "faceCoordinates.x": 0, "faceCoordinates.y": 0, "faceCoordinates.width": 0, "faceCoordinates.height": 0, "hint": "", "recordingId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/onboarding-authentications/authenticate")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"faceCoordinates\": \"\",\n \"faceCoordinates.leftEyeX\": 0,\n \"faceCoordinates.leftEyeY\": 0,\n \"faceCoordinates.rightEyeX\": 0,\n \"faceCoordinates.rightEyeY\": 0,\n \"faceCoordinates.mouthX\": 0,\n \"faceCoordinates.leftMouthX\": 0,\n \"faceCoordinates.mouthY\": 0,\n \"faceCoordinates.leftMouthY\": 0,\n \"faceCoordinates.rightMouthX\": 0,\n \"faceCoordinates.rightMouthY\": 0,\n \"faceCoordinates.noseTipX\": 0,\n \"faceCoordinates.noseTipY\": 0,\n \"faceCoordinates.x\": 0,\n \"faceCoordinates.y\": 0,\n \"faceCoordinates.width\": 0,\n \"faceCoordinates.height\": 0,\n \"hint\": \"\",\n \"recordingId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "overallStatus": "PASS", "captureAttemptsLimit": { "max": 0, "remaining": 0 }, "candidate": "string", "error": { "name": "string", "message": "string" } } ``` --- - Path: `api-reference/onboarding-authentications-authenticate-third-party` - URL: https://developer.incode.com/api-reference/onboarding-authentications-authenticate-third-party/ - Markdown: https://developer.incode.com/api-reference/onboarding-authentications-authenticate-third-party.md - Endpoint: `POST /omni/onboarding-authentications/authenticate/third-party` # Authentication with face/selfie image `POST /omni/onboarding-authentications/authenticate/third-party` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Authenticate user by comparing base64 image from request and user's existing face template. In case of One to one authentication, user is first found in DB by hint from request. At least one of criteria parameter must be sent in request. In case of One to N authentication, hint is not used. In case face doesn't match error response is returned. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | yes | Image of user's face represented in base64. | | `faceCoordinates` | FaceCoordinatesDto | | Face coordinates | | `faceCoordinates.leftEyeX` | number (float) | yes | Left eye coordinates for X | | `faceCoordinates.leftEyeY` | number (float) | yes | Left eye coordinates for Y | | `faceCoordinates.rightEyeX` | number (float) | yes | Right eye coordinates for X | | `faceCoordinates.rightEyeY` | number (float) | yes | Right eye coordinates for Y | | `faceCoordinates.mouthX` | number (float) | | Left mouth coordinates for X. Note: the field is deprecated, use leftMouthX instead | | `faceCoordinates.leftMouthX` | number (float) | | Left mouth coordinates for X | | `faceCoordinates.mouthY` | number (float) | | Left mouth coordinates for Y. Note: the field is deprecated, use leftMouthY instead | | `faceCoordinates.leftMouthY` | number (float) | | Left mouth coordinates for Y | | `faceCoordinates.rightMouthX` | number (float) | yes | Right mouth coordinates for X | | `faceCoordinates.rightMouthY` | number (float) | yes | Right mouth coordinates for Y | | `faceCoordinates.noseTipX` | number (float) | yes | Nose coordinates for X | | `faceCoordinates.noseTipY` | number (float) | yes | Nose coordinates for Y | | `faceCoordinates.x` | number (float) | yes | X coordinate of face rectangle. | | `faceCoordinates.y` | number (float) | yes | Y coordinate of face rectangle. | | `faceCoordinates.width` | number (float) | yes | Width of face rectangle. | | `faceCoordinates.height` | number (float) | yes | Height of face rectangle. | | `hint` | string | | Customer hint. Possible hints are: customer id, email, phone number... | | `recordingId` | string | | Id of recording used in spoof detection. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `overallStatus` | string | | Authentication status: FAIL/PASS. Enum: `PASS`, `FAIL` | | `captureAttemptsLimit` | CaptureAttemptsLimitDto | | Checked only if configured in the session flow. Shows remaining number of attempts, and maximum number of attempts allowed. | | `captureAttemptsLimit.max` | integer (int32) | | Maximum number of attempts to capture a photo. | | `captureAttemptsLimit.remaining` | integer (int32) | | Number of remaining attempts to capture a photo. | | `candidate` | string | | Id of matched candidate. | | `error` | OnboardingAuthenticationErrorDto | | Error name and description pair. Possible error names are: INACTIVE_SESSION, NONEXISTENT_CUSTOMER, LENSES_DETECTED, FACE_MASK_DETECTED, HEAD_COVER_DETECTED, CLOSED_EYES_DETECTED, FACE_TOO_DARK, SPOOF_ATTEMPT_DETECTED, USER_IS_NOT_RECOGNIZED, SELFIE_IMAGE_LOW_QUALITY, MULTIPLE_FACES_DETECTED, HINT_NOT_PROVIDED, FACE_NOT_FOUND, FACE_CROPPING_FAILED, FACE_TOO_SMALL, FACE_TOO_BLURRY, BAD_PHOTO_QUALITY, PROCESSING_ERROR, BAD_REQUEST | | `error.name` | string | | | | `error.message` | string | | | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/onboarding-authentications/authenticate/third-party \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "faceCoordinates": "", "faceCoordinates.leftEyeX": 0, "faceCoordinates.leftEyeY": 0, "faceCoordinates.rightEyeX": 0, "faceCoordinates.rightEyeY": 0, "faceCoordinates.mouthX": 0, "faceCoordinates.leftMouthX": 0, "faceCoordinates.mouthY": 0, "faceCoordinates.leftMouthY": 0, "faceCoordinates.rightMouthX": 0, "faceCoordinates.rightMouthY": 0, "faceCoordinates.noseTipX": 0, "faceCoordinates.noseTipY": 0, "faceCoordinates.x": 0, "faceCoordinates.y": 0, "faceCoordinates.width": 0, "faceCoordinates.height": 0, "hint": "", "recordingId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/onboarding-authentications/authenticate/third-party", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "faceCoordinates": "", "faceCoordinates.leftEyeX": 0, "faceCoordinates.leftEyeY": 0, "faceCoordinates.rightEyeX": 0, "faceCoordinates.rightEyeY": 0, "faceCoordinates.mouthX": 0, "faceCoordinates.leftMouthX": 0, "faceCoordinates.mouthY": 0, "faceCoordinates.leftMouthY": 0, "faceCoordinates.rightMouthX": 0, "faceCoordinates.rightMouthY": 0, "faceCoordinates.noseTipX": 0, "faceCoordinates.noseTipY": 0, "faceCoordinates.x": 0, "faceCoordinates.y": 0, "faceCoordinates.width": 0, "faceCoordinates.height": 0, "hint": "", "recordingId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/onboarding-authentications/authenticate/third-party", headers=headers, json={ "base64Image": "", "faceCoordinates": "", "faceCoordinates.leftEyeX": 0, "faceCoordinates.leftEyeY": 0, "faceCoordinates.rightEyeX": 0, "faceCoordinates.rightEyeY": 0, "faceCoordinates.mouthX": 0, "faceCoordinates.leftMouthX": 0, "faceCoordinates.mouthY": 0, "faceCoordinates.leftMouthY": 0, "faceCoordinates.rightMouthX": 0, "faceCoordinates.rightMouthY": 0, "faceCoordinates.noseTipX": 0, "faceCoordinates.noseTipY": 0, "faceCoordinates.x": 0, "faceCoordinates.y": 0, "faceCoordinates.width": 0, "faceCoordinates.height": 0, "hint": "", "recordingId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/onboarding-authentications/authenticate/third-party")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"faceCoordinates\": \"\",\n \"faceCoordinates.leftEyeX\": 0,\n \"faceCoordinates.leftEyeY\": 0,\n \"faceCoordinates.rightEyeX\": 0,\n \"faceCoordinates.rightEyeY\": 0,\n \"faceCoordinates.mouthX\": 0,\n \"faceCoordinates.leftMouthX\": 0,\n \"faceCoordinates.mouthY\": 0,\n \"faceCoordinates.leftMouthY\": 0,\n \"faceCoordinates.rightMouthX\": 0,\n \"faceCoordinates.rightMouthY\": 0,\n \"faceCoordinates.noseTipX\": 0,\n \"faceCoordinates.noseTipY\": 0,\n \"faceCoordinates.x\": 0,\n \"faceCoordinates.y\": 0,\n \"faceCoordinates.width\": 0,\n \"faceCoordinates.height\": 0,\n \"hint\": \"\",\n \"recordingId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "overallStatus": "PASS", "captureAttemptsLimit": { "max": 0, "remaining": 0 }, "candidate": "string", "error": { "name": "string", "message": "string" } } ``` --- - Path: `api-reference/onboarding-url` - URL: https://developer.incode.com/api-reference/onboarding-url/ - Markdown: https://developer.incode.com/api-reference/onboarding-url.md - Endpoint: `GET /omni/onboarding-url` # Fetch onboarding url `GET /omni/onboarding-url` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch onboarding URL generated for specific user and specific flow. Only supply a `clientId`, if a redirect to mobile feature has been added to the flow configuration and SMS and desktop onboarding is needed. Alternatively, if only a QR code is needed, it's recommended to supply `clientId`, `components` and `tag` parameters. The alternative will return a highly performant app launcher screen when redirect to mobile has been ena bled. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `components` | query | string | | URL encode String Array of accepted string values Enum: `qr` | | `tag` | query | string | | Enum: `payments`, `verification` | | `shortUrl` | query | string | | Enum: `true`, `false` | | `api-version` | header | string | yes | | ## Responses ### 200 OK ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/onboarding-url \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/onboarding-url", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/onboarding-url", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/onboarding-url")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/oneton-mfa` - URL: https://developer.incode.com/api-reference/oneton-mfa/ - Markdown: https://developer.incode.com/api-reference/oneton-mfa.md - Endpoint: `POST /omni/oneToN/mfa` # Perform MFA `POST /omni/oneToN/mfa` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This method is used for confirming user identity by sending last four digits of his phone number. transactionId which was received in [/omni/oneToN/identify](#/Login/oneToNIdentify) response should be used. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `verificationCode` | string | | The last 4 digits of the user's phone number. | | `transactionId` | string | | Authentication identifier received in [/omni/oneToN/identify](#/Login/oneToNIdentify). | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `customerId` | string | | | | `token` | string | | | | `interviewId` | string | | | | `interviewToken` | string | | | | `transactionId` | string | | Authentication attempt identifier. | | `externalId` | string | | External ID of customer, provided by client on /omni/start call. | | `externalCustomerId` | string | | External ID of customer, provided by client on /omni/start call. | | `faceMatch` | boolean | | | | `spoofAttempt` | boolean | | Flag indicating if this was spoof attempt. | | `secondFactor` | boolean | | | | `children` | array[Child] | | | | `children.customerId` | string | | | | `children.token` | string | | | | `spoofConfidence` | number (float) | | Score between 0 and 1 that indicates if an image is a spoof. Scores closer to 0 indicate a legitimate session with a live user, whereas scores closer to 1 indicate a higher probability that the provided image is spoofed and that the session may be fraudulent. | | `overallScore` | number (float) | | Overall score search, value form 0 to 100. | | `overallStatus` | string | | Overall status Enum: `PASS`, `FAIL` | | `deviceIPLocationData` | DeviceIPLocationDataDto | | | | `deviceIPLocationData.ipAddress` | string | | | | `deviceIPLocationData.ipCountry` | string | | | | `deviceIPLocationData.ipCity` | string | | | | `deviceIPLocationData.ipRegion` | string | | | ### 400 Custom error status: - 4004: Couldn't find record with verificationCode and transactionId Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/oneToN/mfa \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "verificationCode": "", "transactionId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/oneToN/mfa", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "verificationCode": "", "transactionId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/oneToN/mfa", headers=headers, json={ "verificationCode": "", "transactionId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/oneToN/mfa")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"verificationCode\": \"\",\n \"transactionId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "customerId": "6ea0859301170f0016fbd985", "token": "eyJhbGciOiJIUzI1NiJ9.eyJleHRlcm5hbFVzZXJJZCI6IjYx85Mjdh...", "interviewId": "6gdftr59301170f0011234567", "interviewToken": "eyJhbGciOiJIUzI1NiJ9.eyJleHR6IjYx85Mj6IjYx85Mjlcm...", "transactionId": "6128ca6c515d0e0013806d55", "externalId": "string", "externalCustomerId": "string", "faceMatch": true, "spoofAttempt": true, "secondFactor": true, "children": [ { "customerId": "string", "token": "string" } ], "spoofConfidence": 0, "overallScore": 0, "overallStatus": "PASS", "deviceIPLocationData": { "ipAddress": "string", "ipCountry": "string", "ipCity": "string", "ipRegion": "string" } } ``` --- - Path: `api-reference/phone` - URL: https://developer.incode.com/api-reference/phone/ - Markdown: https://developer.incode.com/api-reference/phone.md - Endpoint: `GET /omni/phone` # Get phone `GET /omni/phone` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Get the phone previously added to the interview. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `phone` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/phone \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/phone", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/phone", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/phone")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "phone": "string" } ``` --- - Path: `api-reference/phone-post` - URL: https://developer.incode.com/api-reference/phone-post/ - Markdown: https://developer.incode.com/api-reference/phone-post.md - Endpoint: `POST /omni/phone` # Add phone `POST /omni/phone` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Add phone to interview ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `phone` | string | | User's phone number. E.164 number convention. | | `optInGranted` | boolean | | Indicates whether opt-in is granted Default: `false` | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `existingCustomer` | boolean | | Flag indicating if this user with given phone already exists in the system. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/phone \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "phone": "", "optInGranted": false }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/phone", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "phone": "", "optInGranted": false }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/phone", headers=headers, json={ "phone": "", "optInGranted": False }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/phone")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"phone\": \"\",\n \"optInGranted\": false\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "existingCustomer": true } ``` --- - Path: `api-reference/process-antifraud` - URL: https://developer.incode.com/api-reference/process-antifraud/ - Markdown: https://developer.incode.com/api-reference/process-antifraud.md - Endpoint: `GET /omni/process/antifraud` # Process Antifraud `GET /omni/process/antifraud` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint should be called only after [process-id](ref:processid) and [process-face](ref:processface) both are over. This endpoint gives ability to compare current interview with existing interviews and customers and detect anomalies than could be signs of fraud. **Important: Calling this endpoint affects the total [score](ref:getscores).** ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `status` | string | | Enum: `FAILED`, `PASSED`, `NOT_EXECUTED`, `MANUAL_REVIEW` | | `stepName` | string | | Enum: `FuzzyFieldAntifraudExecutor`, `IdFaceAntifraudExecutor`, `SelfieFaceAntifraudExecutor`, `AttemptLimitAntifraudExecutor` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/process/antifraud \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/process/antifraud", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/process/antifraud", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/process/antifraud")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "status": "FAILED", "stepName": "FuzzyFieldAntifraudExecutor" } ``` --- - Path: `api-reference/process-approve` - URL: https://developer.incode.com/api-reference/process-approve/ - Markdown: https://developer.incode.com/api-reference/process-approve.md - Endpoint: `POST /omni/process/approve` # Approve customer `POST /omni/process/approve` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Approve customer for omnichannel program. Body is optional and used for auto approve when only specific features should be approved. It is not possible to approve twice the same user (e.g. with the same phone number). ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | | Session id for which approval is requested. | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `approveComponents` | array[string] | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `uuid` | string | | Id of newly created customer if approval was successful. | | `token` | string | | Access token to be used for newly created customer, in case approval was successful. | ### 400 Custom error status: - 4006: User with given phone already exists Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/process/approve \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "approveComponents": [] }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/process/approve", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "approveComponents": [] }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/process/approve", headers=headers, json={ "approveComponents": [] }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/process/approve")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"approveComponents\": []\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "uuid": "string", "token": "string" } ``` --- - Path: `api-reference/process-face` - URL: https://developer.incode.com/api-reference/process-face/ - Markdown: https://developer.incode.com/api-reference/process-face.md - Endpoint: `POST /omni/process/face` # Process face `POST /omni/process/face` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment **Note: This endpoint should be called only after [selfie](#/Onboarding/addFaceByThirdParty) and [front-id](#/Onboarding/addFrontIdV2) both are over.** It is validating user's selfie against photo from ID (1:1 recognition). Also, this call validates if user already exists in the system (1:N recognition). **It is highly recommended that before calling this process-face endpoint, one should first finish following endpoints: [add-front](#/Onboarding/addFrontIdV2), [add-back](#/Onboarding/addBackIdV2)(not required in case of passports), [process-id](#/Onboarding/processId) and [add-selfie](#/Onboarding/addFaceByThirdParty) in order to get complete result view based on id verification, face recognition and liveness.** ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `imageType` | query | string | | Enum: `selfie`, `videoSelfie` | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `confidence` | number (float) | yes | Value 0 means that selfie doesn't match face photo from ID. | | `existingUser` | boolean | yes | Flag indicating if this user already exists in the system. | | `existingInterviewId` | string | | Session id where user is approved previously (existingUser=true). | | `existingExternalId` | string | | In case the session does have an externalId which can be assigned at start call. | | `nameMatched` | boolean | | In case user is approved previously (existingUser=true), flag indicating if names are matching. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/process/face \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/process/face", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/process/face", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/process/face")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "confidence": 0, "existingUser": true, "existingInterviewId": "string", "existingExternalId": "string", "nameMatched": true } ``` --- - Path: `api-reference/process-face-vs-second-id` - URL: https://developer.incode.com/api-reference/process-face-vs-second-id/ - Markdown: https://developer.incode.com/api-reference/process-face-vs-second-id.md - Endpoint: `POST /omni/process/face-vs-second-id` # Process face vs second id `POST /omni/process/face-vs-second-id` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment **Note**: This endpoint should be called only after [selfie](#/Onboarding/addFaceByThirdParty) and [front-second-id](#/Onboarding/addFrontSecondIdV2) both are over. It is validating user's selfie against photo from ID (1:1 recognition). Also, this call validates if user already exists in the system (1:N recognition). It is highly recommended that before calling this process-face endpoint, one should first finish following endpoints: [add-front-secondId](#/Onboarding/addFrontSecondIdV2), [add-back-secondId](#/Onboarding/addBackSecondIdV2) (not required in case of passports), [process-secondId](#/Onboarding/processSecondId) and [add-selfie](#/Onboarding/addFaceByThirdParty) in order to get complete result view based on id verification, face recognition and liveness. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `imageType` | query | string | | Enum: `selfie`, `videoSelfie` | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `confidence` | number (float) | yes | Value 0 means that selfie doesn't match face photo from ID. | | `existingUser` | boolean | yes | Flag indicating if this user already exists in the system. | | `existingInterviewId` | string | | Session id where user is approved previously (existingUser=true). | | `existingExternalId` | string | | In case the session does have an externalId which can be assigned at start call. | | `nameMatched` | boolean | | In case user is approved previously (existingUser=true), flag indicating if names are matching. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/process/face-vs-second-id \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/process/face-vs-second-id", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/process/face-vs-second-id", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/process/face-vs-second-id")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "confidence": 0, "existingUser": true, "existingInterviewId": "string", "existingExternalId": "string", "nameMatched": true } ``` --- - Path: `api-reference/process-global-watchlist` - URL: https://developer.incode.com/api-reference/process-global-watchlist/ - Markdown: https://developer.incode.com/api-reference/process-global-watchlist.md - Endpoint: `POST /omni/process/global-watchlist` # Process global watchlist `POST /omni/process/global-watchlist` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint processes a global watchlist search for an individual using the watchlist configuration defined in the flow (including settings for subscription to ongoing monitoring). It performs a comprehensive screening against global watchlists (sanctions, PEPs, adverse media) and saves the results for further processing. The endpoint returns a basic success/failure response. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `firstName` | string | | | | `surName` | string | | | | `birthYear` | integer (int32) | | Year of birth, if known | | `countryCodes` | array | | | | `watchlistTypes` | array | | | | `subscribe` | boolean | | Subscribes to updates on the watchlists to receive notification for updates on the search. | | `fuzziness` | number (float) | | Determines how closely the returned results must match the supplied name. | | `search_profile` | string | | Search profile set for the client to use specify what sources they will be searching against. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/process/global-watchlist \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "firstName": "", "surName": "", "birthYear": 0, "countryCodes": [], "watchlistTypes": [], "subscribe": false, "fuzziness": 0, "search_profile": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/process/global-watchlist", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "firstName": "", "surName": "", "birthYear": 0, "countryCodes": [], "watchlistTypes": [], "subscribe": false, "fuzziness": 0, "search_profile": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/process/global-watchlist", headers=headers, json={ "firstName": "", "surName": "", "birthYear": 0, "countryCodes": [], "watchlistTypes": [], "subscribe": False, "fuzziness": 0, "search_profile": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/process/global-watchlist")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"firstName\": \"\",\n \"surName\": \"\",\n \"birthYear\": 0,\n \"countryCodes\": [],\n \"watchlistTypes\": [],\n \"subscribe\": false,\n \"fuzziness\": 0,\n \"search_profile\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/process-government-validation` - URL: https://developer.incode.com/api-reference/process-government-validation/ - Markdown: https://developer.incode.com/api-reference/process-government-validation.md - Endpoint: `POST /omni/process/government-validation` # Process government validation `POST /omni/process/government-validation` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint reads the country code from the interview which can be set at the moment of calling the start endpoint or is updated based on the processed id. Request body can optionally contain data from id in JSON. If omitted, data from scanned ID is read. **Country codes**: **MEX**: Mexico - INE Validation. When government face validation is enabled this method compares the user's selfie against the image in the INE database. The method should be called after [add-face](#/Onboarding/addFaceByThirdParty) is over and one of ([process-id](#/Onboarding/processId) or [document-id](#/Onboarding/addDocumentId)) is over. Request parameters: - fallbackEnabled: Boolean, optional. If it is not sent, it will default to false. - scrapingMethod: Boolean, optional. If it is not sent, it will default to false. If parameter fallbackEnabled is true and there's some connection or infrastructure error with the INE service, validation by scraping will start. If parameter scrapingMethod is true, then direct connection to INE service won't be attempted and the scraping approach will be used instead. Request Body is optional - if not sent, data will be taken from the session: - ocr: String, mandatory for INE and IFE. - cic: String, mandatory for INE. - nombre: String, optional. - apellidoPaterno: String, optional. - apellidoMaterno: String, optional. - anioRegistro: String, optional. - anioEmision: String, optional. - numeroEmisionCredencial: String, mandatory for ife. - claveElector: String, mandatory for ife. - curp: String, optional. **COL**: Colombia - Registraduría Validation. Currently there's no option for face validation. Can validate registraduría or extranjería (foreign citizens living in colombia). **Note**: Government Validations for Colombia acquired via TusDatos Request Body is optional - if not sent data will be taken from the session: - idNumber: String, mandatory. - fechaEmision: String, mandatory when Nationality is not Columbia. Format dd/mm/yyyy - nombre: String, optional. - apellidoPaterno: String, optional. - apellidoMaterno: String, optional. **ARG**: Argentina - Renaper Validation. Currently there's no option for face validation. Request Body: - idNumber: String, mandatory. **PER**: Peru - Reniec Validation. Currently there's no option for face validation. Can validate Reniec. **Note**: Government Validations for Peru obtained by checking against TOC, a risk database. ID must include DNI in order to validate. Request Body is optional - if not sent data will be taken from the session. - idNumber: String, mandatory (corresponds to DNI number) - nombre: String, optional - if not provided ocrValidation for FistName will be UNKNOWN - apellidoPaterno: String, optional - if not provided ocrValidation for PaternalLastName will be UNKNOWN - apellidoMaterno: String, optional - if not provided ocrValidation for MaternalLastName will be UNKNOWN - birthDate: String, optional - if not provided ocrValidation for BirthDate will be UNKNOWN - gender: String, optional - if not provided ocrValidation for Gender will be UNKNOWN **CHL**: Chile - Sinacofi Validation. Currently there's no option for face validation. Can validate Sinacofi. **Note**: Government Validations for Chile obtained by checking against TOC, a risk database. ID must include DNI in order to validate. Request Body is optional - if not sent data will be taken from the session: - idNumber: String, mandatory (corresponds Serie) - personalNumber: String, mandatory (corresponds RUT/RUN) **AUS**: Australia - Government Validation for Passport and Driver License. Request Body is optional - if not sent data will be taken from the OCR. For Passport validation: - firstName: String, mandatory. - middleName: String, optional. - paternalLastName: String, mandatory. - cic: String, mandatory (corresponds to Passport number). - documentType: String, mandatory ("Passport"). - birthDate: String, mandatory. Format yyyy/MM/dd. - address: String, optional. For Driver License validation: - firstName: String, mandatory. - middleName: String, optional. - paternalLastName: String, mandatory. - documentType: String, mandatory ( com"DriversLicense"). - birthDate: String, mandatory. Format yyyy/MM/dd. - refNumber: String, mandatory (corresponds to Card number). - cic: String, mandatory (corresponds to License number). - issuerState: String, mandatory (e.g., "NSW"). - address: String, optional. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `fallbackEnabled` | query | boolean | | | | `scrapingMethod` | query | boolean | | | | `scrapingV2` | query | boolean | | | | `scrapingV3` | query | boolean | | | | `telcel` | query | boolean | | | | `interviewId` | query | string | | | | `countryCode` | query | string | | | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `ocr` | string | | | | `cic` | string | | | | `nombre` | string | | | | `apellidoPaterno` | string | | | | `apellidoMaterno` | string | | | | `anioRegistro` | string | | | | `anioEmision` | string | | | | `numeroEmisionCredencial` | string | | | | `claveElector` | string | | | | `curp` | string | | | | `base64Image` | string | | | | `idNumber` | string | | | | `fechaEmision` | string | | | | `personalNumber` | string | | | | `birthDate` | string | | | | `gender` | string | | | | `birthPlace` | string | | | | `address` | string | | | | `latitude` | string | | | | `longitude` | string | | | | `macAddress` | string | | | | `ip` | string | | | | `osVersion` | string | | | | `applicationName` | string | | | | `sufix` | string | | | | `firstName` | string | | | | `givenName` | string | | | | `middleName` | string | | | | `maternalLastName` | string | | | | `paternalLastName` | string | | | | `documentType` | string | | Enum: `Unknown`, `Passport`, `Visa`, `DriversLicense`, `IdentificationCard`, `Permit`, `Currency`, `ResidenceDocument`, `TravelDocument`, `BirthCertificate`, `VehicleRegistration`, `Other`, `WeaponLicense`, `TribalIdentification`, `VoterIdentification`, `Military`, `TaxIdentification`, `FederalID`, `MedicalCard` | | `refNumber` | string | | | | `issuerState` | string | | | | `documentTypeId` | integer (int32) | | | | `issuedAt` | string | | | | `documentNumber` | string | | | | `expireAt` | string | | | | `eyeColor` | string | | | | `height` | string | | | | `weight` | string | | | | `city` | string | | | | `postalCode` | string | | | | `email` | string | | | | `fullName` | string | | | | `nationality` | string | | | | `dateFormat` | string | | | | `fingerprintsData` | FingerprintsData | | | | `fingerprintsData.type` | integer (int32) | | | | `fingerprintsData.fingerprints` | array[Fingerprint] | yes | | | `fingerprintsData.fingerprints.index` | integer (int32) | | | | `fingerprintsData.fingerprints.base64Fingerprint` | string | | | | `fingerprintsData.fingerprints.fingerprintMetadata` | FingerprintMetadata | | | | `fingerprintsData.fingerprints.fingerprintMetadata.device` | string | | | | `fingerprintsData.fingerprints.fingerprintMetadata.resolution` | string | | | | `fingerprintsData.fingerprints.fingerprintMetadata.qualityScore` | string | | | ## Responses ### 200 Responses: **MEX**: - statusCode: Integer. Possible values: - OK (0, "ok"), - VALIDATION_ERROR (1, "validationError"), - INE_CONNECTION_ERROR (2, "ineConnectionError"), - INE_INFRASTRUCTURE_ERROR (3, "ineInfrastructureError"), - MODULE_NOT_SUPPORTED (4, "moduleNotSupported"), - MISSING_DOCUMENT_ID (5, "missingDocumentId"), - MISSING_SELFIE (6, "missingSelfie"), - USER_NOT_FOUND (7, "userNotFound"); - USER_NOT_FOUND_IN_INE_DB (8, "userNotFoundInIneDb"), - NOT_ENOUGH_DATA (9, "notEnoughData"), - LIVENESS_FAIL (10, "livenessFail") - INE_NOT_CURRENT (11, "ineNotCurrent") - INE_REPORTED_LOST (12, "ineReportedLost") - INE_REPORTED_STOLEN (13, "ineReportedStolen") - INE_SIGNATURE_ERROR (14, "ineSignaturError") - INE_NOT_VALID (15, "ineNotValid") - PROVIDER_UNAVAILABLE (98, "providerUnavailable"). Also returned for an INE-side service degradation (codigoRespuesta=0 with similitud1=null): the face comparison never produced a score, so recognitionConfidence stays null — distinct from a real face mismatch. In that case errorDescription identifies the cause. - COUNTRY_NOT_SUPPORTED (99, "countryNotSupported") - PROCESSING_INE (-1, "processingIne"). It only applies for Listas Nominales (INE Scraping). - PROCESSING (-4, "processing") - CONNECTION_ERROR (17, "connectionError") - INFRASTRUCTURE_ERROR (18, "infrastructureError") - TRANSACTION_LIMIT_REACHED (205, "transactionLimitReached") - valid: Boolean. Flag stating if request processed successfully. - registralSituation: Structure with following fields: - tipoSituacionRegistral: String. Possible values: [ VIGENTE, NO_VIGENTE, DATOS_NO_ENCONTRADOS ] - tipoReporteRoboExtravio: String, optional. Possible values: [ null, REPORTE_DE_EXTRAVIO, REPORTE_DE_ROBO, REPORTE_DE_ROBO_TEMPORAL, REPORTE_DE_EXTRAVIO_TEMPORAL ] - governmentValidation: Structure with following fields: - validationStatus: Structure with following fields: - value: Look statusCode - status: Look statusCode - key: - ok: when value OK - error: when value VALIDATION_ERROR, INE_INFRASTRUCTURE_ERROR, USER_NOT_FOUND_IN_INE_DB, INE_NOT_CURRENT, INE_REPORTED_LOST, INE_REPORTED_STOLEN, USER_NOT_FOUND, TRANSACTION_LIMIT_REACHED - unknown: otherwise - ocrValidation: Array of structure with following fields: - value: Possible values - true false empty - status: Possible values - OK FAIL UNKNOWN - key: Possible values - issueDate firstName maternalLastName paternalLastName ocr personalId electorsKey emissionNumber registrationDate - ocrValidationOverall: Structure with following fields: - value: Calculated value based on Ocr Validation between 0 and 100 - status: OK or FAIL based on calculation - overall: Same as ocrValidationOverall - ocrData: Look at fetch-OCR - deviceInfo: Look at fetch-deviceInfo - ineTransactionId: String **COL**: - statusCode: 0 - OK, other not OK* - governmentValidation - consists of the following fields: - validationStatus - following values: - OK (0, "ok"), - VALIDATION_ERROR (1, "validationError"), - CONNECTION_ERROR (17, "connectionError"), - USER_NOT_FOUND (7, "userNotFound"), - NOT_ENOUGH_DATA (9, "notEnoughData") - ocrValidation: Array of structure with following fields: - value: Possible values - true false empty - status: Possible values - OK FAIL UNKNOWN - key: Possible values - firstName maternalLastName paternalLastName ocr birthDate gender - governmentValidationResponse (DEPRECATED): - COL1: "governmentValidationResponse": { "codError": "0", "contract_id": 111, "departamentoExpedicion": "ATLANTICO", "descripcionEstado": "VIGENTE", "estadoCedula": "0", "fechaExpedicion": "31/12/1990", "fechaHoraConsulta": "2025-03-12 20:32:29", "municipioExpedicion": "BARRANQUILLA", "nuip": "000000000", "particula": "DE", "primerApellido": "Perez", "primerNombre": "Jose", "segundoApellido": "Perez", "segundoNombre": "Juan" } - COL2: "governmentValidationResponse": { "data": { "anio_resolucion": 0, "codigo_error_datos_cedula": 0, "codigo_respuesta": "", "departamento_expedicion": "ATLANTICO", "descripcion_estado": "Vigente", "estado_cedula": 0, "fecha_expedicion": "Mon, 31 Dec 1990 00:00:00 GMT", "informacion_adicional": "", "municipio_expedicion": "BARRANQUILLA", "nombre_completo": "Jose Juan Perez Perez", "nuip": 000000000, "numero_resolucion": 0, "particula": "DE", "primer_apellido": "Perez", "primer_nombre": "Jose", "segundo_apellido": "Perez", "segundo_nombre": "Juan" } } - ocrValidationOverall: - ocrValidationOverall: 100 - 15 each fail or unknown ocrValidation - status: ocrValidationOverall > 55 => OK, else FAIL - overall: same as ocrValidationOverall **ARG**: - statusCode: Integer. Value 0 means verification Ok. - governmentValidation - consists of following fieds: - validationStatus - following values: - OK (0, "ok") - FACE_COMPARISON_FAILED (207, "faceComparisonFailed") - PROCESSING (-4, "processing") - PROVIDER_NOT_CONFIGURED (96, "providerNotConfigured") - PROVIDER_UNAVAILABLE (98, "providerUnavailable") - USER_NOT_FOUND (7, "userNotFound") - VALIDATION_ERROR (1, "validationError") - NO_INFORMATION (204, "noInformation") **IND**: - statusCode: Integer. Value 0 means verification Ok. - otpResponse - indicates that OTP code is sent to user - authBridge - Provider name for Aadhar - otpCodeRequested - boolean - mobile - masked mobile number *******725 **PER**: - statusCode: 0 - OK, other not OK - governmentValidation - consists of following fieds: - validationStatus - following values: - OK (0, "ok"), - VALIDATION_ERROR (1, "validationError"), - INE_CONNECTION_ERROR (2, "ineConnectionError"), - USER_NOT_FOUND (7, "userNotFound"), - NOT_ENOUGH_DATA (9, "notEnoughData") - ocrValidation: Array of structure with following fields: - value: Possible values - true false empty - status: Possible values - OK FAIL UNKNOWN - key: Possible values - documentNumber firstName maternalLastName paternalLastName ocr birthDate gender - governmentValidationResponse: Response received from external source (see example) - ocrValidationOverall: - ocrValidationOverall: 100 - 15*each fail or unknown ocrValidation - status: ocrValidationOverall > 55 => OK, else FAIL - overall: same as ocrValidationOverall **CHL**: - statusCode: 0 - OK, other not OK - governmentValidation - consists of following fieds: - validationStatus - following values: - OK (0, "ok"), - VALIDATION_ERROR (1, "validationError"), - INE_CONNECTION_ERROR (2, "ineConnectionError"), - USER_NOT_FOUND (7, "userNotFound"), - NOT_ENOUGH_DATA (9, "notEnoughData") - ocrValidation: Array of structure with following fields: - value: Possible values - true false empty - status: Possible values - OK FAIL UNKNOWN - key: Possible values - documentNumber firstName maternalLastName paternalLastName ocr birthDate gender - governmentValidationResponse: Response received from external source (see example) - ocrValidationOverall: - ocrValidationOverall: 100 - 15*each fail or unknown ocrValidation - status: ocrValidationOverall > 55 => OK, else FAIL - overall: same as ocrValidationOverall **AUS**: - statusCode: 0 - OK, other not OK - valid: Boolean. Flag stating if request processed successfully. - governmentValidation - consists of following fields: - validationStatus - following values: - OK (0, "ok"), - USER_NOT_FOUND (7, "userNotFound"), - NOT_ENOUGH_DATA (9, "notEnoughData"), - CONNECTION_ERROR (17, "connectionError") - ocrValidation: Array of structure with following fields: - value: Possible values - true false - status: Possible values - OK FAIL - key: Possible values - documentNumber firstName paternalLastName birthDate expirationDate issueDate - ocrValidationOverall: - value: Calculated value between 0 and 100 - status: OK or FAIL based on calculation - overall: Same as ocrValidationOverall - errorDescription: String. Present only in error responses with values like "userNotFound", "notEnoughData", "connectionError" **BRA**: - statusCode: 0 - OK, other not OK. Always mirrors validationStatus and is independent of the overall score. - valid: Boolean. True when validationStatus is OK (statusCode 0), i.e. CPF found. Note this tracks validationStatus, NOT the overall score: an OCR-field mismatch or a SERPRO_FACE face mismatch can leave valid=true while overall is FAIL. - governmentValidation - consists of following fields: - validationStatus - following values: - OK (0, "ok"): CPF found, data and/or face matched - VALIDATION_ERROR (1, "validationError") - MODULE_NOT_SUPPORTED (4, "moduleNotSupported") - MISSING_SELFIE (6, "missingSelfie"): required for SERPRO_FACE - USER_NOT_FOUND (7, "userNotFound"): CPF not found, or face not matched - CPF_NUMBER_INVALID_OR_MISSING (16, "cpfNumberInvalidOrMissing") - CONNECTION_ERROR (17, "connectionError") - PROVIDER_NOT_CONFIGURED (96, "providerNotConfigured") - PROVIDER_UNAVAILABLE (98, "providerUnavailable") - GEOGRAPHIC_REGION_NOT_SUPPORTED (99, "geographicRegionNotSupported") - recognitionConfidence: Present when government face validation is attempted (e.g. SERPRO_FACE). - value: "100.0" when face matched, "0.0" when no match or face not in SERPRO DB - status: OK when matched, FAIL otherwise - ocrValidation: Array of structure with following fields (present for both SERPRO and SERPRO_FACE when validationStatus is OK): - value: Possible values - true false - status: Possible values - OK FAIL UNKNOWN - key: Possible values - documentNumber fullName birthDate Note: fullName is derived from firstName, paternalLastName, and maternalLastName, which all map to the same SERPRO nome field and always share the same status. - ocrValidationOverall: - value: Calculated value between 0 and 100 - status: OK or FAIL based on calculation - overall: Equals ocrValidationOverall for SERPRO. For SERPRO_FACE the face recognitionConfidence can override it (e.g. face not in DB / not matched drives overall to 0.0 FAIL even when ocrValidationOverall is OK). - errorDescription: String. Present only in error responses Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `valid` | boolean | | | | `statusCode` | integer (int32) | | | | `governmentValidation` | GovernmentValidation | | - recognitionConfidence: Present when government face validation is attempted (e.g. SERPRO_FACE). - value: "100.0" when face matched, "0.0" when no match or face not in SERPRO DB - status: OK when face matched, FAIL when no match or face not in SERPRO DB - validationStatus: Key-value mapping: - OK (0, "ok"): CPF found, data and/or face matched - VALIDATION_ERROR (1, "validationError") - MODULE_NOT_SUPPORTED (4, "moduleNotSupported") - MISSING_SELFIE (6, "missingSelfie"): selfie required for SERPRO_FACE - USER_NOT_FOUND (7, "userNotFound"): CPF not found in government DB, or face not matched - CPF_NUMBER_INVALID_OR_MISSING (16, "cpfNumberInvalidOrMissing") - CONNECTION_ERROR (17, "connectionError") - PROVIDER_NOT_CONFIGURED (96, "providerNotConfigured") - PROVIDER_UNAVAILABLE (98, "providerUnavailable") - GEOGRAPHIC_REGION_NOT_SUPPORTED (99, "geographicRegionNotSupported") - ocrValidation: List of value/status/key objects. Keys present for Brazil: - documentNumber: CPF validity check - fullName: name match (derived from firstName, paternalLastName, maternalLastName — all map to the same SERPRO nome field and always share the same status) - birthDate: date of birth match Not all keys are always present. - ocrValidationOverall: Composite result for ocrValidation score - overall: Equals ocrValidationOverall for SERPRO; for SERPRO_FACE the face recognitionConfidence can override it (e.g. face not in DB / not matched drives overall to 0.0 FAIL even when ocrValidationOverall is OK) | | `governmentValidation.recognitionConfidence` | ResultBean | | | | `governmentValidation.recognitionConfidence.value` | string | | | | `governmentValidation.recognitionConfidence.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `governmentValidation.fingerprintConfidence` | ResultBean | | | | `governmentValidation.fingerprintConfidence.value` | string | | | | `governmentValidation.fingerprintConfidence.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `governmentValidation.minimumPassingFingerprints` | integer (int32) | | | | `governmentValidation.validationStatus` | IdResultBean | | | | `governmentValidation.validationStatus.value` | string | | | | `governmentValidation.validationStatus.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `governmentValidation.validationStatus.key` | string | | | | `governmentValidation.ocrValidation` | array[IdResultBean] | | | | `governmentValidation.ocrValidation.value` | string | | | | `governmentValidation.ocrValidation.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `governmentValidation.ocrValidation.key` | string | | | | `governmentValidation.ocrValidationOverall` | ResultBean | | | | `governmentValidation.ocrValidationOverall.value` | string | | | | `governmentValidation.ocrValidationOverall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `governmentValidation.overall` | ResultBean | | | | `governmentValidation.overall.value` | string | | | | `governmentValidation.overall.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `governmentValidation.provider` | string | | | | `governmentValidation.appliedRule` | AppliedFlowRule | | Specific rule from rule engine | | `governmentValidation.appliedRule.name` | string | | Name of the rule. | | `governmentValidation.appliedRule.expression` | string | | A logical expression of the rule. | | `governmentValidation.appliedRule.ruleType` | string | | Enum: `idValidation`, `secondIdValidation`, `faceValidation`, `liveness`, `deepsight`, `eKyc`, `videoselfie`, `faceAuthentication`, `total`, `phoneRisk`, `emailRisk`, `governmentValidation` | | `governmentValidation.appliedRule.status` | string | | Enum: `OK`, `WARN`, `FAIL`, `UNKNOWN`, `MANUAL`, `MANUAL_OK`, `MANUAL_FAIL`, `MANUAL_PENDING` | | `errorDescription` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/process/government-validation \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "ocr": "", "cic": "", "nombre": "", "apellidoPaterno": "", "apellidoMaterno": "", "anioRegistro": "", "anioEmision": "", "numeroEmisionCredencial": "", "claveElector": "", "curp": "", "base64Image": "", "idNumber": "", "fechaEmision": "", "personalNumber": "", "birthDate": "", "gender": "", "birthPlace": "", "address": "", "latitude": "", "longitude": "", "macAddress": "", "ip": "", "osVersion": "", "applicationName": "", "sufix": "", "firstName": "", "givenName": "", "middleName": "", "maternalLastName": "", "paternalLastName": "", "documentType": "", "refNumber": "", "issuerState": "", "documentTypeId": 0, "issuedAt": "", "documentNumber": "", "expireAt": "", "eyeColor": "", "height": "", "weight": "", "city": "", "postalCode": "", "email": "", "fullName": "", "nationality": "", "dateFormat": "", "fingerprintsData": "", "fingerprintsData.type": 0, "fingerprintsData.fingerprints": [], "fingerprintsData.fingerprints.index": 0, "fingerprintsData.fingerprints.base64Fingerprint": "", "fingerprintsData.fingerprints.fingerprintMetadata": "", "fingerprintsData.fingerprints.fingerprintMetadata.device": "", "fingerprintsData.fingerprints.fingerprintMetadata.resolution": "", "fingerprintsData.fingerprints.fingerprintMetadata.qualityScore": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/process/government-validation", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "ocr": "", "cic": "", "nombre": "", "apellidoPaterno": "", "apellidoMaterno": "", "anioRegistro": "", "anioEmision": "", "numeroEmisionCredencial": "", "claveElector": "", "curp": "", "base64Image": "", "idNumber": "", "fechaEmision": "", "personalNumber": "", "birthDate": "", "gender": "", "birthPlace": "", "address": "", "latitude": "", "longitude": "", "macAddress": "", "ip": "", "osVersion": "", "applicationName": "", "sufix": "", "firstName": "", "givenName": "", "middleName": "", "maternalLastName": "", "paternalLastName": "", "documentType": "", "refNumber": "", "issuerState": "", "documentTypeId": 0, "issuedAt": "", "documentNumber": "", "expireAt": "", "eyeColor": "", "height": "", "weight": "", "city": "", "postalCode": "", "email": "", "fullName": "", "nationality": "", "dateFormat": "", "fingerprintsData": "", "fingerprintsData.type": 0, "fingerprintsData.fingerprints": [], "fingerprintsData.fingerprints.index": 0, "fingerprintsData.fingerprints.base64Fingerprint": "", "fingerprintsData.fingerprints.fingerprintMetadata": "", "fingerprintsData.fingerprints.fingerprintMetadata.device": "", "fingerprintsData.fingerprints.fingerprintMetadata.resolution": "", "fingerprintsData.fingerprints.fingerprintMetadata.qualityScore": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/process/government-validation", headers=headers, json={ "ocr": "", "cic": "", "nombre": "", "apellidoPaterno": "", "apellidoMaterno": "", "anioRegistro": "", "anioEmision": "", "numeroEmisionCredencial": "", "claveElector": "", "curp": "", "base64Image": "", "idNumber": "", "fechaEmision": "", "personalNumber": "", "birthDate": "", "gender": "", "birthPlace": "", "address": "", "latitude": "", "longitude": "", "macAddress": "", "ip": "", "osVersion": "", "applicationName": "", "sufix": "", "firstName": "", "givenName": "", "middleName": "", "maternalLastName": "", "paternalLastName": "", "documentType": "", "refNumber": "", "issuerState": "", "documentTypeId": 0, "issuedAt": "", "documentNumber": "", "expireAt": "", "eyeColor": "", "height": "", "weight": "", "city": "", "postalCode": "", "email": "", "fullName": "", "nationality": "", "dateFormat": "", "fingerprintsData": "", "fingerprintsData.type": 0, "fingerprintsData.fingerprints": [], "fingerprintsData.fingerprints.index": 0, "fingerprintsData.fingerprints.base64Fingerprint": "", "fingerprintsData.fingerprints.fingerprintMetadata": "", "fingerprintsData.fingerprints.fingerprintMetadata.device": "", "fingerprintsData.fingerprints.fingerprintMetadata.resolution": "", "fingerprintsData.fingerprints.fingerprintMetadata.qualityScore": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/process/government-validation")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"ocr\": \"\",\n \"cic\": \"\",\n \"nombre\": \"\",\n \"apellidoPaterno\": \"\",\n \"apellidoMaterno\": \"\",\n \"anioRegistro\": \"\",\n \"anioEmision\": \"\",\n \"numeroEmisionCredencial\": \"\",\n \"claveElector\": \"\",\n \"curp\": \"\",\n \"base64Image\": \"\",\n \"idNumber\": \"\",\n \"fechaEmision\": \"\",\n \"personalNumber\": \"\",\n \"birthDate\": \"\",\n \"gender\": \"\",\n \"birthPlace\": \"\",\n \"address\": \"\",\n \"latitude\": \"\",\n \"longitude\": \"\",\n \"macAddress\": \"\",\n \"ip\": \"\",\n \"osVersion\": \"\",\n \"applicationName\": \"\",\n \"sufix\": \"\",\n \"firstName\": \"\",\n \"givenName\": \"\",\n \"middleName\": \"\",\n \"maternalLastName\": \"\",\n \"paternalLastName\": \"\",\n \"documentType\": \"\",\n \"refNumber\": \"\",\n \"issuerState\": \"\",\n \"documentTypeId\": 0,\n \"issuedAt\": \"\",\n \"documentNumber\": \"\",\n \"expireAt\": \"\",\n \"eyeColor\": \"\",\n \"height\": \"\",\n \"weight\": \"\",\n \"city\": \"\",\n \"postalCode\": \"\",\n \"email\": \"\",\n \"fullName\": \"\",\n \"nationality\": \"\",\n \"dateFormat\": \"\",\n \"fingerprintsData\": \"\",\n \"fingerprintsData.type\": 0,\n \"fingerprintsData.fingerprints\": [],\n \"fingerprintsData.fingerprints.index\": 0,\n \"fingerprintsData.fingerprints.base64Fingerprint\": \"\",\n \"fingerprintsData.fingerprints.fingerprintMetadata\": \"\",\n \"fingerprintsData.fingerprints.fingerprintMetadata.device\": \"\",\n \"fingerprintsData.fingerprints.fingerprintMetadata.resolution\": \"\",\n \"fingerprintsData.fingerprints.fingerprintMetadata.qualityScore\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "valid": true, "statusCode": 0, "registralSituation": { "tipoSituacionRegistral": "string", "tipoReporteRoboExtravio": "string" }, "governmentValidation": { "recognitionConfidence": { "value": "string", "status": "OK" }, "validationStatus": { "value": "string", "status": "OK", "key": "string" }, "ocrValidation": [ { "value": "string", "status": "OK", "key": "string" } ], "ocrValidationOverall": { "value": "string", "status": "OK" }, "overall": { "value": "string", "status": "OK" } }, "curpCecobanValidation": { "returnCode": "string", "description": "string", "uniquePopulationRegistrationKeyMatch": true }, "customFields": { "additionalProp": "string" }, "ocrData": { "name": { "fullName": "string", "fullNameNativeScript": "string", "machineReadableFullName": "string", "firstName": "string", "middleName": "string", "givenName": "string", "givenNameMrz": "string", "nameSuffix": "string", "paternalLastName": "string", "maternalLastName": "string", "lastNameMrz": "string" }, "address": "string", "addressFields": { "street": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string" }, "fullAddress": true, "invalidAddress": true, "checkedAddress": "string", "checkedAddressBean": { "street": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string" }, "exteriorNumber": "string", "interiorNumber": "string", "addressFromStatement": "string", "addressFieldsFromStatement": { "street": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string" }, "invalidAddressFromStatement": true, "addressStatementEmissionDate": 0, "documentType": "a1", "addressStatementTimestamps": [ { "dateType": "string", "addressStatementTimestamp": 0 } ], "poaName": "string", "typeOfId": "string", "documentFrontSubtype": "string", "documentBackSubtype": "string", "birthDate": 0, "gender": "M", "claveDeElector": "string", "curp": "string", "numeroEmisionCredencial": "string", "cic": "string", "ocr": "string", "documentNumber": "string", "documentNumberSource": "FORM", "personalNumber": "string", "nationalNumber": "string", "refNumber": "string", "taxIdNumber": "string", "nue": "string", "externalId": "string", "issuedAt": "string", "expireAt": "string", "expirationDate": 0, "issueDate": 0, "registrationDate": 0, "dlClassDetails": [ { "dlClass": "string", "validFromDate": 0, "validToDate": 0, "additionalCodes": "string" } ], "issuingCountry": "string", "issuingState": "string", "birthPlace": "string", "issuingAuthority": "string", "height": "string", "weight": "string", "eyeColor": "string", "hairColor": "string", "bloodType": "string", "maritalStatus": "string", "nationality": "string", "race": "string", "nationalityMrz": "string", "nationalityAlpha3": "string", "governmentComparisonResults": { "paternalLastNameValid": true, "maternalLastNameValid": true, "firstNameValid": true, "curpValid": true, "ocrValid": true, "claveDeElectorValid": true, "numeroEmisionCredencialValid": true, "registrationDateValid": true, "issueDateValid": true }, "notExtracted": 0, "notExtractedDetails": [ "string" ], "classes": "string", "cond": "string", "mentions": "string", "restrictions": "string", "mrz1": "string", "mrz2": "string", "mrz3": "string", "fullNameMrz": "string", "documentNumberCheckDigit": "string", "dateOfBirthCheckDigit": "string", "expirationDateCheckDigit": "string", "barcodeRawData": "string", "fathersName": "string", "mothersName": "string", "spouseName": "string", "federalRevenueNumber": "string", "originDocumentId": "string", "driversLicenseCategory": "string", "controlNumber": "string", "renach": "string", "additionalAttrs": [ "DOCUMENTO_INFANTIL" ], "ocrDataConfidence": { "birthDateConfidence": 0, "nameConfidence": 0, "nameNativeScriptConfidence": 0, "givenNameConfidence": 0, "firstNameConfidence": 0, "middleNameConfidence": 0, "nameSuffixConfidence": 0, "mothersSurnameConfidence": 0, "fathersSurnameConfidence": 0, "nickNameConfidence": 0, "fullNameMrzConfidence": 0, "mothersNameConfidence": 0, "fathersNameConfidence": 0, "spouseNameConfidence": 0, "addressConfidence": 0, "streetConfidence": 0, "colonyConfidence": 0, "postalCodeConfidence": 0, "cityConfidence": 0, "stateConfidence": 0, "districtConfidence": 0, "stateCodeConfidence": 0, "countryCodeConfidence": 0, "genderConfidence": 0, "issueDateConfidence": 0, "expirationDateConfidence": 0, "issuedAtConfidence": 0, "expireAtConfidence": 0, "issuingAuthorityConfidence": 0, "mrz1Confidence": 0, "mrz2Confidence": 0, "mrz3Confidence": 0, "mrzFullConfidence": 0, "documentNumberConfidence": 0, "backNumberConfidence": 0, "personalNumberConfidence": 0, "nationalNumberConfidence": 0, "claveDeElectorConfidence": 0, "numeroEmisionCredencialConfidence": 0, "curpConfidence": 0, "nueConfidence": 0, "registrationDateConfidence": 0, "heightConfidence": 0, "birthPlaceConfidence": 0, "bloodTypeConfidence": 0, "eyeColorConfidence": 0, "classesConfidence": 0, "condConfidence": 0, "mentionsConfidence": 0, "refNumberConfidence": 0, "weightConfidence": 0, "hairConfidence": 0, "restrictionsConfidence": 0, "nationalityConfidence": 0, "nationalityMrzConfidence": 0, "maritalStatusConfidence": 0, "raceConfidence": 0, "taxIdNumberConfidence": 0, "jurisdictionCodeConfidence": 0 }, "additionalDocumentAttempts": [ { "status": "SUCCESS", "attemptTimestamp": 0, "documentType": "string", "firstName": "string", "lastName": "string", "countryOfOrigin": "string", "dateOfBirth": 0, "expiryDate": 0, "issueDate": 0, "gender": "MALE", "nationality": "string", "placeOfIssue": "string", "referenceNumber": "string", "residentialAddressLines": [ "string" ] }, { "status": "SUCCESS", "attemptTimestamp": 0, "documentType": "string", "fullName": "string", "address": "string", "accountNumber": "string", "bankName": "string", "documentDate": "string" }, { "status": "SUCCESS", "attemptTimestamp": 0, "documentType": "string", "fullName": "string", "curpNumber": "string", "registrationDate": 0, "registrationEntity": "string", "idNumber": "string" }, { "status": "SUCCESS", "attemptTimestamp": 0, "documentType": "string", "fullName": "string", "address": "string", "issueDate": 0 }, { "status": "SUCCESS", "attemptTimestamp": 0, "documentType": "string", "rfcNumber": "string", "corporateName": "string", "fullName": "string", "declarationType": "string", "fiscalYear": 0, "submissionDate": 0, "hasIncomeStatement": true, "hasFinancialPositionStatement": true, "totalIncome": 0, "capitalFromContributions": 0, "capitalFromCapitalization": 0, "accumulatedLosses": 0, "currentYearLosses": 0, "accumulatedProfits": 0, "currentYearProfits": 0, "amountToPay": 0, "amountDue": 0, "operationNumber": "string" }, { "status": "SUCCESS", "attemptTimestamp": 0, "documentType": "string", "issueDate": 0, "rfcNumber": "string", "corporateName": "string", "fullName": "string", "registryStatus": "string", "addressComponents": { "street": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string" }, "economicActivities": [ { "title": "string", "percentage": 0, "startDate": 0, "endDate": 0 } ], "regimes": [ { "title": "string", "startDate": 0, "endDate": 0 } ], "barcodes": [ { "format": "string", "contentType": "string", "text": "string", "error": "string" } ] }, { "status": "SUCCESS", "attemptTimestamp": 0, "documentType": "string", "name": "string", "address": "string", "timestamp": 0, "addressStatementTimestamps": [ { "dateType": "string", "addressStatementTimestamp": 0 } ], "issuer": "a1", "addressComponents": { "street": "string", "colony": "string", "postalCode": "string", "city": "string", "state": "string", "stateName": "string", "district": "string", "stateCode": "string", "addressCountryCode": "string", "label": "string" } }, { "status": "SUCCESS", "attemptTimestamp": 0, "documentType": "string", "firstNames": "string", "lastName": "string", "gender": "MALE", "countryOfBirth": "string", "dateOfBirth": 0, "nationality": "string", "maritalStatus": "string", "issueDate": 0, "expiryDate": 0, "idNumber": "string" }, { "status": "SUCCESS", "attemptTimestamp": 0, "documentType": "string", "fullName": "string", "gender": "MALE", "dateOfBirth": 0, "issueDate": 0, "countryOfBirth": "string", "nationality": "string", "maritalStatus": "string", "documentNumber": "string" }, { "status": "SUCCESS", "attemptTimestamp": 0, "documentType": "string", "fullName": "string", "rfcNumber": "string", "idCIF": "string" }, { "status": "SUCCESS", "attemptTimestamp": 0, "documentType": "string" }, { "status": "SUCCESS", "attemptTimestamp": 0, "documentType": "string", "fullName": "string", "address": "string", "addressList": [ "string" ], "registrationNumber": "string", "v5cNumber": "string", "referenceNumber": "string" } ] }, "deviceInfo": { "ipAddress": "string", "hash": "string", "deviceType": "IOS", "osVersion": "string", "deviceModel": "string", "sdkVersion": "string", "browser": "string", "hasLiedBrowser": true, "longitude": 0, "latitude": 0, "location": "string", "getmAdminArea": "CA", "getmSubAdminArea": "Santa Clara", "getmLocality": "string", "getmSubLocality": "Mission District", "getmThoroughfare": "string", "getmSubThoroughfare": "string", "getmPostalCode": 95014, "getmCountryCode": "US", "getmCountryName": "United States", "hostingApp": "Onboarding" }, "ineTransactionId": "string", "errorDescription": "string", "fallbackCalled": true, "otpResponse": { "authBridge": { "otpCodeRequested": true, "mobile": "string", "status": "string" } } } ``` --- - Path: `api-reference/process-id` - URL: https://developer.incode.com/api-reference/process-id/ - Markdown: https://developer.incode.com/api-reference/process-id.md - Endpoint: `POST /omni/process/id` # Process Id `POST /omni/process/id` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment **Note**:This endpoint should be called only after the [front-side](#/Onboarding/addFrontIdV2) and [back-side](#/Onboarding/addBackIdV2) is over. And in case of passports or only front sided documents, only [front-side](#/Onboarding/addFrontIdV2) should be over. Incode validations and ocr parsing are processed during this endpoint. To fetch ocr data call [Fetch-OCR](#/Onboarding/getOcrData). Once this is called, user is no longer able to upload ID (front or back side). ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `queueName` | query | string | | The name of the queue, user is entering in case conference call will be used. If not set, default queue will be used Enum: `aristotle`, `buddha`, `confucius`, `diogenes` | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `isDocumentExpired` | boolean | | Flag indicating if the document is expired. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/process/id \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/process/id", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/process/id", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/process/id")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "isDocumentExpired": true } ``` --- - Path: `api-reference/process-imss` - URL: https://developer.incode.com/api-reference/process-imss/ - Markdown: https://developer.incode.com/api-reference/process-imss.md - Endpoint: `POST /omni/process/imss` # Process IMSS `POST /omni/process/imss` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Trigger fetching of work history for curp. This will notify the results to the configured [Work History Webhook](/general-reference/work-history-webhook/). ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `curp` | string | | If not specified it will use one from interview | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/process/imss \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "curp": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/process/imss", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "curp": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/process/imss", headers=headers, json={ "curp": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/process/imss")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"curp\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/process-payment-proof` - URL: https://developer.incode.com/api-reference/process-payment-proof/ - Markdown: https://developer.incode.com/api-reference/process-payment-proof.md - Endpoint: `POST /omni/process/payment-proof` # Process payment proof `POST /omni/process/payment-proof` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment **Note**: This endpoint should be called once the Qr-code is executed. It will fetch info from add qr code text call and validate payment proof fields rfc issuer, rfc receiver and fiscal invoice and return response. It will also call the configured [Payment Proof Webhook](/general-reference/payment-proof-webhook/). ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `requestId` | string | | Id associated with request | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/process/payment-proof \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/process/payment-proof", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/process/payment-proof", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/process/payment-proof")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "requestId": "string" } ``` --- - Path: `api-reference/process-second-id` - URL: https://developer.incode.com/api-reference/process-second-id/ - Markdown: https://developer.incode.com/api-reference/process-second-id.md - Endpoint: `POST /omni/process/second-id` # Process Second Id `POST /omni/process/second-id` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment **Note**: This endpoint should be called only after the upload of [front-side-secondId](#/Onboarding/addFrontSecondIdV2) and [back-side-secondId](#/Onboarding/addBackSecondIdV2) is over. And in case of passports or only front sided documents, only [front-side-secondId](#/Onboarding/addFrontSecondIdV2) should be over. Incode validations and ocr parsing are processed during this endpoint. To fetch ocr data call [Fetch-SecondId_OCR](#/Onboarding/getOcrDataSecondId). Parameter queueName is needed so it can be determined in which queue interview should go. Once this is called, user is no longer able to upload ID (front or back side). ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `queueName` | query | string | | Enum: `aristotle`, `buddha`, `confucius`, `diogenes` | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `isDocumentExpired` | boolean | | Flag indicating if the document is expired. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/process/second-id \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/process/second-id", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/process/second-id", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/process/second-id")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "isDocumentExpired": true } ``` --- - Path: `api-reference/process-watchlist` - URL: https://developer.incode.com/api-reference/process-watchlist/ - Markdown: https://developer.incode.com/api-reference/process-watchlist.md - Endpoint: `POST /omni/process/watchlist` # Process custom watchlist `POST /omni/process/watchlist` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint fetches data (photo, email, phone, document number) from onboarding session and tries to find a match in custom watchlist database. If a match on the watchlist is found, then the score influence is calculated based on the number of matched fields. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Id of onboarding session. If not present, it will be extracted from token. | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `match` | boolean | | Flag indicating if a match in the watchlist has been found. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/process/watchlist \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/process/watchlist", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/process/watchlist", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/process/watchlist")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "match": true } ``` --- - Path: `api-reference/qr-refresh` - URL: https://developer.incode.com/api-reference/qr-refresh/ - Markdown: https://developer.incode.com/api-reference/qr-refresh.md - Endpoint: `POST /omni/qr/refresh` # Refresh QR code value `POST /omni/qr/refresh` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Refresh UUID for already started onboarding with /omni/onboarding-url. Returns null if not started before this call or if start expired. Returned UUID is short lived (15sec) and should be refreshed in constant periods (5sec). ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `onboardingId` | string | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `urlUuid` | string | | Short-lived uuid for validation | ### 400 Custom error statuses: - 4026: Invalid uuid parameter Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/qr/refresh \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "onboardingId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/qr/refresh", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "onboardingId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/qr/refresh", headers=headers, json={ "onboardingId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/qr/refresh")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"onboardingId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "urlUuid": "string" } ``` --- - Path: `api-reference/qr-validate` - URL: https://developer.incode.com/api-reference/qr-validate/ - Markdown: https://developer.incode.com/api-reference/qr-validate.md - Endpoint: `POST /omni/qr/validate` # Validate QR code uuid `POST /omni/qr/validate` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Check if provided UUID value is still valid for Interview ID. If valid, response will contain UUID that is stored on Onboarding cache and have default TTL of 15min If not valid, response will contain error details ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `urlUuid` | string | | | | `onboardingId` | string | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `urlUuid` | string | | Short-lived uuid for validation | ### 400 Custom error statuses: - 4026: Invalid uuid parameter - 4081: Invalid parameters for validation Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/qr/validate \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "urlUuid": "", "onboardingId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/qr/validate", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "urlUuid": "", "onboardingId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/qr/validate", headers=headers, json={ "urlUuid": "", "onboardingId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/qr/validate")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"urlUuid\": \"\",\n \"onboardingId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "urlUuid": "string" } ``` --- - Path: `api-reference/queue-conference-add` - URL: https://developer.incode.com/api-reference/queue-conference-add/ - Markdown: https://developer.incode.com/api-reference/queue-conference-add.md - Endpoint: `PUT /omni/queue/conference/add` # Add user to queue `PUT /omni/queue/conference/add` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment When data collection is over, users can be added to the queue for joining conference calls with an executive. The average time for before user joins to conference is given in response. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `queueName` | query | string | | The name of the queue, user is entering in case a conference call will be used. If not set, default queue will be used. Possible values: aristotle, buddha, confucius, diogenes. Same value for queueName needs to be used across all requests in one onboarding session. | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewCode` | string | | Interview code received in response of [start](#/Onboarding/startInterview) call. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | | `waitingTimeInSeconds` | integer (int64) | | Average waiting time before user joins conference call. | ### 400 Custom error status: - 4014: Invalid interview code Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X PUT https://demo-api.incodesmile.com/omni/queue/conference/add \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "interviewCode": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/queue/conference/add", { method: "PUT", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "interviewCode": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.put("https://demo-api.incodesmile.com/omni/queue/conference/add", headers=headers, json={ "interviewCode": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/queue/conference/add")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("PUT", HttpRequest.BodyPublishers.ofString("{\n \"interviewCode\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive", "waitingTimeInSeconds": 203 } ``` --- - Path: `api-reference/queue-conference-connection-details` - URL: https://developer.incode.com/api-reference/queue-conference-connection-details/ - Markdown: https://developer.incode.com/api-reference/queue-conference-connection-details.md - Endpoint: `GET /omni/queue/conference/connection-details` # Get connection details `GET /omni/queue/conference/connection-details` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment An executive can invite the user to join a conference if the connection is lost by sending uuid ID to user. Using this uuid connection details for that session can be fetched. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `uuid` | query | string | yes | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `accessToken` | string | | Access token which needs to be forwarded in header X-Incode-Hardware-Id for future calls. Same purpose as token from [start](#/Onboarding/startInterview) | | `interviewerName` | string | | The name of the executive who is on conference call with the user. | | `sessionId` | string | | Used for establishing conference connection via OpenTok. | | `interviewToken` | string | | Used for establishing conference connection via OpenTok. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/queue/conference/connection-details \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/queue/conference/connection-details", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/queue/conference/connection-details", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/queue/conference/connection-details")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "accessToken": "string", "interviewerName": "string", "sessionId": "string", "interviewToken": "string" } ``` --- - Path: `api-reference/queue-conference-disconnect` - URL: https://developer.incode.com/api-reference/queue-conference-disconnect/ - Markdown: https://developer.incode.com/api-reference/queue-conference-disconnect.md - Endpoint: `POST /omni/queue/conference/disconnect` # Disconnect user from the queue `POST /omni/queue/conference/disconnect` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Users can disconnect themselves while waiting in the queue at any time. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 success: flag indicating if user was successfully removed from the queue. False in the case the user not found in the queue, true otherwise Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/queue/conference/disconnect \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/queue/conference/disconnect", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/queue/conference/disconnect", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/queue/conference/disconnect")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/queue-conference-index` - URL: https://developer.incode.com/api-reference/queue-conference-index/ - Markdown: https://developer.incode.com/api-reference/queue-conference-index.md - Endpoint: `GET /omni/queue/conference/index` # Get user's position in queue `GET /omni/queue/conference/index` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Use this endpoint to check user's position in waiting queue. Once the index in the response is 0, users can connect to the conference call. Use endpoint Get position in queue. Once the index becomes 0, the customer can connect to the interview. Call [Connect](#/Conference/getInterviewerInfo) to fetch connection data. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `queueName` | query | string | | The name of the queue the user is entering in case a conference call will be used. If not set, the default queue will be used. Possible values: aristotle, buddha, confucius, diogenes. Same value for queueName needs to be used across all requests in one onboarding session. | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `index` | integer (int32) | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/queue/conference/index \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/queue/conference/index", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/queue/conference/index", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/queue/conference/index")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "index": 0 } ``` --- - Path: `api-reference/queue-conference-next` - URL: https://developer.incode.com/api-reference/queue-conference-next/ - Markdown: https://developer.incode.com/api-reference/queue-conference-next.md - Endpoint: `GET /omni/queue/conference/next` # Get next customer from the queue `GET /omni/queue/conference/next` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Fetch next customer from a conference queue. In case no customer in the queue, and empty body is returned. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `queueName` | query | string | | The name of the queue the user is entering in the case the conference call will be used. If not set, the default queue will be used. Same value for queueName needs to be used across all requests in one onboarding session. | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewId` | string | | ID of fetched interview. | | `apiKey` | integer (int32) | | OpenTok apiKey used for connection to video call. | | `interviewToken` | string | | OpenTok token used for connection to video call. | | `sessionId` | string | | OpenTok session id used for connection to video call. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/queue/conference/next \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/queue/conference/next", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/queue/conference/next", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/queue/conference/next")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "interviewId": "string", "apiKey": 0, "interviewToken": "string", "sessionId": "string" } ``` --- - Path: `api-reference/record-start` - URL: https://developer.incode.com/api-reference/record-start/ - Markdown: https://developer.incode.com/api-reference/record-start.md - Endpoint: `POST /omni/record-start` # Start recording `POST /omni/record-start` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Start recording of the interview. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewId` | string | | ID of interview for which recording is started. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `opentokArchiveId` | string | | ID of created OpenTok archive. | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/record-start \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "interviewId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/record-start", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "interviewId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/record-start", headers=headers, json={ "interviewId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/record-start")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"interviewId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "opentokArchiveId": "string" } ``` --- - Path: `api-reference/record-stop` - URL: https://developer.incode.com/api-reference/record-stop/ - Markdown: https://developer.incode.com/api-reference/record-stop.md - Endpoint: `POST /omni/record-stop` # Stop recording `POST /omni/record-stop` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Stop recording the interview. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `opentokArchiveId` | string | | ID of OpenTok archive for which recording stop is requested. In case omitted, last created archive on given interview will be stopped. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/record-stop \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "opentokArchiveId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/record-stop", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "opentokArchiveId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/record-stop", headers=headers, json={ "opentokArchiveId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/record-stop")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"opentokArchiveId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/recordings-import` - URL: https://developer.incode.com/api-reference/recordings-import/ - Markdown: https://developer.incode.com/api-reference/recordings-import.md - Endpoint: `POST /omni/recordings/import` # Import base64Video and return recordingId `POST /omni/recordings/import` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `video` | string | yes | Video of capture attempt, represented in base64. | | `type` | string | | Type of recording that should be stored. Possible values: selfie, frontId, backId. Enum: `frontId`, `backId`, `merged`, `selfie`, `authenticationattempt` | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `recordingId` | string | | | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/recordings/import \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "video": "", "type": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/recordings/import", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "video": "", "type": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/recordings/import", headers=headers, json={ "video": "", "type": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/recordings/import")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"video\": \"\",\n \"type\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "recordingId": "string" } ``` --- - Path: `api-reference/recordings-import-third-party` - URL: https://developer.incode.com/api-reference/recordings-import-third-party/ - Markdown: https://developer.incode.com/api-reference/recordings-import-third-party.md - Endpoint: `POST /omni/recordings/import/third-party` # Import base64Video and return recordingId `POST /omni/recordings/import/third-party` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `video` | string | yes | Video of capture attempt, represented in base64. | | `type` | string | | Type of recording that should be stored. Possible values: selfie, frontId, backId. Enum: `frontId`, `backId`, `merged`, `selfie`, `authenticationattempt` | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `recordingId` | string | | | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/recordings/import/third-party \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "video": "", "type": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/recordings/import/third-party", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "video": "", "type": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/recordings/import/third-party", headers=headers, json={ "video": "", "type": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/recordings/import/third-party")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"video\": \"\",\n \"type\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "recordingId": "string" } ``` --- - Path: `api-reference/send-otp` - URL: https://developer.incode.com/api-reference/send-otp/ - Markdown: https://developer.incode.com/api-reference/send-otp.md - Endpoint: `GET /omni/send/otp` # Send SMS with One Time Password for onboarding `GET /omni/send/otp` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Send SMS with an OTP (One Time Password) code to validate an onboarding. Phone number is obtained from interview data, so phone step it's required. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `communicationchannel` | query | string | | Enum: `SMS`, `EMAIL` | | `api-version` | header | string | yes | | ## Responses ### 200 OTP sent successfully Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Contact Already Verified - The phone/email is already verified for this session Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ```json { "timestamp": 1234567890, "status": 4300, "error": "Contact Already Verified", "message": "OtpException: Session has verified contact", "path": "/omni/send/sms-otp" } ``` ### 429 Too Many Requests - Cooldown period not completed Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/send/otp \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/send/otp", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/send/otp", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/send/otp")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/send-sms-otp` - URL: https://developer.incode.com/api-reference/send-sms-otp/ - Markdown: https://developer.incode.com/api-reference/send-sms-otp.md - Endpoint: `GET /omni/send/sms-otp` # Send SMS with One Time Password for onboarding `GET /omni/send/sms-otp` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Send SMS with an OTP (One Time Password) code to validate an onboarding. Phone number is obtained from interview data, so phone step it's required. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 OTP sent successfully Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Contact Already Verified - The phone/email is already verified for this session Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ### 429 Too Many Requests - Cooldown period not completed Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/send/sms-otp \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/send/sms-otp", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/send/sms-otp", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/send/sms-otp")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/session-continue` - URL: https://developer.incode.com/api-reference/session-continue/ - Markdown: https://developer.incode.com/api-reference/session-continue.md - Endpoint: `POST /omni/session/continue` # Continue onboarding session `POST /omni/session/continue` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Issues a new token for an ACTIVE existing onboarding session, for example when a user starts onboarding on desktop and continues on mobile. The session is located by exactly one of: its onboarding-link uuid, its interviewId, or its externalId (the value supplied as externalId on /omni/start; deprecated, temporary available - will be removed soon). Providing zero or more than one identifier is rejected with 400. With useUuidOnlyOnce enabled the uuid is consumed by this call and can not be reused. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `uuid` | string | | Onboarding-link uuid identifying the session to continue. Exactly one of uuid, interviewId or externalId must be provided. With useUuidOnlyOnce enabled the uuid is consumed by this call and can not be reused. | | `interviewId` | string | | InterviewId of the session to continue. Exactly one of uuid, interviewId or externalId must be provided. | | `externalId` | string | | Id that identifies the user in the client's system; matches the externalId supplied on /omni/start. Exactly one of uuid, interviewId or externalId must be provided. (Deprecated, temporary - will be removed soon; use interviewId or uuid instead.) | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewId` | string | | Identifies the onboarding session that is continued. Can be used for fetching data about that session in future calls. | | `token` | string | | Internal JWT token used for the future subsequent calls. It is the value for X-Incode-Hardware-Id header in all other calls. | | `interviewCode` | string | | This value is used for connecting to conference call. | | `flowType` | string | | Type of the flow used. Could be flow (in most cases), or legacy type configuration (not used anymore). Enum: `configuration`, `flow`, `workflow` | | `idCaptureTimeout` | integer (int32) | | Number of seconds after which manual capture button should be shown to the user, while capturing ID when ID is detected. | | `idDetectionTimeout` | integer (int32) | | Number of seconds after which manual capture button should be shown to the user, if ID is not detected. | | `selfieCaptureTimeout` | integer (int32) | | Number of seconds after which manual capture button should be shown to the user, while capturing selfie. | | `idCaptureRetries` | integer (int32) | | Number of ID captures after which user should be taken to next screen. | | `selfieCaptureRetries` | integer (int32) | | Number of selfie captures after which user should be taken to next screen. | | `curpValidationRetries` | integer (int32) | | Number of curp validations after which user should be taken to next screen. (only for Mexico) | ### 400 Custom error statuses: - 4026: Invalid uuid parameter (unknown or expired) - 4081: Invalid parameters for validation - 4086: Current session continuation period is expired. - 4087: Max number of session continuations reached - 4088: Session is not active - 4089: Zero or more than one of uuid / interviewId / externalId provided Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ### 404 Session not found for the given interviewId or externalId within the api key's organization Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewId` | string | | Identifies the onboarding session that is continued. Can be used for fetching data about that session in future calls. | | `token` | string | | Internal JWT token used for the future subsequent calls. It is the value for X-Incode-Hardware-Id header in all other calls. | | `interviewCode` | string | | This value is used for connecting to conference call. | | `flowType` | string | | Type of the flow used. Could be flow (in most cases), or legacy type configuration (not used anymore). Enum: `configuration`, `flow`, `workflow` | | `idCaptureTimeout` | integer (int32) | | Number of seconds after which manual capture button should be shown to the user, while capturing ID when ID is detected. | | `idDetectionTimeout` | integer (int32) | | Number of seconds after which manual capture button should be shown to the user, if ID is not detected. | | `selfieCaptureTimeout` | integer (int32) | | Number of seconds after which manual capture button should be shown to the user, while capturing selfie. | | `idCaptureRetries` | integer (int32) | | Number of ID captures after which user should be taken to next screen. | | `selfieCaptureRetries` | integer (int32) | | Number of selfie captures after which user should be taken to next screen. | | `curpValidationRetries` | integer (int32) | | Number of curp validations after which user should be taken to next screen. (only for Mexico) | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/session/continue \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "uuid": "", "interviewId": "", "externalId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/session/continue", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "uuid": "", "interviewId": "", "externalId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/session/continue", headers=headers, json={ "uuid": "", "interviewId": "", "externalId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/session/continue")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"uuid\": \"\",\n \"interviewId\": \"\",\n \"externalId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "interviewId": "string", "token": "string", "interviewCode": "string", "flowType": "configuration", "idCaptureTimeout": 0, "idDetectionTimeout": 0, "selfieCaptureTimeout": 0, "idCaptureRetries": 0, "selfieCaptureRetries": 0, "curpValidationRetries": 0 } ``` --- - Path: `api-reference/session-downloadpdf-v2` - URL: https://developer.incode.com/api-reference/session-downloadpdf-v2/ - Markdown: https://developer.incode.com/api-reference/session-downloadpdf-v2.md - Endpoint: `POST /omni/session/downloadpdf/v2` # Generates single session PDF report `POST /omni/session/downloadpdf/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used to generate a PDF report for a single session ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | yes | | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `reason` | string | | | ## Responses ### 200 OK ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/session/downloadpdf/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "reason": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/session/downloadpdf/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "reason": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/session/downloadpdf/v2", headers=headers, json={ "reason": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/session/downloadpdf/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"reason\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/session-events-publish` - URL: https://developer.incode.com/api-reference/session-events-publish/ - Markdown: https://developer.incode.com/api-reference/session-events-publish.md - Endpoint: `POST /omni/session-events/publish` # Publish session events to Kafka for a batch of interview IDs `POST /omni/session-events/publish` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Accepts a list of interview IDs and publishes corresponding session events to Kafka. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewIds` | array[string] | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `successIds` | array[string] | | | | `failures` | array[FailureItem] | | | | `failures.interviewId` | string | | | | `failures.errorMessage` | string | | | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/session-events/publish \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "interviewIds": [] }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/session-events/publish", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "interviewIds": [] }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/session-events/publish", headers=headers, json={ "interviewIds": [] }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/session-events/publish")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"interviewIds\": []\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "successIds": [ "string" ], "failures": [ { "interviewId": "string", "errorMessage": "string" } ] } ``` --- - Path: `api-reference/session-externalid` - URL: https://developer.incode.com/api-reference/session-externalid/ - Markdown: https://developer.incode.com/api-reference/session-externalid.md - Endpoint: `DELETE /omni/session/externalId` # Delete PII data for single onboarding session by external ID. `DELETE /omni/session/externalId` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment > **Deprecated** — this endpoint is marked deprecated in the Omni API specification. Delete single onboarding session using the external ID as identifier. Note: Works with Admin Token.Please, bear in mind that usage of this API endpoint for deletion of Customer Data will mean that Incode will no longer have access to it nor will be able to review or analyze any issue related to deleted Customer Data. After deletion, as Incode will not be able to retrieve the deleted Customer Data, any potential claims related to such data will be waived by Customer. Finally, for clarity purposes, Incode may continue to process information derived from Customer Data that has been deidentified, anonymized, and/or aggregated such that the data is no longer considered Personal Data under applicable Data Protection Laws and in a manner that does not identify individuals or Customer to improve its services and defend its legitimate interests. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `externalId` | query | string | yes | Specify which external-id. | | `keepCustomer` | query | boolean | | True or false. Indicates whether to keep idenity of the customer or not. Default is false(which means session and customer identity both will be deleted). | | `sendNotification` | query | boolean | | Flag to send a notification about a change interview status | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X DELETE https://demo-api.incodesmile.com/omni/session/externalId \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/session/externalId", { method: "DELETE", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.delete("https://demo-api.incodesmile.com/omni/session/externalId", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/session/externalId")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("DELETE", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/session-status-get` - URL: https://developer.incode.com/api-reference/session-status-get/ - Markdown: https://developer.incode.com/api-reference/session-status-get.md - Endpoint: `GET /omni/session/status/get` # Get session status `GET /omni/session/status/get` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Get the status of current session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `get_id` | string | | Session id. | | `get_createdAt` | integer (int64) | | Timestamp, when was the session created | | `get_updatedAt` | integer (int64) | | Timestamp, when was the session last updated. | | `closedAt` | integer (int64) | | Timestamp, when was the session last closed. | | `frontIdAttempts` | integer (int32) | | Attempts to save front id. | | `backIdAttempts` | integer (int32) | | Attempts to save back id. | | `selfieAttempts` | integer (int32) | | Attempts to save selfie. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/session/status/get \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/session/status/get", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/session/status/get", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/session/status/get")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "get_id": "string", "get_createdAt": 0, "get_updatedAt": 0, "closedAt": 0, "frontIdAttempts": 0, "backIdAttempts": 0, "selfieAttempts": 0, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/session-status-set` - URL: https://developer.incode.com/api-reference/session-status-set/ - Markdown: https://developer.incode.com/api-reference/session-status-set.md - Endpoint: `POST /omni/session/status/set` # Set session status `POST /omni/session/status/set` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Set the status of current session. Possible actions to set the status to are: Alive, Closed or Deleted. Closed status disables all of the "/add/..." calls so they can no longer make any changes to the system. Deleted status deletes the important data stored in the session. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `action` | query | string | yes | Enum: `Alive`, `Closed`, `Deleted` | | `id` | query | string | | id of the session, optional, if not sent obtained from token. | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `get_id` | string | | Session id. | | `get_createdAt` | integer (int64) | | Timestamp, when was the session created | | `get_updatedAt` | integer (int64) | | Timestamp, when was the session last updated. | | `closedAt` | integer (int64) | | Timestamp, when was the session last closed. | | `frontIdAttempts` | integer (int32) | | Attempts to save front id. | | `backIdAttempts` | integer (int32) | | Attempts to save back id. | | `selfieAttempts` | integer (int32) | | Attempts to save selfie. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/session/status/set \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/session/status/set", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/session/status/set", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/session/status/set")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "get_id": "string", "get_createdAt": 0, "get_updatedAt": 0, "closedAt": 0, "frontIdAttempts": 0, "backIdAttempts": 0, "selfieAttempts": 0, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/sign-combined-consent` - URL: https://developer.incode.com/api-reference/sign-combined-consent/ - Markdown: https://developer.incode.com/api-reference/sign-combined-consent.md - Endpoint: `POST /omni/sign-combined-consent` # Sign combined consents with checkboxes. `POST /omni/sign-combined-consent` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Receives information about which checkboxes user signed. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `languageConsentId` | string | | | | `checkboxes` | object | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/sign-combined-consent \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "languageConsentId": "", "checkboxes": {} }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/sign-combined-consent", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "languageConsentId": "", "checkboxes": {} }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/sign-combined-consent", headers=headers, json={ "languageConsentId": "", "checkboxes": {} }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/sign-combined-consent")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"languageConsentId\": \"\",\n \"checkboxes\": {}\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/sign-document-nom151` - URL: https://developer.incode.com/api-reference/sign-document-nom151/ - Markdown: https://developer.incode.com/api-reference/sign-document-nom151.md - Endpoint: `POST /omni/sign-document/nom151` # Sign document with NOM 151 `POST /omni/sign-document/nom151` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Sign any base64-encoded document with NOM 151. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `documentToSign` | string | | Base64-encoded document to be signed with NOM151 | ## Responses ### 200 Response: - signedString: String. NOM 151 constancia (digital evidence) - reference: String. Reference folio (unique confirmation id) ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/sign-document/nom151 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "documentToSign": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/sign-document/nom151", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "documentToSign": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/sign-document/nom151", headers=headers, json={ "documentToSign": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/sign-document/nom151")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"documentToSign\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/sign-hash-nom151` - URL: https://developer.incode.com/api-reference/sign-hash-nom151/ - Markdown: https://developer.incode.com/api-reference/sign-hash-nom151.md - Endpoint: `POST /omni/sign-hash/nom151` # Sign hash with NOM 151 `POST /omni/sign-hash/nom151` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Sign any SHA-256 hash (64-hex) with NOM 151. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `hashToSign` | string | | Hash to be signed with NOM151 | ## Responses ### 200 Response: - signedString: String. NOM 151 constancia (digital evidence) - reference: String. Reference folio (unique confirmation id) ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/sign-hash/nom151 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "hashToSign": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/sign-hash/nom151", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "hashToSign": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/sign-hash/nom151", headers=headers, json={ "hashToSign": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/sign-hash/nom151")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"hashToSign\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/sign-string-nom151` - URL: https://developer.incode.com/api-reference/sign-string-nom151/ - Markdown: https://developer.incode.com/api-reference/sign-string-nom151.md - Endpoint: `POST /omni/sign-string/nom151` # Sign String with NOM 151 `POST /omni/sign-string/nom151` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Sign any String with NOM 151. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `stringToSign` | string | | String to be signed with NOM151 | ## Responses ### 200 Response: - signedString: String. NOM 151 constancia (digital evidence) - reference: String. Reference folio (unique confirmation id) ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/sign-string/nom151 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "stringToSign": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/sign-string/nom151", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "stringToSign": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/sign-string/nom151", headers=headers, json={ "stringToSign": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/sign-string/nom151")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"stringToSign\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/start` - URL: https://developer.incode.com/api-reference/start/ - Markdown: https://developer.incode.com/api-reference/start.md - Endpoint: `POST /omni/start` # Start onboarding `POST /omni/start` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is mandatory to start any onboarding session in Incode Omni and session can be monitored on the Incode Dashboard. And it generates token which should be used for the authentication of future subsequent calls. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `language` | string | | Language code to be used when doing speech to text. Possible values: en-US, es-ES, pt-BR. | | `externalId` | string | | Id that identifies user in clients system should be used for externalId. (Deprecated, use externalCustomerId instead) | | `externalCustomerId` | string | | Id that identifies user in clients external system. | | `uuid` | string | | uuid key used in redis, can be used as an alternative to sending interviewId. | | `configurationId` | string | | Id of the flow to be used for this onboarding. | | `redirectionUrl` | string | | Url the user will be redirected to after finishing the onboarding successfully. | | `integrationReference` | string | | Optional integration reference. | | `urlUuid` | string | | Url uuid key used in redis. Will be validated in start if qrPhishingResistance is ON. | | `customFields` | object | | Used to send any additional information in key value pair format. Max fields: {maxEntries}, max key length: {keyMaxLength}, max value length: {valueMaxLength} | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `interviewId` | string | | Identifies the onboarding session that is initialized. Can be used for fetching data about that session in future calls. | | `token` | string | | Internal JWT token used for the future subsequent calls. It is the value for X-Incode-Hardware-Id header in all other calls. | | `interviewCode` | string | | This value is used for connecting to conference call. | | `flowType` | string | | (only if configurationId is sent in request). Type of the flow used. Could be flow (in most cases), or legacy type configuration (not used anymore). Enum: `configuration`, `flow`, `workflow` | | `idCaptureTimeout` | integer (int32) | | Number of seconds after which manual capture button should be shown to the user, while capturing ID when ID is detected. | | `idDetectionTimeout` | integer (int32) | | Number of seconds after which manual capture button should be shown to the user, if ID is not detected. | | `selfieCaptureTimeout` | integer (int32) | | Number of seconds after which manual capture button should be shown to the user, while capturing selfie. | | `idCaptureRetries` | integer (int32) | | Number of ID captures after which user should be taken to next screen. | | `selfieCaptureRetries` | integer (int32) | | Number of selfie captures after which user should be taken to next screen. | | `curpValidationRetries` | integer (int32) | | Number of curp validations after which user should be taken to next screen. (only for Mexico) | | `clientId` | string | | Customer specific clientId that corresponds to api key. | | `env` | string | | Server environment. Could be one of: stage, demo, saas. | | `existingSession` | boolean | | It's true if interviewId corresponds to an existing Onboarding Session. | ### 400 Custom error statuses: - 4026: Invalid uuid parameter - 4027: Invalid configurationId - 4028: Flow is not activated - 4081: Invalid parameters for validation - 4082: Start endpoint version forbidden in flow/workflow Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/start \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "language": "", "externalId": "", "externalCustomerId": "", "uuid": "", "configurationId": "", "redirectionUrl": "", "integrationReference": "", "urlUuid": "", "customFields": {} }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/start", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "language": "", "externalId": "", "externalCustomerId": "", "uuid": "", "configurationId": "", "redirectionUrl": "", "integrationReference": "", "urlUuid": "", "customFields": {} }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/start", headers=headers, json={ "language": "", "externalId": "", "externalCustomerId": "", "uuid": "", "configurationId": "", "redirectionUrl": "", "integrationReference": "", "urlUuid": "", "customFields": {} }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/start")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"language\": \"\",\n \"externalId\": \"\",\n \"externalCustomerId\": \"\",\n \"uuid\": \"\",\n \"configurationId\": \"\",\n \"redirectionUrl\": \"\",\n \"integrationReference\": \"\",\n \"urlUuid\": \"\",\n \"customFields\": {}\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "interviewId": "string", "token": "string", "interviewCode": "string", "flowType": "configuration", "idCaptureTimeout": 0, "idDetectionTimeout": 0, "selfieCaptureTimeout": 0, "idCaptureRetries": 0, "selfieCaptureRetries": 0, "curpValidationRetries": 0, "clientId": "string", "env": "string", "existingSession": true } ``` --- - Path: `api-reference/stateless-authentications-provide-reference-selfie` - URL: https://developer.incode.com/api-reference/stateless-authentications-provide-reference-selfie/ - Markdown: https://developer.incode.com/api-reference/stateless-authentications-provide-reference-selfie.md - Endpoint: `POST /omni/stateless-authentications/provide/reference-selfie` # Provide selfie for stateless authentication `POST /omni/stateless-authentications/provide/reference-selfie` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment A method to provide a reference selfie for stateless authentication. (A selfie of the original onboarding that was approved but later removed from Incode storage). This selfie will be used in authentication process if it's configured to be stateless. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | | Image of user's face represented in base64. | | `customerId` | string | | Customer Id. | | `sessionId` | string | | Session Id. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Operation result. | | `candidate` | string | | Id of the candidate for reference selfie. | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/stateless-authentications/provide/reference-selfie \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "customerId": "", "sessionId": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/stateless-authentications/provide/reference-selfie", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "customerId": "", "sessionId": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/stateless-authentications/provide/reference-selfie", headers=headers, json={ "base64Image": "", "customerId": "", "sessionId": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/stateless-authentications/provide/reference-selfie")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"customerId\": \"\",\n \"sessionId\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "candidate": "string" } ``` --- - Path: `api-reference/update` - URL: https://developer.incode.com/api-reference/update/ - Markdown: https://developer.incode.com/api-reference/update.md - Endpoint: `PUT /omni/update` # Update interview `PUT /omni/update` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment If upload of front, back side of id or selfie, was not successful after retries, use this endpoint to specify that additional manual check is needed. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `id` | query | string | | Id of onboarding for which data will be updated. If not present, it will be extracted from token. | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `name` | string | | Name of the person obtained from ocr can be updated here. | | `birthDate` | string | | Birth date of the person obtained from ocr can be updated here. | | `address` | string | | Address of the person obtained from ocr can be updated here. | | `gender` | string | | Gender of the person obtained from ocr can be updated here. | | `manualIdCheckNeeded` | boolean | | If set to true, indicates that manual check is needed for validating id. | | `manualSelfieCheckNeeded` | boolean | | If set to true, indicates that manual check is needed for validating selfie image. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X PUT https://demo-api.incodesmile.com/omni/update \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "name": "", "birthDate": "", "address": "", "gender": "", "manualIdCheckNeeded": false, "manualSelfieCheckNeeded": false }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/update", { method: "PUT", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "name": "", "birthDate": "", "address": "", "gender": "", "manualIdCheckNeeded": false, "manualSelfieCheckNeeded": false }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.put("https://demo-api.incodesmile.com/omni/update", headers=headers, json={ "name": "", "birthDate": "", "address": "", "gender": "", "manualIdCheckNeeded": False, "manualSelfieCheckNeeded": False }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/update")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("PUT", HttpRequest.BodyPublishers.ofString("{\n \"name\": \"\",\n \"birthDate\": \"\",\n \"address\": \"\",\n \"gender\": \"\",\n \"manualIdCheckNeeded\": false,\n \"manualSelfieCheckNeeded\": false\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/update-editable-ocr-data` - URL: https://developer.incode.com/api-reference/update-editable-ocr-data/ - Markdown: https://developer.incode.com/api-reference/update-editable-ocr-data.md - Endpoint: `PUT /omni/update/editable-ocr-data` # Update editable OCR data in interview `PUT /omni/update/editable-ocr-data` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Update some of the crucial interview OCR data if needed. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `address` | string | | | | `documentNumber` | string | | | | `name` | string | | | | `firstName` | string | | | | `lastName` | string | | | | `paternalLastName` | string | | | | `maternalLastName` | string | | | | `personalNumber` | string | | | | `curp` | string | | | | `email` | string | | | | `birthDate` | string | | | | `expireAt` | string | | | | `gender` | string | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X PUT https://demo-api.incodesmile.com/omni/update/editable-ocr-data \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "address": "", "documentNumber": "", "name": "", "firstName": "", "lastName": "", "paternalLastName": "", "maternalLastName": "", "personalNumber": "", "curp": "", "email": "", "birthDate": "", "expireAt": "", "gender": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/update/editable-ocr-data", { method: "PUT", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "address": "", "documentNumber": "", "name": "", "firstName": "", "lastName": "", "paternalLastName": "", "maternalLastName": "", "personalNumber": "", "curp": "", "email": "", "birthDate": "", "expireAt": "", "gender": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.put("https://demo-api.incodesmile.com/omni/update/editable-ocr-data", headers=headers, json={ "address": "", "documentNumber": "", "name": "", "firstName": "", "lastName": "", "paternalLastName": "", "maternalLastName": "", "personalNumber": "", "curp": "", "email": "", "birthDate": "", "expireAt": "", "gender": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/update/editable-ocr-data")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("PUT", HttpRequest.BodyPublishers.ofString("{\n \"address\": \"\",\n \"documentNumber\": \"\",\n \"name\": \"\",\n \"firstName\": \"\",\n \"lastName\": \"\",\n \"paternalLastName\": \"\",\n \"maternalLastName\": \"\",\n \"personalNumber\": \"\",\n \"curp\": \"\",\n \"email\": \"\",\n \"birthDate\": \"\",\n \"expireAt\": \"\",\n \"gender\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/update-editable-ocr-data-second-id` - URL: https://developer.incode.com/api-reference/update-editable-ocr-data-second-id/ - Markdown: https://developer.incode.com/api-reference/update-editable-ocr-data-second-id.md - Endpoint: `PUT /omni/update/editable-ocr-data-second-id` # Update editable OCR data in interview for the second Id `PUT /omni/update/editable-ocr-data-second-id` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Update some of the crucial interview OCR data if needed. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `address` | string | | | | `documentNumber` | string | | | | `name` | string | | | | `firstName` | string | | | | `lastName` | string | | | | `paternalLastName` | string | | | | `maternalLastName` | string | | | | `personalNumber` | string | | | | `curp` | string | | | | `email` | string | | | | `birthDate` | string | | | | `expireAt` | string | | | | `gender` | string | | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X PUT https://demo-api.incodesmile.com/omni/update/editable-ocr-data-second-id \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "address": "", "documentNumber": "", "name": "", "firstName": "", "lastName": "", "paternalLastName": "", "maternalLastName": "", "personalNumber": "", "curp": "", "email": "", "birthDate": "", "expireAt": "", "gender": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/update/editable-ocr-data-second-id", { method: "PUT", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "address": "", "documentNumber": "", "name": "", "firstName": "", "lastName": "", "paternalLastName": "", "maternalLastName": "", "personalNumber": "", "curp": "", "email": "", "birthDate": "", "expireAt": "", "gender": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.put("https://demo-api.incodesmile.com/omni/update/editable-ocr-data-second-id", headers=headers, json={ "address": "", "documentNumber": "", "name": "", "firstName": "", "lastName": "", "paternalLastName": "", "maternalLastName": "", "personalNumber": "", "curp": "", "email": "", "birthDate": "", "expireAt": "", "gender": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/update/editable-ocr-data-second-id")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("PUT", HttpRequest.BodyPublishers.ofString("{\n \"address\": \"\",\n \"documentNumber\": \"\",\n \"name\": \"\",\n \"firstName\": \"\",\n \"lastName\": \"\",\n \"paternalLastName\": \"\",\n \"maternalLastName\": \"\",\n \"personalNumber\": \"\",\n \"curp\": \"\",\n \"email\": \"\",\n \"birthDate\": \"\",\n \"expireAt\": \"\",\n \"gender\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/updated-watchlist-result` - URL: https://developer.incode.com/api-reference/updated-watchlist-result/ - Markdown: https://developer.incode.com/api-reference/updated-watchlist-result.md - Endpoint: `GET /omni/updated-watchlist-result` # Updated global watchlist result `GET /omni/updated-watchlist-result` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint gets the latest result for a previous search created with [watch-list](#/Onboarding/getWatchlistResult) with refId from it's response, or gathered from an update notification or with interviewId that the search is associated with. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `ref` | query | string | | | | `id` | query | string | | | | `api-version` | header | string | yes | | ## Responses ### 200 OK ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/updated-watchlist-result \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/updated-watchlist-result", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/updated-watchlist-result", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/updated-watchlist-result")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `api-reference/updatemanualreview` - URL: https://developer.incode.com/api-reference/updatemanualreview/ - Markdown: https://developer.incode.com/api-reference/updatemanualreview.md - Endpoint: `PUT /omni/manual-review` # Update manual review `PUT /omni/manual-review` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Can be used to set an interview as 'needs manual review', 'approved by manual review' or 'rejected by manual review'. In case manualReviewStatus field in request is set to APPROVED or REJECTED, notification to client side is sent for onboarding status change - see [notify-status-changed] for more details ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `interviewId` | query | string | | Id of onboarding for which data will be updated. If not present, it will be extracted from token. | | `api-version` | header | string | yes | | ## Request body Content-Type: `application/json` | Field | Type | Required | Description | | --- | --- | --- | --- | | `manualReviewStatus` | string | yes | Enum: `REQUIRED`, `APPROVED`, `REJECTED` | | `newReason` | string | | Intended to be use when setting manualReviewStatus as required, it will be added to the list of reasons why a session was flagged as needs manual review. | | `comment` | string | | Required comment in written form. | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X PUT https://demo-api.incodesmile.com/omni/manual-review \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "manualReviewStatus": "", "newReason": "", "comment": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/manual-review", { method: "PUT", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "manualReviewStatus": "", "newReason": "", "comment": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.put("https://demo-api.incodesmile.com/omni/manual-review", headers=headers, json={ "manualReviewStatus": "", "newReason": "", "comment": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/manual-review")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("PUT", HttpRequest.BodyPublishers.ofString("{\n \"manualReviewStatus\": \"\",\n \"newReason\": \"\",\n \"comment\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/verification-async-referenceid` - URL: https://developer.incode.com/api-reference/verification-async-referenceid/ - Markdown: https://developer.incode.com/api-reference/verification-async-referenceid.md - Endpoint: `GET /omni/verification/async/{referenceId}` # Get async vendor verification status/result `GET /omni/verification/async/{referenceId}` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Retrieves the status and persisted result of a previously initiated async vendor verification request. The result field is null while the request is PENDING, carries the verification response body once COMPLETED, and carries error details when FAILED. The result is also delivered via the corresponding webhook (EKYB_VERIFICATION_RESULT / EKYC_VERIFICATION_RESULT); this endpoint is a read-only status check. Returns 404 if the referenceId is not found or belongs to a different tenant. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `referenceId` | path | string | yes | | | `api-version` | header | string | yes | | ## Responses ### 200 Request found — status is PENDING, COMPLETED, or FAILED Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `referenceId` | string | | | | `status` | string | | Enum: `PENDING`, `COMPLETED`, `FAILED` | | `type` | string | | Enum: `EKYB`, `EKYC` | | `result` | object | | | ### 404 No async verification request found for the given referenceId Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `referenceId` | string | | | | `status` | string | | Enum: `PENDING`, `COMPLETED`, `FAILED` | | `type` | string | | Enum: `EKYB`, `EKYC` | | `result` | object | | | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X GET https://demo-api.incodesmile.com/omni/verification/async/{referenceId} \ -H "x-api-key: " \ -H "api-version: 1.0" ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/verification/async/{referenceId}", { method: "GET", headers: { "x-api-key": "", "api-version": "1.0", }, }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", } res = requests.get("https://demo-api.incodesmile.com/omni/verification/async/{referenceId}", headers=headers) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/verification/async/{referenceId}")) .header("x-api-key", "") .header("api-version", "1.0") .method("GET", HttpRequest.BodyPublishers.noBody()) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "referenceId": "string", "status": "PENDING", "type": "EKYB", "result": {} } ``` --- - Path: `api-reference/verifyface` - URL: https://developer.incode.com/api-reference/verifyface/ - Markdown: https://developer.incode.com/api-reference/verifyface.md - Endpoint: `POST /omni/verifyFace` # Verify face `POST /omni/verifyFace` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment A bank executive can ask the customer to additionally capture his face during an interview and do face recognition. A face can be captured from selfie or ID that a customer places in front of camera. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | | Base64 string representation of the image. | | `interviewId` | string | | 5c10c728c7a29d001536ad13 | | `compareWith` | string | yes | Enum: `selfie`, `videoSelfie`, `id`, `nfc` | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `confidence` | number (float) | | Confidence value of comparing. Number between 0 and 1. | ### 400 Custom error statuses: - 4019: Face not found - 1003: Face cropping failure Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/verifyFace \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "", "interviewId": "", "compareWith": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/verifyFace", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "", "interviewId": "", "compareWith": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/verifyFace", headers=headers, json={ "base64Image": "", "interviewId": "", "compareWith": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/verifyFace")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\",\n \"interviewId\": \"\",\n \"compareWith\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "confidence": 0 } ``` --- - Path: `api-reference/video-selfie-upload-complete` - URL: https://developer.incode.com/api-reference/video-selfie-upload-complete/ - Markdown: https://developer.incode.com/api-reference/video-selfie-upload-complete.md - Endpoint: `POST /omni/video-selfie/upload/complete` # Complete multipart video selfie upload `POST /omni/video-selfie/upload/complete` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Signal that all chunks have been uploaded. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `uploadId` | string | yes | | | `parts` | array[PartInfo] | | | | `parts.partNumber` | integer (int32) | yes | | | `parts.eTag` | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `status` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/video-selfie/upload/complete \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "uploadId": "", "parts": [], "parts.partNumber": 0, "parts.eTag": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/video-selfie/upload/complete", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "uploadId": "", "parts": [], "parts.partNumber": 0, "parts.eTag": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/video-selfie/upload/complete", headers=headers, json={ "uploadId": "", "parts": [], "parts.partNumber": 0, "parts.eTag": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/video-selfie/upload/complete")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"uploadId\": \"\",\n \"parts\": [],\n \"parts.partNumber\": 0,\n \"parts.eTag\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "status": "string" } ``` --- - Path: `api-reference/video-selfie-upload-initiate` - URL: https://developer.incode.com/api-reference/video-selfie-upload-initiate/ - Markdown: https://developer.incode.com/api-reference/video-selfie-upload-initiate.md - Endpoint: `POST /omni/video-selfie/upload/initiate` # Initiate multipart video selfie upload `POST /omni/video-selfie/upload/initiate` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Start a chunked video upload session. Returns an uploadId for subsequent part uploads and completion. The entire upload (all parts + complete) must finish within the configured video selfie timeout (default 240 seconds), otherwise the session will receive a fail score for the video selfie module. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `uploadId` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/video-selfie/upload/initiate \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/video-selfie/upload/initiate", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/video-selfie/upload/initiate", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/video-selfie/upload/initiate")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "uploadId": "string" } ``` --- - Path: `api-reference/video-selfie-upload-part` - URL: https://developer.incode.com/api-reference/video-selfie-upload-part/ - Markdown: https://developer.incode.com/api-reference/video-selfie-upload-part.md - Endpoint: `POST /omni/video-selfie/upload/part` # Upload a video selfie chunk `POST /omni/video-selfie/upload/part` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Upload a single chunk of the video selfie. Chunks must be between 5MB and 10MB, except for the last chunk which can be smaller. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `uploadId` | query | string | yes | | | `partNumber` | query | integer (int32) | yes | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `partNumber` | integer (int32) | | | | `eTag` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/video-selfie/upload/part \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/video-selfie/upload/part", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/video-selfie/upload/part", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/video-selfie/upload/part")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "partNumber": 0, "eTag": "string" } ``` --- - Path: `api-reference/videoselfie-compare-ocr-v2` - URL: https://developer.incode.com/api-reference/videoselfie-compare-ocr-v2/ - Markdown: https://developer.incode.com/api-reference/videoselfie-compare-ocr-v2.md - Endpoint: `POST /omni/videoselfie/compare-ocr/v2` # Compare OCR from videoselfie against OCR from ID v2 `POST /omni/videoselfie/compare-ocr/v2` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint is used to compare OCR from videoselfie frame against OCR from ID. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `base64Image` | string | yes | Base64 string representation of the image | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `success` | boolean | | Flag indicating request passed successfully. | | `sessionStatus` | string | | Session status Enum: `Alive`, `Closed`, `Deleted` | ### 400 Custom error statuses: - 5003: Unsatisfied image size - 5004: Document alignment failed - 5005: Document not found Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/videoselfie/compare-ocr/v2 \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "base64Image": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/videoselfie/compare-ocr/v2", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "base64Image": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/videoselfie/compare-ocr/v2", headers=headers, json={ "base64Image": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/videoselfie/compare-ocr/v2")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"base64Image\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "success": true, "sessionStatus": "Alive" } ``` --- - Path: `api-reference/videoselfie-hash` - URL: https://developer.incode.com/api-reference/videoselfie-hash/ - Markdown: https://developer.incode.com/api-reference/videoselfie-hash.md - Endpoint: `POST /omni/videoselfie/hash` # Get videoselfie hash `POST /omni/videoselfie/hash` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment Obtain a hash of the video file of the videoselfie. The hash and hashImage fields in the response will be null if the video file is not yet ready. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `withImage` | query | boolean | | | | `api-version` | header | string | yes | | ## Responses ### 200 OK Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `hash` | string | | | | `hashimage` | string | | | | `message` | string | | | ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/videoselfie/hash \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{}' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/videoselfie/hash", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({}), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/videoselfie/hash", headers=headers, json={}) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/videoselfie/hash")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json { "hash": "string", "hashimage": "string", "message": "string" } ``` --- - Path: `api-reference/watchlist-result` - URL: https://developer.incode.com/api-reference/watchlist-result/ - Markdown: https://developer.incode.com/api-reference/watchlist-result.md - Endpoint: `POST /omni/watchlist-result` # Global Watchlist result `POST /omni/watchlist-result` Base URL: `https://demo-api.incodesmile.com` — Incode demo environment This endpoint calls the global watchlist api (currently only Tier 2), and gets the latest gathered result. ## Path & query parameters | Name | In | Type | Required | Description | | --- | --- | --- | --- | --- | | `api-version` | header | string | yes | | ## Request body | Field | Type | Required | Description | | --- | --- | --- | --- | | `firstName` | string | | | | `surName` | string | | | | `birthYear` | integer (int32) | | Year of birth, if known | | `countryCodes` | array | | | | `watchlistTypes` | array | | | | `subscribe` | boolean | | Subscribes to updates on the watchlists to receive notification for updates on the search. | | `fuzziness` | number (float) | | Determines how closely the returned results must match the supplied name. | | `search_profile` | string | | Search profile set for the client to use specify what sources they will be searching against. | ## Responses ### 200 OK ### 400 Bad Request Response body (`application/json`): | Field | Type | Required | Description | | --- | --- | --- | --- | | `timestamp` | integer (int64) | | UTC timestamp in milliseconds | | `status` | integer (int32) | | Custom error code or HTTP status code | | `error` | string | | HTTP status error | | `message` | string | | Custom error message | | `path` | string | | Endpoint path | | `details` | object | | Custom error details | ## Code samples Generated from this endpoint's method, path, and the conventional Incode headers. The base URL is the Incode demo environment; replace `` with a key for your region. ### cURL ```bash curl -X POST https://demo-api.incodesmile.com/omni/watchlist-result \ -H "x-api-key: " \ -H "api-version: 1.0" \ -H "Content-Type: application/json" \ -d '{ "firstName": "", "surName": "", "birthYear": 0, "countryCodes": [], "watchlistTypes": [], "subscribe": false, "fuzziness": 0, "search_profile": "" }' ``` ### Node ```js const res = await fetch("https://demo-api.incodesmile.com/omni/watchlist-result", { method: "POST", headers: { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", }, body: JSON.stringify({ "firstName": "", "surName": "", "birthYear": 0, "countryCodes": [], "watchlistTypes": [], "subscribe": false, "fuzziness": 0, "search_profile": "" }), }); const data = await res.json(); ``` ### Python ```python import requests headers = { "x-api-key": "", "api-version": "1.0", "Content-Type": "application/json", } res = requests.post("https://demo-api.incodesmile.com/omni/watchlist-result", headers=headers, json={ "firstName": "", "surName": "", "birthYear": 0, "countryCodes": [], "watchlistTypes": [], "subscribe": False, "fuzziness": 0, "search_profile": "" }) data = res.json() ``` ### Java ```java HttpRequest req = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/watchlist-result")) .header("x-api-key", "") .header("api-version", "1.0") .header("Content-Type", "application/json") .method("POST", HttpRequest.BodyPublishers.ofString("{\n \"firstName\": \"\",\n \"surName\": \"\",\n \"birthYear\": 0,\n \"countryCodes\": [],\n \"watchlistTypes\": [],\n \"subscribe\": false,\n \"fuzziness\": 0,\n \"search_profile\": \"\"\n}")) .build(); HttpResponse res = HttpClient.newHttpClient() .send(req, HttpResponse.BodyHandlers.ofString()); ``` ### Example response ```json {} ``` --- - Path: `concepts-and-architecture/authorization-identity-protocols` - URL: https://developer.incode.com/concepts-and-architecture/authorization-identity-protocols/ - Markdown: https://developer.incode.com/concepts-and-architecture/authorization-identity-protocols.md # Authorization and Identity Protocols Incode supports identity verification as part of an OpenID Connect (OIDC) authentication flow. This page explains how OAuth 2.0 and OIDC work together and describes the two ways to configure OIDC in Dashboard. *** ## OAuth 2.0 and OpenID Connect OAuth 2.0 and OpenID Connect (OIDC) are related but distinct protocols. They are often used together. - **OAuth 2.0** is an [authorization](/get-started-with-incode/glossary/#authorization) framework. It controls access to resources. When a user authorizes your application, the authorization server issues an access token. Your application uses that token to make API requests on the user's behalf. - **OpenID Connect (OIDC)** is an [authentication](/get-started-with-incode/glossary/#authentication) layer built on top of OAuth 2.0. It confirms the user's identity. In addition to an access token, the authorization server issues an ID token. The ID token confirms who the user is. It is a JSON Web Token (JWT) signed by the authorization server, and your application must validate it before trusting its contents. Together, they work like this: 1. Your application redirects the user to the authorization server. 2. The user authenticates by completing a Flow or Workflow. 3. The authorization server issues an authorization code. 4. Your application exchanges the code for an access token and an ID token. 5. Your application validates the ID token and uses the access token to call Incode APIs. Incode uses the authorization code flow with Proof Key for Code Exchange (PKCE). This is the recommended flow for web and mobile applications. *** ## Configuration Methods Incode supports two ways to configure OIDC: automatic and manual. The right choice depends on how your integration is structured. ### Automatic Configuration Automatic configuration ties OIDC directly to a specific Flow or Workflow. When you enable the **OAuth2 Secured** flag on a Flow or Workflow, Incode automatically generates a dedicated OIDC client for it. You do not need to create or manage the client manually. This client is configured as a public client using PKCE. A client secret is generated but never surfaced or used, since authentication relies only on the PKCE code and verifier. Use automatic configuration when: - You want OIDC authentication scoped to a specific Flow or Workflow. - You want Incode to manage client generation for you. - You are building a new integration. For setup instructions, see [OIDC Automatic Configuration](/concepts-and-architecture/oidc-automatic-configuration/). ### Manual Configuration Manual configuration lets you create and manage OIDC clients directly in Dashboard in **Configuration > Authorization**. You define the client ID, client secret, redirect URIs, authentication methods, and grant types yourself. Scoping under manual configuration depends on the authentication type. For example, onboarding authentication is scoped to a specific Flow or Workflow, while face authentication is not tied to a Flow or Workflow. Use manual configuration when: - You need a standalone OIDC client whose scoping doesn't fit the automatic model - You require specific authentication methods or grant types not available through automatic configuration. - You are managing an existing integration. For setup instructions, see [OIDC Manual Configuration](/concepts-and-architecture/oidc-manual-configuration/). ### Comparison | OIDC Automatic Configuration | OIDC Manual Configuration | | ------------------------------------------------------------------ | -------------------------------------- | | Incode generates an OIDC client | You create a OIDC client in Dashboard | | Scoped to a Flow or Workflow | Scoping depends on authentication type | | Configured as a public client using PKCE; no client secret is used | You manage the client secret | | Recommended for new integrations | Recommended for existing integrations |
--- - Path: `concepts-and-architecture/concepts-and-architecture` - URL: https://developer.incode.com/concepts-and-architecture/ - Markdown: https://developer.incode.com/concepts-and-architecture.md # Concepts and Architecture This section explains the concepts and architecture behind every Incode integration: how the platform is structured, how it secures data and requests, the difference between onboarding and authentication, how sessions are scored, and how Workflows and Flows control the verification experience. Read this section to understand how the platform works before moving on to implementation guides for a specific integration type. ## Verification Concepts - **[Onboarding or Authentication](/concepts-and-architecture/onboarding-vs-authentication/)**: The two verification journeys the platform supports: onboarding (verifying a new user for the first time) and authentication (confirming a returning user via Face Authentication), and how they relate. - **[Scoring System Explained](/concepts-and-architecture/understanding-scores/)**: How module-level and overall session scores are calculated, the `ok` / `warn` / `manual` / `fail` / `unknown` status model, and how scores map to approve, manual-review, and deny decisions. - **[User Consent for PII Data](/concepts-and-architecture/user-consent-considerations/)**: The Privacy Consent and Machine Learning Consent types Incode requires, and how to collect them via Dashboard or API. ## Authentication Protocols (OIDC) - **[OIDC Automatic Configuration](/concepts-and-architecture/oidc-automatic-configuration/)**: How OAuth 2.0 and OpenID Connect work together in Incode integrations, and the two ways to configure OIDC: automatic (tied to a Flow or Workflow) or manual. - **[OIDC Manual Configuration](/concepts-and-architecture/oidc-manual-configuration/)**: Step-by-step instructions for creating and managing an OIDC client directly in Dashboard when you need control beyond the automatic model. ## Workflow Configuration - **[Flows and Workflows](/concepts-and-architecture/workflows/)**: The difference between the legacy Flows model and the recommended Workflows model, and the node types (Module, Process, Condition, Result) used to build a Workflow. - **[Conditions for Workflows](/concepts-and-architecture/conditions-for-workflows-20/)**: How Condition nodes branch a user journey based on collected data, with common examples like pass/fail logic and manual review triggers. --- - Path: `concepts-and-architecture/condition-use-cases` - URL: https://developer.incode.com/concepts-and-architecture/condition-use-cases/ - Markdown: https://developer.incode.com/concepts-and-architecture/condition-use-cases.md # Condition Use Cases This page walks through common ways to use Conditions in a Workflow, from straightforward pass/fail logic to module-specific rules. Use these examples as starting points for building Conditions that fit your verification needs. You configure a Condition when you add it to a [Workflow](/dashboard-platform-administration/workflows-20/#create-workflows). For configuration instructions, refer to [Configure Workflow Conditions](/dashboard-platform-administration/configure-workflow-conditions/). ## Pass or Fail a Session You can define specific conditions to determine the session result. In this standard identity verification example, the session passes if: - The ID is valid - The user is a live person - The user's face matches the face on the ID If any rule is false, the Condition follows the Otherwise path. In this example, this path has been configured to fail the session. ![](https://files.readme.io/476d163b031264ad878f19a11f79a1c4d70bed559adc7274669b9757e734a736-image.png) ![](https://files.readme.io/ae1d3e4785d5f946029eeebb68ef2955ec87981ab8d06bcc225f7d1e3feb9e2d-image.png) ## All capture attempts used In some cases, you may want to mark sessions for manual review. For example, if you allow five ID capture attempts, you may want to flag any session where the user needed all five. The following image shows a Condition that sends those sessions to manual review: ![](https://files.readme.io/c3b555eb91b07308fd936bb79fc9fad3b43a394c3884a3722f7366d74c22f795-image.png) ![](https://files.readme.io/538285c44d924315606b0f1b2dd100465a4e5647a7efde8d5f39ecd23d3a04a8-image.png) ## Watchlist Business The Watchlist Business module is an advanced module that allows you to screen business entities against various international and national watchlists during the identity verification process. Conditions can use this module's results to affect the session result. In the example Condition below, the session is failed if the risk level is unknown or the business entity appears on the watchlist 20 times or more. ![](https://files.readme.io/495de9987dae30a067e0cd58e2245a3905d79fe43090e50cd6d1ba07169bc385-image.png) ## Condition options by module The rules available in a Condition depend on which modules are in your Workflow. Each module surfaces its own set of fields, operators, and values that Conditions can evaluate. For the Condition options a specific module supports, see that module's [Dashboard configuration](/dashboard-platform-administration/add-modules/) documentation. --- - Path: `concepts-and-architecture/conditions-for-workflows-20` - URL: https://developer.incode.com/concepts-and-architecture/conditions-for-workflows-20/ - Markdown: https://developer.incode.com/concepts-and-architecture/conditions-for-workflows-20.md # Workflow Conditions Conditions let you dynamically customize user journeys built using Workflows. They enable verification flows that adapt to the data collected during the verification process, optimizing the experience for each user. A condition acts as a decision node. It sends the user journey down different paths based on the user data received. This lets you control which modules are presented to the user. Conditions can assess data quality, verification check outcomes, crosschecks, and more. You configure a condition when you add it to a [Workflow](/dashboard-platform-administration/workflows-20/#create-workflows). For configuration instructions, refer to [Configure Workflow Conditions](/dashboard-platform-administration/configure-workflow-conditions/). ## Sample Condition Nodes The following images show a simple condition, both in its configuration panel and as it appears on the canvas. In this case, the session passes only if the user presents a document issued by the United States: ![](https://files.readme.io/f9b9bc22549f4007a82695eb7211bf85a4b08e061f83da06575846ba7de3de3a-image.png) ![](https://files.readme.io/47309cbc785a4b015fb3c32b292742b9f2618843e6d04166c544d5bac34c668b-image.png) The following image shows a more complex condition. In this case, the user must complete additional steps if their identity cannot be verified using eKYC: ![](https://files.readme.io/a734be927696f682f9da685dd033385ea06493c874d5707dd1f549f3fb458bd8-image.png) ## Best Practices - **Keep conditions simple**. Instead of creating one complex condition, link multiple simpler conditions in sequence. This makes the Workflow easier to understand and manage, and it makes it easier to see which path the user journey followed. - **Use logical operators deliberately**. When you do need `AND` or `OR` to combine rules within a single condition, plan the full expression before adding it to your Workflow so it behaves the way you expect. - **Monitor and adjust**. Regularly review the performance of your Workflows and adjust conditions based on real outcomes. - **Plan for all outcomes**. Ensure every possible path through the Workflow leads to a clear result. Dead ends can confuse users and disrupt the verification process.

--- - Path: `concepts-and-architecture/oidc-automatic-configuration` - URL: https://developer.incode.com/concepts-and-architecture/oidc-automatic-configuration/ - Markdown: https://developer.incode.com/concepts-and-architecture/oidc-automatic-configuration.md # OIDC Automatic Configuration Incode's web-based Onboarding Flows and Workflows that use redirects can be vulnerable to certain security attacks. To address this, you can enable a setting called **OAuth2 Secured**. When you enable that setting, the Flow or Workflow runs as part of a standard OAuth 2.0/OpenID Connect (OIDC) process. After the user successfully completes the Flow or Workflow, a dedicated OIDC client is automatically generated, configured with: - An authorization code grant - A Proof Key for Code Exchange (PKCE) hashed using SHA-256 When you enable **OAuth2 Secured**, a redirect URI is mandatory. Automatic configuration pre-defaults most other settings for you and does not expose controls for requested scopes,the post-logout redirect URI, or user consent. If you need control over these settings, use [manual configuration](/concepts-and-architecture/oidc-manual-configuration/) instead. ### Warning Disabling and re-enabling **OAuth2 Secured** generates a new OAuth client and invalidates the previous `client_id`. You must update all client integrations with the new `client_id`. Also, any change to the redirect URI must be updated in your Flow or Workflow configuration and reflected in all authorization and token requests. Mismatched URIs will cause authorization failures. Follow the steps on this page to implement OIDC authentication for your Flow or Workflow. Complete them in order. *** ## Enable OAuth2 Secured 1. In Dashboard, click **Flow Builder** in the left menu, then click **Flows** or **Workflows**, depending on which you are configuring. 2. Click the **Settings** tab at the top. 3. In the User Experience section, enable **OAuth2 Secured (web only)**. 4. Scroll down to the After Verification section and enter your **Redirect URL**. 5. Click **Save Changes** for a Flow, **Save & Publish** for a Workflow. After a Flow or Workflow is configured for OAuth security, its `flowid` no longer works with the incodesmile URL scheme. Follow the steps on this page to move to a new URL scheme and authorization pattern. *** ## Prepare the Authorization Request 1. Generate a cryptographically random `code_verifier` secret and store it. Then compute the `code_challenge` by hashing the `code_verifier` using SHA-256. This is the PKCE mechanism. 2) Generate a cryptographically random `state` value. This protects against CSRF attacks. It must be unique per authorization request and stored securely: in memory for SPA applications, or in a session cookie or in-memory cache for BFF applications. 3) Generate a cryptographically random `nonce` value. This protects against ID token replay attacks. It must be unique per authentication request and stored the same way as `state`. For more information, see OpenID Connect Core: Nonce Notes. 4) Fetch your OIDC configuration from the well-known discovery endpoint: [https://auth.incode.com/.well-known/openid-configuration](https://auth.incode.com/.well-known/openid-configuration). This returns all the server endpoints, supported features, and public keys your application needs. | Parameter | Description | |---|---| | `client_id` | Required. Your OAuth client ID. Find this in Dashboard under your Flow or Workflow settings. | | `redirect_uri` | Required. The URI the authorization server redirects to after the user completes the flow. Must exactly match the redirect URI configured in Dashboard for your Flow or Workflow. | | `response_type` | Required. Must be `code`. This requests an authorization code, which your server exchanges for tokens. | | `scope` | Required. Must include `openid`. This tells the server to return an ID token. Additional scopes may be added depending on your configuration. | | `state` | Required. A cryptographically random, unguessable value generated per request. Used to prevent Cross-Site Request Forgery (CSRF) attacks. Your application must verify this value matches when the authorization server redirects back. | | `nonce` | Required. A cryptographically random, unique value generated per request. Embedded in the ID token by the authorization server. Your application must verify this value matches to prevent token replay attacks. | | `code_challenge_method` | Required. Must be `S256`. This specifies that the `code_challenge` was hashed using SHA-256. | | `code_challenge` | Required. The PKCE code challenge. Derived by hashing the `code_verifier` using SHA-256. | | `response_mode` | Required. Must be `form_post`. This tells the authorization server to return the authorization code via an HTTP POST rather than in the URL, which is more secure. | | `external_customer_id` | Optional. Your identifier for the user. Use this to correlate the Incode session with a user in your own system. | *** ## Send the Authorization Request Construct the following URL and redirect the user's browser to it. ```http https://auth.incode.com/oauth2/authorize ?client_id={client_id} &redirect_uri={redirect_uri} &scope=openid &response_type=code &response_mode=form_post &state={state} &nonce={nonce} &code_challenge_method=S256 &code_challenge={code_challenge} &external_customer_id={external_customer_id} ``` After you send the authorization request, the user is redirected to the Incode Authorization Server, where the associated Flow or Workflow runs as part of the `/authorize` endpoint. After the Flow or Workflow completes, one of the following happens: - **On failure**: The user is redirected to `redirect_uri` with `error` and `error_description` URL parameters. For details, see the OIDC spec. - **On success**: The user is redirected to `redirect_uri` with an authorization code and `state` returned in the URL. You must verify the `state` parameter before proceeding. Compare the returned value with the one you stored before the request. If the value is missing or doesn't match, abort the process. *** ## Exchange the Authorization Code for Tokens After the user completes the Flow or Workflow, your application receives an authorization code. Exchange it for tokens using the `/oauth2/token` endpoint. ### Token Request Parameters | Parameter | Description | | --------------- | ------------------------------------------------------------------------------------- | | `grant_type` | Required. Must be `authorization_code`. | | `code` | Required. The authorization code returned from the authorization request. | | `client_id` | Required. Must match the `client_id` used in the authorization request. | | `redirect_uri` | Required. Must match the `redirect_uri` used in the authorization request. | | `code_verifier` | Required. The original PKCE code verifier generated before the authorization request. | ### Example Token Response ```json { "access_token": "eyJraWQiOiI2MzM2NjAy....zAZ4-FboQg", "scope": "openid profile", "id_token": "eyJraWQiOiI2MzM2NjAyYy05....O3dDfO13Yyg", "token_type": "Bearer", "expires_in": 86399 } ``` ### Validate the ID Token After a successful response, validate the ID token before use. Complete the following checks: 1. Verify the `iss` (issuer) claim exactly matches the Issuer Identifier. 2. Verify the `aud` (audience) claim contains your `client_id`. 3. Verify the JWS signature using: - The algorithm specified in the JWT header - The corresponding public key from the Issuer's JWKS endpoint. Go to [https://auth.incode.com/.well-known/openid-configuration](https://auth.incode.com/.well-known/openid-configuration) and find the value of `jwks_uri`. 4. Verify the current time is before the time in the `exp` (expiration) claim. 5. Verify the `nonce` claim exactly matches the `nonce` value you sent in the authorization request. Access token validation is handled by the Incode Platform in the next step. *** ## Access Incode Platform APIs Use the `access_token` from the previous step to make authenticated requests to the Incode Platform APIs. Include it as a Bearer token in the `Authorization` header. If you previously sent the `x-incode-hardware-id` header, stop sending it. Use the `Authorization` header with the Bearer token instead. The access token is bound to a single session. Standard OAuth 2.0 token validation rules apply. ### Example Request ```http curl --location 'https://saas-api.incodesmile.com/omni/get/score' \ --header 'Content-Type: application/json' \ --header 'api-version: 1.0' \ --header 'x-api-key: ' \ --header 'Authorization: Bearer eyJraWQiOiI2MzM2Nj.....Lf_N7hww' ``` The following endpoints accept this token: - `omni/get/score` - `omni/get/custom-fields` - `omni/get/onboarding/status` - `omni/get/ocr-data`
--- - Path: `concepts-and-architecture/oidc-manual-configuration` - URL: https://developer.incode.com/concepts-and-architecture/oidc-manual-configuration/ - Markdown: https://developer.incode.com/concepts-and-architecture/oidc-manual-configuration.md # OIDC Manual Configuration Manual OpenID Connect (OIDC) configuration lets you create and manage OIDC clients directly in Dashboard, giving you control over settings that [automatic configuration](/concepts-and-architecture/oidc-automatic-configuration/) pre-defaults for you, including which scopes to request, the post-logout redirect URI, and whether user consent is required. With automatic configuration, Incode ties the client directly to a Flow or Workflow and only lets you set the redirect URI. With manual configuration, scoping depends on your authentication type: onboarding authentication remains tied to a specific Flow or Workflow, while face authentication does not. Use this approach when you need more control over your OIDC client's configuration or require specific authentication methods or grant types. Your OIDC client is configured with: - An authorization code grant - A client secret for authentication The OIDC client supports the following authentication methods: - `client_secret_basic` - `client_secret_post` - `client_secret_jwt` - `private_key_jwt` Follow the steps on this page to configure your OIDC client. Complete them in order. *** ## Create an OIDC Client Create a new OIDC client in Dashboard by [generating a new authorization protocol](/dashboard-platform-administration/configuration-authorization-tab/#generate-new-authorization-protocol). While following those steps: - Copy the **_Authorize URL_**, **_Client ID_**, and **_Client Secret_**. You need those values for the remaining steps on this page. - In **_Redirect URIs_** and **_Post Logout Redirect URIs_**, enter `https://oidcdebugger.com/debug`. - Select any of the following checkboxes under **_Client Authentication Methods:_** - `client_secret_basic` - `client_secret_post` - `client_secret_jwt` - `private_key_jwt` *** ## Configure and Send the Authorization Request Use OpenID Connect Debugger to test your authorization request and debug the response. 1. Enter the following values in the debugger: | Field | Value | | ------------- | --------------------------------------------------------------- | | Authorize URI | Your Authorize URL from Dashboard. | | Redirect URI | `https://oidcdebugger.com/debug` | | Client ID | Your Client ID from Dashboard. | | Scope | `openid`. Add any other registered scopes, separated by spaces. | | State | Populated automatically. | | Nonce | Populated automatically. | | Response Type | `code` | | Use PKCE | Select if required by your client configuration. | | Response Mode | `fragment` | 2. Click **Send Request**. You are redirected to the Incode Authorization Server. What happens next depends on your authentication type: - **Face authentication**: Click **Sign In with Incode** and take a selfie. If the user is already enrolled in your organization, authentication succeeds. If not, the user is prompted to sign up. If your Dashboard configuration requires user consent, a consent page appears listing the requested scopes. The user must accept at least one scope to proceed. Consent is saved per scope, so the user is only prompted once per scope. - **Onboarding**: Scan the QR code with a mobile phone and complete the onboarding process. If the session status is `PASSED`, an authorization code is issued. If the status is `FAILED`, authentication is denied. 3. After successful authentication, copy the authorization code from the response. You will use it in the next step. *** ## Exchange the Authorization Code for Tokens Send a `POST` request to `{oidc-base-url}/oauth2/token`. Replace `{oidc-base-url}` with the first part of your Authorize URL from Dashboard, before `/oauth2/authorize`. For example, if your Authorize URL is `oidc-saas.incodesmile.com/oauth2/authorize`, send the request to `oidc-saas.incodesmile.com/oauth2/token`. Include the following parameters in the request body, formatted as `x-www-form-urlencoded`: | Parameter | Description | | --------------- | ------------------------------------------------------------------------------------------------ | | `grant_type` | Required. Must be `authorization_code`. | | `client_id` | Required. Your Client ID from Dashboard. | | `client_secret` | Required. Your Client Secret from Dashboard. | | `redirect_uri` | Required. Must match the Redirect URI registered in Dashboard: `https://oidcdebugger.com/debug`. | | `code` | Required. The authorization code from the previous step. | The example above uses the `client_secret_post` authentication method. The parameters you send must match the authentication method configured for your OIDC client in Dashboard. Authorization codes expire after five minutes. After expiration, the user must complete the authorization flow again. Sessions last one hour. During that time, you can retrieve multiple authorization codes, but only the most recent one is valid. *** ## Retrieve User Information Send a `GET` request to `{oidc-base-url}/userinfo` . Replace `{oidc-base-url}` with the first part of your Authorize URL from Dashboard, before `/oauth2/authorize`. For example, if your Authorize URL is `oidc-saas.incodesmile.com/oauth2/authorize`, send the request to `oidc-saas.incodesmile.com/userinfo`. Include the access token from the previous step in the Authorization header: ```http GET {oidc-base-url}/userinfo Authorization: Bearer {access_token} ``` Use the Postman desktop app for this request, not the web app. You must also configure the Postman Interceptor before sending. ```json { "info": { "_postman_id": "fae0fbcd-5c8f-43e7-8cb4-e08804834f5e", "name": "Authorization-Server Stage", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", "_exporter_id": "9749190" }, "item": [ { "name": "well-known", "request": { "method": "GET", "header": [], "url": { "raw": "https://incode-develop-oidc-1163005361.us-west-2.elb.amazonaws.com/.well-known/openid-configuration", "protocol": "https", "host": [ "incode-develop-oidc-1163005361", "us-west-2", "elb", "amazonaws", "com" ], "path": [ ".well-known", "openid-configuration" ] } }, "response": [] }, { "name": "jwks", "request": { "method": "GET", "header": [], "url": { "raw": "https://incode-develop-oidc-1163005361.us-west-2.elb.amazonaws.com/.well-known/openid-configuration", "protocol": "https", "host": [ "incode-develop-oidc-1163005361", "us-west-2", "elb", "amazonaws", "com" ], "path": [ ".well-known", "openid-configuration" ] } }, "response": [] }, { "name": "/oauth2/introspect", "request": { "method": "GET", "header": [], "url": { "raw": "https://incode-develop-oidc-1163005361.us-west-2.elb.amazonaws.com/oauth2/introspect", "protocol": "https", "host": [ "incode-develop-oidc-1163005361", "us-west-2", "elb", "amazonaws", "com" ], "path": [ "oauth2", "introspect" ] } }, "response": [] }, { "name": "authorization", "request": { "method": "GET", "header": [], "url": { "raw": "https://incode-develop-oidc-1163005361.us-west-2.elb.amazonaws.com/oauth2/authorize?client_id=superapp886&scope=openid&state=soa9pjyqdm&redirect_uri=https://jsonlint.com/&response_type=code", "protocol": "https", "host": [ "incode-develop-oidc-1163005361", "us-west-2", "elb", "amazonaws", "com" ], "path": [ "oauth2", "authorize" ], "query": [ { "key": "client_id", "value": "superapp886" }, { "key": "scope", "value": "openid" }, { "key": "state", "value": "soa9pjyqdm" }, { "key": "redirect_uri", "value": "https://jsonlint.com/" }, { "key": "response_type", "value": "code" } ] } }, "response": [] }, { "name": "token client_secret_post auth method", "request": { "method": "POST", "header": [ { "key": "Cookie", "value": "Cookie_1=value; XSRF-TOKEN=1e7a9269-bf7b-407d-b3a5-5791d0c7a405", "type": "text" } ], "body": { "mode": "urlencoded", "urlencoded": [ { "key": "grant_type", "value": "authorization_code", "type": "text" }, { "key": "client_id", "value": "76f9d8f9c4864fa69c68e617e75d435c", "type": "text" }, { "key": "client_secret", "value": "$LT0AxiQj5W6AqwU#rl_", "type": "text" }, { "key": "redirect_uri", "value": "https://oidcdebugger.com/debug", "type": "text" }, { "key": "code", "value": "MHRSot7hw8GSlSvyHAQrl7Fd6bqXXsL4QiluKp6y00RXKGFt5aVG3LEfXfUxYIlADgkppvIxwOZHDToqDzA3Q0bPtbH_bfRI26h_ENfTq7PEapHDBFF0JWpNaBhpS4u1", "type": "text" } ] }, "url": { "raw": "https://oidc-stage-us.stage.incodetest.com/oauth2/token", "protocol": "https", "host": [ "oidc-stage-us", "stage", "incodetest", "com" ], "path": [ "oauth2", "token" ] } }, "response": [] }, { "name": "token client_secret_post auth method PKCE", "request": { "method": "POST", "header": [ { "key": "Cookie", "value": "Cookie_1=value; XSRF-TOKEN=1e7a9269-bf7b-407d-b3a5-5791d0c7a405", "type": "text" } ], "body": { "mode": "urlencoded", "urlencoded": [ { "key": "grant_type", "value": "authorization_code", "type": "text" }, { "key": "client_id", "value": "09d6202eb7454348ab4c64d82d61ca5a", "type": "text" }, { "key": "client_secret", "value": "(V6In#Cm^c@tbB0)bDM5", "type": "text" }, { "key": "redirect_uri", "value": "https://oidcdebugger.com/debug", "type": "text" }, { "key": "code", "value": "JUHf7ffkieiI81Yolu47Fknk1LAg4C8a4akNYPzHbODUlXI7HbPPI7QKawKwf2kigL8jxPFWAsUc5oO5P-BJ6CfJHxiDhmPh5klXVj5ukdehijEQPrh98fQ9BrbqpiQ4", "type": "text" } ] }, "url": { "raw": "https://incode-develop-oidc-1163005361.us-west-2.elb.amazonaws.com/oauth2/token", "protocol": "https", "host": [ "incode-develop-oidc-1163005361", "us-west-2", "elb", "amazonaws", "com" ], "path": [ "oauth2", "token" ] } }, "response": [] }, { "name": "token jwt", "request": { "method": "POST", "header": [ { "key": "Cookie", "value": "Cookie_1=value; XSRF-TOKEN=1e7a9269-bf7b-407d-b3a5-5791d0c7a405", "type": "text" } ], "body": { "mode": "urlencoded", "urlencoded": [ { "key": "redirect_uri", "value": "https://oidcdebugger.com/debug", "type": "text" }, { "key": "code", "value": "TGwBAuaexqWZvkVjO0QDGNUC9i7fHyNlcuPw68rSRDVm6VQc-TslA_IB39OV2PGoT8FRrnu20odmdP6HZh_88RJdt8Sx7GbDvZkyk6YUtGAMjLjeKe0t3aV0n8vzGKLN", "type": "text" }, { "key": "client_assertion_type", "value": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer", "type": "text" }, { "key": "client_assertion", "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiIwOWQ2MjAyZWI3NDU0MzQ4YWI0YzY0ZDgyZDYxY2E1YSIsInN1YiI6IjA5ZDYyMDJlYjc0NTQzNDhhYjRjNjRkODJkNjFjYTVhIiwiYXVkIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NTAxMi9vYXV0aDIvdG9rZW4iLCJqdGkiOiI1NjQ1MjU0MjIyNDIiLCJleHAiOiIxNjg4ODIwOTE2In0.SZ9eJ0uFOGTtAagLKVl9nax3uYEp62PBVdH3Wo9ti1A", "type": "text" }, { "key": "client_id", "value": "09d6202eb7454348ab4c64d82d61ca5a", "type": "text" } ] }, "url": { "raw": "https://incode-develop-oidc-1163005361.us-west-2.elb.amazonaws.com/oauth2/token", "protocol": "https", "host": [ "incode-develop-oidc-1163005361", "us-west-2", "elb", "amazonaws", "com" ], "path": [ "oauth2", "token" ] } }, "response": [] }, { "name": "token client_secret_basic auth method", "request": { "method": "POST", "header": [ { "key": "Cookie", "value": "Cookie_1=value; XSRF-TOKEN=1e7a9269-bf7b-407d-b3a5-5791d0c7a405", "type": "text" } ], "body": { "mode": "urlencoded", "urlencoded": [ { "key": "grant_type", "value": "authorization_code", "type": "text" }, { "key": "client_id", "value": "09d6202eb7454348ab4c64d82d61ca5a", "type": "text" }, { "key": "client_secret", "value": "(V6In#Cm^c@tbB0)bDM5", "type": "text" }, { "key": "redirect_uri", "value": "https://oidcdebugger.com/debug", "type": "text" }, { "key": "code", "value": "JUHf7ffkieiI81Yolu47Fknk1LAg4C8a4akNYPzHbODUlXI7HbPPI7QKawKwf2kigL8jxPFWAsUc5oO5P-BJ6CfJHxiDhmPh5klXVj5ukdehijEQPrh98fQ9BrbqpiQ4", "type": "text" } ] }, "url": { "raw": "https://incode-develop-oidc-1163005361.us-west-2.elb.amazonaws.com/oauth2/token", "protocol": "https", "host": [ "incode-develop-oidc-1163005361", "us-west-2", "elb", "amazonaws", "com" ], "path": [ "oauth2", "token" ] } }, "response": [] }, { "name": "user info", "request": { "method": "GET", "header": [ { "key": "Authorization", "value": "Bearer eyJraWQiOiIwOWRiMzI2My0zYWE3LTQwZTQtYTg1NS1lMTIyNmY5NDZlMTgiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI2NTQ4Y2RhMDE3MjkwZjI5Y2ZlYjExYjIiLCJhdWQiOiI3NmY5ZDhmOWM0ODY0ZmE2OWM2OGU2MTdlNzVkNDM1YyIsIm5iZiI6MTY5OTI3MDkxMywic2NvcGUiOlsib3BlbmlkIiwicHJvZmlsZSIsInNlbGZpZSJdLCJpc3MiOiJodHRwczovL29pZGMtc3RhZ2UtdXMuc3RhZ2UuaW5jb2RldGVzdC5jb20iLCJleHAiOjE2OTkyNzEyMTMsImlhdCI6MTY5OTI3MDkxM30.YInfHrtorh37oij2KIxWMb8cEtTyG9SsaGDsYBWSCEkP74sCJ_nxoqmTtmxL6KryRITZNiRnrScfVCTqacxybZF5bXe7E6kVr6v2Vv-PaPWoueR4wHOiBRfOhecRycZlDzfgf4nWpLfbzV9p0_k-Kier6m1X2T5wQuavYErwQcErQP2YfO_37KXs1JKGTzl2-g5xWwNPwqXVcUuQqqpAM09PVu7ffqngfztLiSXDbg5Hf8XkEhc8hdrEtmuuaoFNJ9jCXjUUxSbHi2skAvCj8aIFZcj64TNL8po6XnNNdcE4b2MLARhQUH8hQl18xk0OLOzyJAjYRSWyiKOyF9KPZQ", "type": "text" }, { "key": "Cookie", "value": "Cookie_1=value; JSESSIONID=C94F8D8057EC9CAA36365D2B2784C98D", "type": "text" } ], "url": { "raw": "https://oidc-stage-us.stage.incodetest.com/userinfo", "protocol": "https", "host": [ "oidc-stage-us", "stage", "incodetest", "com" ], "path": [ "userinfo" ], "query": [ { "key": "grant_type", "value": "authorization_code", "disabled": true }, { "key": "client_id", "value": "superapp886", "disabled": true }, { "key": "client_secret", "value": "secret", "disabled": true } ] } }, "response": [] }, { "name": "logout", "request": { "method": "POST", "header": [], "body": { "mode": "urlencoded", "urlencoded": [ { "key": "id_token_hint", "value": "eyJraWQiOiI0YmJiNTZiMi1lMTM4LTRmNjctOGFhZi0wNjg5MTU5OGE5YjEiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiI2NDkwMzMxMzBiNjVmMmFjM2ZhMDc2MmMiLCJhdXRoX3Bob3RvX3F1YWxpdHlfdmFsdWUiOjEwMi40OTksImlzcyI6Imh0dHA6Ly9pbmNvZGUtZGV2ZWxvcC1vaWRjLTExNjMwMDUzNjEudXMtd2VzdC0yLmVsYi5hbWF6b25hd3MuY29tIiwiYXV0aF9vdmVyYWxsX3Njb3JlIjowLjc0MjE0MSwibm9uY2UiOiI1c2R0ejUwc2F3Iiwic2lkIjoiaEtpT0lPdGxNRk9fcHdoZVRPTTBvQ3dySzFaODJHZ2pYN0NuSVVOYjg3QSIsImF1ZCI6ImEwODY5ZTBiYjIzMDRjZTU4MmE3N2RiMTFkZGM3NWRlIiwiYXV0aF9vdmVyYWxsX3N0YXR1cyI6IlBBU1MiLCJhenAiOiJhMDg2OWUwYmIyMzA0Y2U1ODJhNzdkYjExZGRjNzVkZSIsImF1dGhfdGltZSI6MTY4ODYzNTEyOCwiaW50ZXJ2aWV3X2lkIjoiNjQ5MDI1ZTUwYjY1ZjJhYzNmOWU4ZmI1IiwiZXhwIjoxNjg4NjM2OTQwLCJpYXQiOjE2ODg2MzUxNDB9.XskcaGx1CRTpAE6A4jwSUV180UwCDPiOCStU1Y7NPlc_6-yJeoU6Wc1APmR_B2IXrksL3mEVFsymppk2pIaA32SLK0X-JMoBZlDRL-z4GSUoZhaTcvvBGAbQnCBR5MSHSg9wrG0muCqH-hqx1L9H0MyNMNtGhQk3BSpi47rw1yceUlO308pr_I5PQcMsJ7ho3SOgUV4GnAlkR9h2K-zGZiojdJok9J0f_R_umjAOzlY0kywPZ8na9miGaPLCNLFJA1dGOncbLGb8OgUVhYoij1K73UvPezuTCeRqZsoh6ksaxI_I-EiTiikpxX5694ojXLwBzBOWcOgi4TJV82jD2w", "type": "text" }, { "key": "client_id", "value": "a0869e0bb2304ce582a77db11ddc75de", "type": "text" }, { "key": "post_logout_redirect_uri", "value": "https://oidcdebugger.com/debug", "type": "text" } ] }, "url": { "raw": "https://incode-develop-oidc-1163005361.us-west-2.elb.amazonaws.com/connect/logout", "protocol": "https", "host": [ "incode-develop-oidc-1163005361", "us-west-2", "elb", "amazonaws", "com" ], "path": [ "connect", "logout" ] } }, "response": [] } ] } ``` ### Test with a Specific User To test authentication for a specific user, add `login_hint` as a parameter to your `/authorize` request. The value depends on how your OIDC client is configured in Dashboard. Accepted value types are: [UUID](/get-started-with-incode/glossary/#customer-uuid), phone number, email address, and national ID number. To send the request: 1. Copy the authorization request from the bottom of OpenID Connect Debugger. 2. Add `&login_hint={value}` to the end of the URL. 3. Paste the full URL into your browser and press Enter.
--- - Path: `concepts-and-architecture/onboarding-vs-authentication` - URL: https://developer.incode.com/concepts-and-architecture/onboarding-vs-authentication/ - Markdown: https://developer.incode.com/concepts-and-architecture/onboarding-vs-authentication.md # Onboarding or Authentication: When to Use Each The Incode Platform provides two verification journeys: **Onboarding** and **Authentication**. They serve different purposes, involve different flows, and produce different results. Understanding how they relate is essential before designing your integration. - **Onboarding** is the process of verifying a new user's identity for the first time and enrolling them in the Incode Platform. - **Authentication** (using the Face Authentication module) is the process of confirming that a returning user is the same person who previously enrolled. Authentication cannot happen before onboarding. A user must successfully complete onboarding before they can be authenticated. *** ## Onboarding Onboarding is Incode's term for an initial identity verification session. It answers the question: **"Is this person who they claim to be?"** During onboarding, the user provides evidence of their identity. This evidence is typically an ID document and a selfie, though you can require additional evidence. The Incode Platform validates that evidence using a combination of OCR, liveness detection, and face matching. It can also include government database checks. ### Onboarding Results A successful onboarding session produces one or both of the following results: - **A verification score**: A calculated confidence measure for each module and an overall session score. Your application uses this score to decide whether to automatically approve, request manual review, or automatically reject the user. Scores are created automatically. - **An Incode Identity**: A unique identifier linked to the user's facial biometric template. This template is extracted from their selfie. This Identity enables future face authentication. Incode Identities are not created automatically. You must configure them in your Flow or Workflow. > ⚠️ **Warning** > > An Incode Identity is created only when you have configured Identity creation in your Flow or Workflow and all verification modules in the onboarding session pass. If any module fails, no Incode Identity is created, and the user cannot be authenticated in the future without completing a new onboarding session. ### When to Use Onboarding Use onboarding when: - A user is new to your platform and has not been verified before. - You need to confirm that a user holds a valid government-issued ID. - You need to verify user's identity against a document or government database for [KYC](/get-started-with-incode/glossary/#kyc) or compliance purposes. - You are enrolling users who will later return and need to be recognized. *** ## Authentication Authentication is the process of confirming that a returning user is the person whose Incode Identity was created during onboarding. It relies on the Incode Face Authentication module. Authentication answers the question: **"Is this the same person we verified before?"** During authentication, the user provides only a selfie. The platform compares that selfie's facial biometric template against one or more previously enrolled Incode Identities. ### Prerequisite Authentication requires a previously created Incode Identity. A user who has not completed a successful onboarding session that created an Identity cannot be authenticated. ### 1:1 and 1:N Authentication The Face Authentication module has two modes: - **1:1 (one-to-one) authentication**: The user's selfie is compared against a single known Incode Identity. A second factor, called an **Authentication Hint**, is required to identify which enrolled identity to compare against. The Authentication Hint is typically the `identityID`, a unique customer identifier returned when the user was approved during onboarding. It is associated with their Incode Identity. Other unique values associated with the identity can also be used. Use 1:1 authentication when your application already knows which user is attempting to authenticate. This can be a user who has already entered a username or phone number before the face authentication step. - **1:N (one-to-many) authentication**: The user's selfie is compared against all enrolled Incode Identities in your account's database. The Incode Platform identifies the closest match without requiring the user to provide any other identifying information. Use 1:N authentication when your application does not know which user is authenticating in advance. This can be in kiosk setups or passwordless login flows where face recognition is the only input. ### When to Use Authentication Use authentication when: - A user has already been onboarded and enrolled. - You want to verify that a returning user is the same person who was originally verified, without requiring them to re-submit an ID document. - You are building a passwordless or biometric login flow. - You want to confirm a user's identity before authorizing a high-value action. ### Authentication Is Not Authorization **Authentication** and **authorization** are different things: - **Authentication** verifies an identity, confirms that users are real, and detects common fraudulent behavior. - **Authorization** grants or denies access or privileges to resources in your application. **Incode does not provide an authorization layer. **Deciding what users are allowed to do is your application's responsibility. Incode returns a result—such as `faceMatch: true/false` or `verified: true/false`—and your application decides what action to take. *** ## The Full Lifecycle The relationship between onboarding and authentication follows a pattern: onboarding happens once, and authentication can happen many times after. The following process is for a new user: 1. An onboarding session is created. 2. The user captures their ID and a selfie. 3. The modules validate data. 4. Their score is calculated. 5. The session is approved. 6. Their Incode Identity is created, and their [customer UUID](/get-started-with-incode/glossary/#customer-uuid) is returned. The following process is for a returning user: 1. The user captures only a selfie. 2. The Incode Platform compares their selfie to their enrolled Incode Identity. 3. A `faceMatch` result is returned. 4. Your app grants or denies access. *** ## Key Objects The following objects are created and used across the onboarding and authentication lifecycle: | Object | Created during | Used for | | ------------------------------ | ------------------------ | --------------------------------------------------------------------------------- | | `interviewId` / Session ID | Onboarding | Identifying the onboarding session; fetching scores and OCR data | | Incode Identity | Onboarding (on approval) | The enrolled user record that authentication compares against | | `identityID` | Onboarding (on approval) | The Authentication Hint for 1:1 face authentication | | Facial biometric template | Onboarding (from selfie) | Face comparison during authentication; stored in the Incode Identity | | Authentication `transactionId` | Face Authentication | Identifying a specific authentication attempt; required for back-end verification | *** ## Choose the Right Capability The following scenarios map to the correct capability to use: | Scenario | Use | | ---------------------------------------------------------------------------------------------------- | ----------------------------- | | New user; no prior verification | **Onboarding** | | User holds an ID document you need to validate | **Onboarding** | | KYC or [AML](/get-started-with-incode/glossary/#aml) compliance check required | **Onboarding** | | Returning user who knows their `identityID` or alternate | **Face Authentication (1:1)** | | Returning user who does do not know their identifier | **Face Authentication (1:N)** | | Passwordless or biometric login for enrolled users | **Face Authentication** | | Confirming identity before a high-value action | **Face Authentication (1:1)** | | Re-verifying an enrolled user's document | **Onboarding** | *** ## Integration Paths for Each Capability Both capabilities are available across the same integration types: no-code/low-code, a supported Incode SDK, and the Incode API. ### **Onboarding Integration Paths** Onboarding integration paths include: - **No-code**: Webflow URL - **Low-code**: Redirect to Webflow URL with a session token - **Full SDK**: Web SDK or mobile SDK with explicit module steps - **API-only**: Single or batch onboarding via API endpoints ### **Authentication Integration Paths** Authentication integration paths include: - **Hosted**: 1:N Authentication Links, OIDC Authentication Links - **Web SDK**: `renderLogin()` method - **Mobile SDK**: `startFaceLogin()` (online 1:1) or offline face login [Integrate by Platform](/integrate-by-platform/integrate-by-platform/) is the recommended starting point for authentication integrations. *** ## Related Pages - [What is Identity Verification?](/get-started-with-incode/what-is-identity-verification/): Detailed information about why you need IDV and how it works - Incode Face Authentication Foundations: Detailed concepts: biometric templates, Incode Identities, 1:1 vs. 1:N - [Onboarding Session Lifecycle](/get-started-with-incode/onboarding-session-lifecycle/): How a session moves from creation to completion - [Integrate by Platform](/integrate-by-platform/integrate-by-platform/): Implementation starting point - [Scoring System Explained](/concepts-and-architecture/understanding-scores/): How onboarding session scores are calculated and used
--- - Path: `concepts-and-architecture/understanding-scores` - URL: https://developer.incode.com/concepts-and-architecture/understanding-scores/ - Markdown: https://developer.incode.com/concepts-and-architecture/understanding-scores.md # Scoring System Every Incode onboarding session produces a score. This score indicates how confident the Incode Platform is that the user is who they claim to be. Session scores are based on the verification modules in your Flow or Workflow. Your application uses the score to decide whether to approve the user, send the session for manual review, or reject it. *** ## Score Structure An onboarding session score has two components: a **numeric value** and a **status**. ### Numeric Value Scores are expressed as a decimal value out of 100, in the format `x.x/100`. For example: - `95.2/100`: High confidence - `79.0/100`: Moderate confidence - `0.0/100`: Zero confidence, or a module that did not run ### Status Statuses are category labels based on: - The numeric value. - The thresholds configured in your Flow or Workflow. There are five possible statuses: | Status | Meaning | | --------- | --------------------------------------------------------------------------------------------------------------------------------------- | | `ok` | The score meets the passing threshold. The user passed this check. | | `warn` | The score is below the passing threshold but above the review threshold. The result warrants attention but is not a definitive failure. | | `manual` | The session has been flagged for manual human review in Dashboard. | | `fail` | The score is below the review threshold. The check did not pass. | | `unknown` | The score could not be calculated. For example, a module did not run or a result is pending. | *** ## Module Scores and Overall Session Score Some modules produce their own independent score. Other don't produce their own score but can still influence the session score based on business logic in your Flow or Workflow. These **module scores** and your business logic work together to produce the overall **session score**. ### Modules with Independent Scores Each module that contributes to scoring produces a value/status pair. The primary scoring modules are: | Module | Score field | What it measures | | ---------------- | ----------------- | -------------------------------------------------------------------------- | | ID Validation | `idValidation` | Document authenticity, OCR quality, and anti-tampering checks | | Face Recognition | `faceRecognition` | Match confidence between the selfie and the ID document photo | | Liveness | `liveness` | Confidence that the selfie was taken from a live person and is not a spoof | > 📘 **Note** > > If no `validationModuleList` is specified when creating a session, the default modules used for scoring are `id`, `faceRecognition`, and `liveness`. **Example Module Score Response** ```json { "overall": { "value": "79.0/100", "status": "warn" }, "faceRecognition": { "value": "0.0/100", "status": "warn" }, "liveness": { "value": "95.2/100", "status": "manual" }, "idValidation": { "value": "79.0/100", "status": "fail" } } ``` ### Modules That Influence the Overall Session Score Some modules collect data and don't produce their own score. These modules can still influence the overall session score when you configure business logic conditions in your Workflow. Their results may not be expressed as an `x.x/100` score. The `extendedUserScoreJsonData` field in the score response contains the full raw JSON for all score data if you need to inspect non-primary module results. The following non-scoring modules are common in onboarding sessions: - [eKYC](/features-and-modules/ekyc/) - [eKYB](/features-and-modules/ekyb/) - [Global Watchlist](/features-and-modules/watchlist/) - [Antifraud Check](/features-and-modules/antifraud-check/) - [Deepsight](/features-and-modules/deepsight/) ### Overall Session Score The overall session score (`overall`) is a composite score. It aggregates the module-level results and reflects the combined confidence across all scoring modules in the onboarding session. The overall score uses the same numeric value and status format as module scores. > 📘 Note > > The numeric thresholds that determine whether a score is `ok`, `warn`, or `fail` are set per Flow or Workflow in Dashboard. The thresholds that make sense for your use case depend on your risk tolerance and regulatory requirements. Contact your Incode Representative for guidance on threshold configuration. ### Score Timing Module scores are calculated as each module completes. These scores may be available before the session finishes, as shown in the following table. Incode recommends waiting for `ONBOARDING_FINISHED` before you fetch scores, because individual module scores do not reflect business rules or the overall session score. | Session status | What scores are available | | -------------------------------- | ------------------------------------------------------------- | | `ID_VALIDATION_FINISHED` | `idValidation` score is available | | `GOVERNMENT_VALIDATION_FINISHED` | Government validation result is available | | `FACE_VALIDATION_FINISHED` | `faceRecognition` and `liveness` scores are available | | `ONBOARDING_FINISHED` | All scores are finalized; overall session score is calculated | *** ## Retrieve Scores Scores are available once the session reaches `ONBOARDING_FINISHED` status. You can also view session scores in Dashboard or retrieve them via API or SDK. ### View Scores in Dashboard Onboarding session scores are visible in **Dashboard** >**Sessions**. Each session view shows: - The overall score and status - Per-module details, including module scores where applicable - The final determination: Approved, Needs Review, Rejected, or Expired - The session event log Additional information may be available depending on the modules in your Flow or Workflow. Dashboard is where reviewers manually examine the session and make an approve or reject decision, which triggers the `MANUAL_REVIEW_APPROVED` or `MANUAL_REVIEW_REJECTED` webhook. ### Retrieve Scores via API Use the `GET /omni/get/score` endpoint. This requires an admin token in the `X-Incode-Hardware-Id` header and your API key in `x-api-key`. ```http GET /omni/get/score?id={interviewId} Content-Type: application/json api-version: 1.0 x-api-key: YOUR_API_KEY X-Incode-Hardware-Id: YOUR_ADMIN_TOKEN ``` See the [Get Scores API reference](/reference/getscores/) for the full response schema. ### Retrieve Scores via SDK In mobile integrations using the full SDK flow, the `getUserScore()` method returns the score at the end of the session. The result includes a parsed `data` object with top-level score fields and the raw `extendedUserScoreJsonData` JSON for full detail. ```javascript // React Native example IncodeSdk.getUserScore({ mode: 'fast' }) .then((result) => { // result.data.status: 'warning' | 'unknown' | 'manual' | 'fail' // result.data.overallScore: "79.0/100" // result.extendedUserScoreJsonData: raw JSON string validateResultWithBusinessLogic(result); }); ``` > 📘 **Tip** > > Apply approval logic, such as score thresholds and identity creation, in your back end, not in the SDK callback. The SDK result is useful for immediate UI feedback, but your server should make the final decision using the API response. *** ## Map Session Results to Business Decisions Your Flow or Workflow configuration determines how overall session results map to business outcomes. The following table shows a typical mapping. | Outcome | Session Result | What it means | | ----------------- | :------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Approve** | **Pass** | The session passed based on your configured thresholds. The user is approved. If configured in your Flow or Workflow, an Incode Identity is created for the user. | | **Manual Review** | **Warn** | The session is placed in a review queue based on your configured thresholds. A human reviewer then approves or rejects it in Dashboard. | | **Deny** | **Fail** | The session failed based on your configured thresholds. The user is rejected. No Incode Identity is created. | In a Flow, this mapping is set in the **Session Score: Pass** setting. In a Workflow, the mapping is determined in the final condition branch. *** ## Related Pages - [Onboarding Session Lifecycle](/get-started-with-incode/onboarding-session-lifecycle/): Session statuses and how scoring relates to session completion - [Flows](/dashboard-platform-administration/flows-1/): How to configure score-to-decision mapping in Flows in Dashboard - [Conditions for Workflows](/concepts-and-architecture/conditions-for-workflows-20/): Workflow-based score conditions and branching logic
--- - Path: `concepts-and-architecture/user-consent-considerations` - URL: https://developer.incode.com/concepts-and-architecture/user-consent-considerations/ - Markdown: https://developer.incode.com/concepts-and-architecture/user-consent-considerations.md # User Consent for PII Data Businesses must collect customer consent and comply with all regional laws and regulations. Incode gives you the tools to collect and manage consent for customers in all regions, including GDPR-regulated countries. This is a general guide. For the full requirements on which types of consent you must collect and how to collect them, review your Master Service Agreement (MSA). Then contact customer support. ## Types of Consent There are two primary types of consent that Incode requires: * **Privacy Consent**: This is also commonly referred to as User Consent. Collection is required for all customers. * **Machine Learning Consent**: This consent stipulates that Incode has gathered the informed consent necessary to anonymize collected user data for the purpose of improving our machine learning models. ## Collecting Consent There are two primary methods for gathering the necessary consent and submitting it to Incode so that it can be stored with a user's identity. Please see your MSA for additional details. * **Dashboard**: Customers can select the `User Consent` module. * If you have your own custom consent, you can append Incode's privacy consent to your custom consent so that they are collected simultaneously. In the details of the `User Consent` module, input the title and the content of the privacy consent in the appropriate text boxes and save the flow. * **API**: If consent is collected prior to performing an onboarding, the collected consent (which must include the required Incode consent) can be uploaded to a session via the API. To upload a consent object to an onboarding session, see the Add User Consent endpoint. For custom integrations using our SDKs or a completely whitelabeled app that only uses our API, the above consent policies need to be collected and sent to Incode. Most of our SDKs contain built-in modules; however, if an SDK does not have a built-in module, you can collect the consent via a custom screen and use our API to send the consent to Incode. ## Local Laws and Regulations While Incode provides tools to assist with compliance of local laws and regulations, it is the responsibility of every business to seek legal council and ensure that all local, state, and federal laws are upheld. --- - Path: `concepts-and-architecture/workflows` - URL: https://developer.incode.com/concepts-and-architecture/workflows/ - Markdown: https://developer.incode.com/concepts-and-architecture/workflows.md # Flows and Workflows Flows are the legacy method for defining onboarding and authentication experiences in Dashboard. They run modules in a fixed order without conditional logic or branching. We recommend [Workflows](/dashboard-platform-administration/workflows-20/) for all new implementations. [Flows](/dashboard-platform-administration/flows-1/) remain fully supported, but new capabilities are being built on Workflows. *** ## Workflows Workflows allow you to create and customize user journeys, like the one shown below. A drag-and-drop interface where you can configure the order and conditions of the user journey. Workflows offer a more flexible, no-code solution for building verification experiences in Dashboard. Key capabilities include: - **Customizable module ordering**: Specify the sequence for verification steps. - **Conditional branching**: Create dynamic user journeys based on specific criteria, user inputs, or verification results. - **Multi-layered verification**: Combine multiple verification methods to enhanced reliability. - **Dynamic interface**: Manage and visualize the verification journey in a user-friendly interface. Learn how to [configure Workflows in Dashboard](/dashboard-platform-administration/workflows-20/). ### Nodes Individual elements within a Workflow. There are four types of nodes: - **Module nodes**: Represent end-user interaction. Every Module node has a specific set of configuration options. Module nodes usually collect user data. They sometimes require a specific Process node to perform data manipulation and additional checks. User Consent and ID Capture are examples of Module nodes. - **Process nodes**: Non-interactive nodes for data processing. Place a Process node after a relevant Module node. For example, a Face Match Process node would follow a Face Capture and ID Capture Module node. Process nodes have set configuration options. - **Condition nodes**: Branch the user journey based on collected data. You can combine Condition nodes using the logical operators AND and OR to define different steps in the user journey based on the condition result. Each Yes and No branch can contain any type of Workflow node to collect more data, perform additional processing, or end the user journey. Learn more about conditions. - **Result nodes**: Specify the end result of the session. Every Workflow branch must end with a Result node. Session status Result nodes can have one of the following values: `OK`, `FAIL`, `MANUAL`, or `WARN`. ### Templates Incode offers various Workflow templates for specific use cases that represent common business needs. These include: - Standard identity verification - Age verification - Setup verification You can [create a Workflow from a template](/dashboard-platform-administration/workflows-20/#workflow-templates) to quickly launch it to your users. ### Integration Integrating Workflows into your application or website is crucial to using the full capabilities of the Incode Platform. You can integrate using any of the following options, according to your needs: - Direct onboarding URLs - iFrame integration - SDKs for iOS, Android, and hybrid platforms Each option provides a seamless way to incorporate identity verification into your user flow, enhancing user experience and security. Learn more about [integration options](/integrate-by-platform/workflow-integration/).
--- - Path: `dashboard-platform-administration/add-modules` - URL: https://developer.incode.com/dashboard-platform-administration/add-modules/ - Markdown: https://developer.incode.com/dashboard-platform-administration/add-modules.md # Add Modules You must add modules to Workflows and Flows in Dashboard. Some modules are only supported in Workflows or Flows. Some are supported in both. The following table indicates this availability. | Module | Workflows | Flows | | ---------------------------------------------------------------------------------------------------------------------------- | -------------------------- | ------------------------------- | | [Advanced Electronic Signature](/dashboard-platform-administration/advanced-electronic-signature-dashboard-1/) | ✅ | ✅ | | [Antifraud Check](/dashboard-platform-administration/antifraud-check-dashboard/) | ✅ (Process node) | ✅ | | [Certificate Issuance](/dashboard-platform-administration/certificate-issuance-dashboard/) | _In development_ | _In development_ | | [Claims Matching](/dashboard-platform-administration/claims-matching-dashboard/) | ✅ (Process node) | ❌ | | [Cross Check](/dashboard-platform-administration/cross-check-dashboard/) | ✅ (Process node) | ✅ (Setting instead of a module) | | [CURP Validation](/dashboard-platform-administration/curp-validation-dashboard/) | ✅ | ✅ | | [Custom Fields](/dashboard-platform-administration/custom-fields-dashboard/) (Deprecated) | ❌ | ✅ | | [Custom Module](/dashboard-platform-administration/custom-module-dashboard/) | ✅ | ❌ | | [Custom Watchlist](/dashboard-platform-administration/custom-watchlist-dashboard/) | ✅ (Process node) | ✅ | | [Data Sharing Consent](/dashboard-platform-administration/data-sharing-consent-dashboard/) | ✅ | ✅ | | [Document Capture](/dashboard-platform-administration/document-capture-dashboard/) | ✅ | ✅ | | [eKYB](/dashboard-platform-administration/ekyb-dashboard) | ✅ | ✅ | | [eKYC](/dashboard-platform-administration/ekyc-dashboard/) | ✅ | ✅ | | [Electronic Signature](/dashboard-platform-administration/electronic-signature-dashboard/) | ✅ | ✅ | | [Email Input](/dashboard-platform-administration/email-input-dashboard/) | ✅ | ✅ | | [External Decision](/dashboard-platform-administration/external-decision-dashboard/) | ✅ | ❌ | | [Face Authentication](/dashboard-platform-administration/face-authentication-dashboard/) | ✅ | ✅ | | [Face Capture](/dashboard-platform-administration/face-capture-dashboard/) | ✅ | ✅ | | [Face Match](/dashboard-platform-administration/face-match-dashboard/) | ✅ (Process node) | ✅ | | [Face Onboarding](/dashboard-platform-administration/face-onboarding-dashboard/) | ❌ | ✅ | | [Field Comparison](/dashboard-platform-administration/field-comparison-dashboard/) | ❌ | ✅ | | [Fiscal QR OCR](/dashboard-platform-administration/fiscal-qr-ocr-dashboard/) | ❌ | ✅ | | [Forms and Data Entry](/dashboard-platform-administration/forms-and-data-entry-dashboard/) | ✅ | ✅ | | [Geolocation](/dashboard-platform-administration/geolocation-dashboard/) | ✅ | ✅ | | [Government Record Verification](/dashboard-platform-administration/government-record-verification-dashboard/) | ✅ (Process node) | ❌ | | [ID Capture](/dashboard-platform-administration/id-capture-dashboard/) | ✅ | ✅ | | [ID Validation](/dashboard-platform-administration/id-validation-dashboard/) | ✅ (Process node) | ✅ | | [Instant BAV](/dashboard-platform-administration/instant-bav-dashboard/) | ❌ | _In development_ | | [NFC Scan](/dashboard-platform-administration/nfc-scan-dashboard/) | ✅ | ✅ | | [Phone Number Input](/dashboard-platform-administration/phone-number-input-dashboard/) | ✅ | ✅ | | [Proof of Address Capture](/dashboard-platform-administration/proof-of-address-capture-dashboard/) | ✅ | ✅ | | [Qualified Electronic Signature](/dashboard-platform-administration/qualified-electronic-signature-dashboard-1/) | I_n development_ | _In development_ | | [Review OCR Data](/dashboard-platform-administration/review-ocr-data-dashboard/) | ✅ | ❌ | | [Video Conference](/dashboard-platform-administration/video-conference-dashboard/) | ✅ | ✅ | | [Video Selfie](/dashboard-platform-administration/video-selfie-dashboard/) | ✅ | ✅ | | [Watchlist](/dashboard-platform-administration/watchlist-dashboard/) | ✅ (Process node) | ✅ | | [Watchlist Business](/dashboard-platform-administration/watchlist-business-dashboard/) | ✅ | ✅ |
--- - Path: `dashboard-platform-administration/advanced-electronic-signature-dashboard-1` - URL: https://developer.incode.com/dashboard-platform-administration/advanced-electronic-signature-dashboard-1/ - Markdown: https://developer.incode.com/dashboard-platform-administration/advanced-electronic-signature-dashboard-1.md # Advanced Electronic Signature The Advanced Electronic Signature module shows the user documents to sign, collects their consent, and captures a certificate-backed electronic signature. That digital certificate verifies their identity, making the signed document legally binding and compliant. For an overview of this module and how it works, see [Advanced Electronic Signature](/features-and-modules/advanced-electronic-signature/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Advanced Electronic Signature to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Electronic signature - Advanced** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Advanced Electronic Signature to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Electronic signature - Advanced** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. ![Image of the Advanced Electronic Signature module's configuration panel. Has four configuration options.](https://developer.incode.com/assets/b6acedbc3038b14bdb97582984a1a3a8.png) ![Image of the Advanced Electronic Signature module's configuration panel. Has four configuration options.](https://developer.incode.com/assets/fb8367a85fb57e15f4f76818d9688837.png) | Setting | Description | | ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **_Allow user to upload document_** | Allows the user to upload the document they want signed instead of using a document preconfigured in the session. | | **_Allow user to download document_** | Allows the user to download the signed document. | | **_Issue Permanent Certificate_**
_Workflows only_ | Issues a permanent digital certificate for the signing event. | | **_Allow AES without score validation_** | Allows the advanced electronic signature to be completed without requiring a minimum identity verification score. Use this when you want to permit signing regardless of the user's verification result. | | **_Validation to skip_**
_Flows only_ | Lets you disable specific verification requirements before signing is allowed. |
--- - Path: `dashboard-platform-administration/antifraud-check-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/antifraud-check-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/antifraud-check-dashboard.md # Antifraud Check The Antifraud Check module compares the current Session against prior Sessions and known identities to detect signs of fraud. For an overview of this module and how it works, see [Antifraud Check](/features-and-modules/antifraud-check/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Antifraud Check to Workflows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Workflows**. 2. Click **New **or select an existing Workflow. 3. From the **Processes **list, drag and drop the **Antifraud Check** module into the builder. It must come after a module from the Modules list. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Antifraud Check to Flows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Antifraud Check** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options After making changes, click **Save Configurations** to apply them. ![Image of Antifraud Check module configuration panel in Workflows. Has one configuration option.](https://developer.incode.com/assets/a7438dfb85088f1d22262c993430b507.png) ![Image of Antifraud Check module configuration panel in Flows. Has six configuration options.](https://developer.incode.com/assets/81cea8e8b63a7ca07ec4f2c1e1ab3505.png) | Setting | Description | | ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **_Auto execute_**
_Flows only_ | When enabled, the module runs automatically after biometric and document data are collected. | | **_Exclude sessions with the same external customer id_** | When enabled, Sessions that share the same external customer ID are excluded from the fraud comparison. | | **_Send to manual review if the number of sessions in which the total score failed is greater than_**
_Flows only_ | When enabled, sends the Session to manual review if the count of Sessions where the total fraud score failed exceeds the specified threshold. Default: _3_. | | **_Antifraud fails if the number of sessions in which total score failed is greater than_**
_Flows only_ | When enabled, causes the Antifraud Check to fail if the count of Sessions where the total fraud score failed exceeds the specified threshold. Default: _4_. | | **_Antifraud fails if the number of attempts is greater than_**
_Flows only_ | When enabled, causes the Antifraud Check to fail if the total number of attempts exceeds the specified threshold. Default: _4_. | | **_Send to manual review if the number of attempts is greater than_**
_Flows only_ | When enabled, sends the Session to manual review if the total number of attempts exceeds the specified threshold. Default: _3_. |
--- - Path: `dashboard-platform-administration/certificate-issuance-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/certificate-issuance-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/certificate-issuance-dashboard.md # Certificate Issuance The Certificate Issuance module issues a digital certificate tied to a verified identity, supporting legally binding and compliant document signing. For an overview of this module and how it works, see [Certificate Issuance](/features-and-modules/certificate-issuance/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Certificate Issuance to Workflows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Certificate Issuance** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Certificate Issuance to Flows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Certificate Issuance** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options After making changes, click **Save Configurations** to apply them. ![Image of Certificate Issuance module configuration in Workflows. Has two configuration options..](https://developer.incode.com/assets/ef096f1f93b0acc18d4bb596e12497bb.png) | Setting | Description | |---|---| | **_Region_** | The region in which the certificate is issued. Select the region that corresponds to the applicable regulatory framework for your use case: for example, _EU_. Contact your Incode Representative to enable this option for your organization. | | **_Type of Certificate for Signature_** | The certificate validity type used for document signing: _One Time_ (10 minutes; best for single-document, single-signature scenarios), _Short Term_ (30 minutes to 24 hours; best for multiple transactions or documents within the same Session), or _Long Term_ (10 days to 2 years in Mexico, and up to 3 years in the EU; best for ongoing use). | --- - Path: `dashboard-platform-administration/check-system-status` - URL: https://developer.incode.com/dashboard-platform-administration/check-system-status/ - Markdown: https://developer.incode.com/dashboard-platform-administration/check-system-status.md # Check System Status The **Status** link in the left menu in Dashboard opens status.incode.com in a new tab. Use this site to: - **Check system health:** See if all services are working normally. - **View uptime history:** See uptime for each service over the past 90 days. - **Track incidents:** See past and current incidents, with updates on each one. - **Subscribe to updates:** Get notified when an incident starts, changes, or ends. If you have a problem, check this page first to see if it's known issue. If the problem is not shown, it may be something specific to your account. ## Subscribe to Updates Click **Subscribe to Updates** at the top of the page. Choose how you want to be notified: - **Email:** Enter your email address. Verify it with a code. - **Phone (SMS):** Select your country code. Enter your phone number. Verify it with a code. - **Slack:** Connect your Slack workspace. - **Webhook:** Enter a webhook URL and your email address. Incode will email you if the webhook fails. - **RSS/Atom feed:** Use the Atom feed or RSS feed.
--- - Path: `dashboard-platform-administration/claims-matching-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/claims-matching-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/claims-matching-dashboard.md # Claims Matching The Claims Matching module verifies an employee's identity by comparing data from their Session against trusted reference data from one or more connected directories. Sessions that fail are routed to manual evaluation. For an overview of this module and how it works, see [Claims Matching](/features-and-modules/claims-matching/). ## Supported with: :white_check_mark: Workflows | :x: Flows ## Add Claims Matching to Workflows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the **Processes** list, drag and drop the **Claims Matching** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options After making changes on any tab, click **Save Configurations** to apply them. | Setting | Description | |---|---| | **_Policy ID_** | Controls how the claims matching policy is applied to this project: _Editable_ (policy ID field can be set or changed in Dashboard to reference an external claims policy), _Enabled_ (policy is active and available), _Disabled_ (policy is shown but locked and cannot be changed), or _Hidden_ (policy option is not displayed in the configuration UI). Contact your Incode Representative to enable this option for your organization. |
--- - Path: `dashboard-platform-administration/configuration` - URL: https://developer.incode.com/dashboard-platform-administration/configuration/ - Markdown: https://developer.incode.com/dashboard-platform-administration/configuration.md # Configure Settings On the Configuration page, you can establish your organization settings as well as view and manage the components that make up your Incode Platform. In the tabs on this page, you can: - Configure [general](/dashboard-platform-administration/configuration-general-tab/) settings that affect your Incode Platform - View, create, and manage [authorizations](/dashboard-platform-administration/configuration-authorization-tab/), [webhooks](/dashboard-platform-administration/configuration-webhooks-tab/), [API keys](/dashboard-platform-administration/configuration-api-keys-tab/), [integrations](/dashboard-platform-administration/configuration-integration-tab/), and [consents](/dashboard-platform-administration/configuration-consents-tab/) - Customize the [look and feel](/dashboard-platform-administration/configuration-customization-tab/) of the Incode-hosted web onboarding experience To access these settings, click **Configuration** in the left menu in Dashboard. --- - Path: `dashboard-platform-administration/configuration-api-keys-tab` - URL: https://developer.incode.com/dashboard-platform-administration/configuration-api-keys-tab/ - Markdown: https://developer.incode.com/dashboard-platform-administration/configuration-api-keys-tab.md # Configuration: API Keys Tab Your API key authenticates your integration with Incode's APIs and is associated with your account. This tab shows a table with information about the API keys used in your Incode implementation. You cannot change any of the information, but you can: - Generate new keys - Copy existing keys - Revoke existing keys | Field | Description | | --- | --- | | Name | The name Incode assigned to the API key. If the key is active, a green dot appears. If the key has been revoked, a gray dot appears. | | Client ID | The unique ID of the client the API key belongs to. | | API Key | The API key value. | | Last Updated | This field updates only when a key is revoked. If the key is still active, the field shows the same value as ***Time Created***. | | Time Created | The date and time the key was originally created. | *** ## Generate a New API Key 1. In the left menu, click **Configuration**. 2. Click the **API Keys** tab. 3. Click **Generate New API Key** in the lower right corner of the page. A notification appears to confirm the API key is being generated. After it's generated, the new key appears at the top of the API keys table. *** ## Copy an Existing API Key 1. In the left menu, click **Configuration**. 2. Click the **API Keys** tab. 3. Find the key you want to copy and click **Copy** in the **_API Key_** column for that key. *** ## Revoke an Existing API Key > ⚠️ Warning > > This action cannot be undone. 1. In the left menu, click **Configuration**. 2. Click the **API Keys** tab. 3. Find the key you want to revoke and click **Revoke** in the **_Name_** column for that key. *** ## API Key Security Treat your API key like any other credential. Store it securely and keep it server-side instead of client-side or in front-end code. Avoid sharing it in tickets, emails, images, or public repositories. If a key may have been exposed, generate a new key and [revoke the affected one](#revoke-an-existing-api-key). --- - Path: `dashboard-platform-administration/configuration-authorization-tab` - URL: https://developer.incode.com/dashboard-platform-administration/configuration-authorization-tab/ - Markdown: https://developer.incode.com/dashboard-platform-administration/configuration-authorization-tab.md # Configuration: Authorization Tab This tab supports organizations that use OpenID Connect (OIDC) authorization protocols with the Incode Platform. You can view information about your existing OIDC authorization protocols from this tab. | field | Description | | --- | --- | | Name | Shows the protocol name. | | Client ID | Displays the client identifier (ID) generated by Incode. | | Auth Methods | Displays one or more of these values based on the selections made when the protocol was generated: client secret basic, client secret post, client secret jwt, private key jwt, or none | | Auth Grant Types | Displays one or more of these values based on the selections made when the protocol was generated: authorization code, refresh token, client credentials | | Authentication Type | Displays one or more of these values based on the selections made when the protocol was generated: Face authentication, Onboarding, IncodeID, or Okta | | Login Hint Type | Contains one of these values depending on the selections made when the protocol was generated: None, Unique ID, Phone, Email, or National Number | | Login Attempt Limit | Displays the number of times a user can attempt to log in. The default and minimum value is *1* and the maximum value is *10* . | | Redirect URIs | Shows one or more URIs users are redirected to for OIDC authentication. | | Post Redirect URIs | Shows one or more URIs users are redirected to after their OIDC authentication is complete. | | Scopes | Displays one or more of the scopes for which this protocol is used, based on the selections made when the protocol was generated.: openid, profile, email, address, selfie, selfie_attestation, fr_attestation, id_attestation, incode_id, roles, or scoring_results | | Settings | Displays one or more settings for this protocol, based on the selections made when the protocol was generated: require-authorization-consent or require-proof-key | | Authentication Signing Algorithm | Contains one of these values depending on the selection made when the protocol was generated: HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384, or PS512 | | JWK Set URL | Shows the URL for a JWK set. | | Actions | Provides icons so you can **Edit** or **Delete** the protocol. | On the Authorization tab, you can also: - Generate new authorization protocols - Edit existing protocols - Delete existing protocols *** ## Generate New Authorization Protocol | field | Description | | --- | --- | | ConfigurationName | Allows you to enter the protocol name. | | Issuer URL | Displays a URL generated by Incode. You cannot edit this field, but you can copy the URL shown. | | Authorize URL | Displays a URL generated by Incode. You cannot edit this field, but you can copy the URL shown. | | Token URL | Displays a URL generated by Incode. You cannot edit this field, but you can copy the URL shown. | | Client ID | Displays the client identifier (ID) generated by Incode. You cannot edit this field, but you can copy the ID. | | Client Secret | Displays a secure secret generated by Incode. You cannot edit this secret, but you can copy the secret shown. You can also click **Generate** to create an entirely new secret. | | Authentication Type | Drop-down of authentication types that can be supported with an OIDC protocol. Selections in this field may dynamically add fields when you are generating a new protocol: **Face authentication** adds ***Login Hint Type***, ***Enable Sign Up Flow***, and ***Login Attempt Limit***. Selecting ***Enable Sign Up Flow*** dynamically adds ***Flow Type***, which then adds ***Flow*** or ***Workflow***. **Onboarding** adds ***Flow Type***, which then adds ***Flow*** or ***Workflow***; ***Okta Issue URL***; and ***Okta API Token***. **IncodeID** does not add any fields. **Okta** adds ***Registration ID***. | | Login Hint | Drop-down of the following login hint values supported with an OIDC protocol: **None**, **Unique ID**, **Phone**, **Email**, or **National Number**. | | Enable Sign Up Flow | Appears only when ***Authentication Type*** is set to *Face Authentication*. When selected, the ***Flow Type*** field displays. | | Login Attempt Limit | Appears only when ***Authentication Type*** is set to *Face Authentication*. It lets you specify the number of times a user can attempt to log in. The default and minimum value is *1* and the maximum value is *10*. | | Flow Type | Allows you to select whether you want to use a Flow or a Workflow for this protocol. This field appears only when one of the following is met: ***Authentication Type*** is set to *Face Authentication*, ***Enable Signup Flow*** is selected, and ***Flow Type*** is set to *Workflow*. ***Authentication Type*** is set to *Onboarding*. | | Flow | Allows you to select from a drop-down of your existing Flows. This field appears only when one of the following is met: ***Authentication Type*** is set to *Face Authentication*, ***Enable Sign Up Flow*** is selected, and ***Flow Type*** is set to *Flow*. ***Authentication Type*** is set to *Onboarding* and ***Flow Type*** is set to *Flow*. | | Workflow | Allows you to select from a drop-down of your existing Workflows. This field appears only when one of the following is met: ***Authentication Type*** is set to *Face Authentication*, ***Enable Sign Up Flow*** is selected, and ***Flow Type*** is set to *Workflow*. ***Authentication Type*** is set to *Onboarding* and ***Flow Type*** is set to *Workflow*. | | Okta Issue URL | Appears only when ***Authentication Type*** is set to *Onboarding*. | | Okta API Token | Appears only when ***Authentication Type*** is set to *Onboarding*. | | Registration ID | Appears only when ***Authentication Type*** is set to *Okta*. | | Redirect URIs | Allows you to enter one or more URIs to which users are redirected for OIDC authentication. | | Post Logout Redirect URIs | Allows you to enter one or more URIs to which users are redirected after their OIDC authentication is complete. | | Client Authentication Methods | Allows you to select or clear one or more of the following values when you create or edit a protocol: **client_secret_basic**, **client_secret_post**, **client_secret_jwt**, **private_key_jwt**, or **none**. | | Authorization Grant Types | Allows you to select or clear one or more of the following values when you create or edit a protocol: **authorization_code** (this type is selected by default and cannot be cleared), **refresh_token**, or **client_credentials**. | | Scopes | Allows you to define one or more of these supported scopes for which this protocol will be used: **openid** (this scope is selected by default and cannot be cleared), **profile**, **email**, **address**, **phone**, **selfie**, **selfie_attestation**, **fr_attestation**, **id_attestation**, **incode_id**, **roles**, and **scoring_results**. | | Settings | Allows you to define one or more of these settings for this protocol: **require-authorization-consent** and **require-proof-key**. | | Token Endpoint Authentication Signing Algorithm | Drop-down of the following supported signing algorithms: **HS256**, **HS384**, **HS512**, **RS256**, **RS384**, **RS512**, **ES256**, **ES384**, **ES512**, **PS256**, **PS384**, and **PS512**. | | JWK Set URL | Allows you to enter the URL for a JWK set. | | Authorize Generated URL | Displays a URL generated by Incode. You cannot edit this field, but you can copy the URL shown. | 1. In the left menu, click **Configuration**. 2. Click the **Authorization** tab. 3. Click **Generate New** in the lower right corner to open the Client Configuration dialog. 4. Enter a **_Configuration Name_**. 5. Select an **_Authentication Type_** from the drop-down of supported types. Your selection may cause additional fields to appear in the dialog. Refer to the table in the drop-down above for descriptions of these fields. 6. Enter one or more valid **_Redirect URIs_**. 7. Enter one or more valid **_Post Logout Redirect URIs_** if applicable. 8. Select the checkboxes for any **_Client Authentication Methods_** this protocol will support. 9. Select the checkboxes for any **_Authorization Grant Types_** this protocol will support. 10. Select the checkboxes for the **_Scopes_** this protocol will support. 11. Select the checkboxes for the **_Settings_** this protocol will support. 12. Use the drop-down to select a supported **_Token Endpoint Authentication Signing Algorithm_** if applicable. 13. Enter a valid **_JWK Set URL_** if applicable. 14. When you are finished with your configuration, click **Save**. *** ## Edit Existing Authorization Protocol | field | Description | | --- | --- | | ConfigurationName | Allows you to enter the protocol name. | | Issuer URL | Displays a URL generated by Incode. You cannot edit this field, but you can copy the URL shown. | | Authorize URL | Displays a URL generated by Incode. You cannot edit this field, but you can copy the URL shown. | | Token URL | Displays a URL generated by Incode. You cannot edit this field, but you can copy the URL shown. | | Client ID | Displays the client identifier (ID) generated by Incode. You cannot edit this field, but you can copy the ID. | | Client Secret | Displays a secure secret generated by Incode. You cannot edit this secret, but you can copy the secret shown. You can also click **Generate** to create an entirely new secret. | | Authentication Type | Drop-down of authentication types that can be supported with an OIDC protocol. Selections in this field may dynamically add fields when you are generating a new protocol: **Face authentication** adds ***Login Hint Type***, ***Enable Sign Up Flow***, and ***Login Attempt Limit***. Selecting ***Enable Sign Up Flow*** dynamically adds ***Flow Type***, which then adds ***Flow*** or ***Workflow***. **Onboarding** adds ***Flow Type***, which then adds ***Flow*** or ***Workflow***; ***Okta Issue URL***; and ***Okta API Token***. **IncodeID** does not add any fields. **Okta** adds ***Registration ID***. | | Login Hint | Drop-down of the following login hint values supported with an OIDC protocol: **None**, **Unique ID**, **Phone**, **Email**, or **National Number**. | | Enable Sign Up Flow | Appears only when ***Authentication Type*** is set to *Face Authentication*. When selected, the ***Flow Type*** field displays. | | Login Attempt Limit | Appears only when ***Authentication Type*** is set to *Face Authentication*. It lets you specify the number of times a user can attempt to log in. The default and minimum value is *1* and the maximum value is *10*. | | Flow Type | Allows you to select whether you want to use a Flow or a Workflow for this protocol. This field appears only when one of the following is met: ***Authentication Type*** is set to *Face Authentication*, ***Enable Signup Flow*** is selected, and ***Flow Type*** is set to *Workflow*. ***Authentication Type*** is set to *Onboarding*. | | Flow | Allows you to select from a drop-down of your existing Flows. This field appears only when one of the following is met: ***Authentication Type*** is set to *Face Authentication*, ***Enable Sign Up Flow*** is selected, and ***Flow Type*** is set to *Flow*. ***Authentication Type*** is set to *Onboarding* and ***Flow Type*** is set to *Flow*. | | Workflow | Allows you to select from a drop-down of your existing Workflows. This field appears only when one of the following is met: ***Authentication Type*** is set to *Face Authentication*, ***Enable Sign Up Flow*** is selected, and ***Flow Type*** is set to *Workflow*. ***Authentication Type*** is set to *Onboarding* and ***Flow Type*** is set to *Workflow*. | | Okta Issue URL | Appears only when ***Authentication Type*** is set to *Onboarding*. | | Okta API Token | Appears only when ***Authentication Type*** is set to *Onboarding*. | | Registration ID | Appears only when ***Authentication Type*** is set to *Okta*. | | Redirect URIs | Allows you to enter one or more URIs to which users are redirected for OIDC authentication. | | Post Logout Redirect URIs | Allows you to enter one or more URIs to which users are redirected after their OIDC authentication is complete. | | Client Authentication Methods | Allows you to select or clear one or more of the following values when you create or edit a protocol: **client_secret_basic**, **client_secret_post**, **client_secret_jwt**, **private_key_jwt**, or **none**. | | Authorization Grant Types | Allows you to select or clear one or more of the following values when you create or edit a protocol: **authorization_code** (this type is selected by default and cannot be cleared), **refresh_token**, or **client_credentials**. | | Scopes | Allows you to define one or more of these supported scopes for which this protocol will be used: **openid** (this scope is selected by default and cannot be cleared), **profile**, **email**, **address**, **phone**, **selfie**, **selfie_attestation**, **fr_attestation**, **id_attestation**, **incode_id**, **roles**, and **scoring_results**. | | Settings | Allows you to define one or more of these settings for this protocol: **require-authorization-consent** and **require-proof-key**. | | Token Endpoint Authentication Signing Algorithm | Drop-down of the following supported signing algorithms: **HS256**, **HS384**, **HS512**, **RS256**, **RS384**, **RS512**, **ES256**, **ES384**, **ES512**, **PS256**, **PS384**, and **PS512**. | | JWK Set URL | Allows you to enter the URL for a JWK set. | | Authorize Generated URL | Displays a URL generated by Incode. You cannot edit this field, but you can copy the URL shown. | 1. In the left menu, click **Configuration**. 2. Click the **Authorization** tab. 3. In the OIDC Authorization table, locate the protocol you want, scroll to the Actions column on the far right, and click **Edit**. 4. Edit the fields and settings as needed. 5. When you are finished with your changes, click **Save**. *** ## Delete Existing Authorization Protocol 1. In the left menu, click **Configuration**. 2. Click the **Authorization** tab. 3. In the OIDC Authorization table, locate the protocol you want, scroll to the Actions column on the far right, and click **Delete**. 4. In the confirmation dialog, click **Confirm**.
--- - Path: `dashboard-platform-administration/configuration-consents-tab` - URL: https://developer.incode.com/dashboard-platform-administration/configuration-consents-tab/ - Markdown: https://developer.incode.com/dashboard-platform-administration/configuration-consents-tab.md # Configuration: Consents Tab This tab shows information about all the consents in your system. Consents obtain the user's permission to collect and process their data. Incode includes a default consent, but you can create and customize additional consents to fit regulatory requirements. On the Consents tab, you can: - Add new consents - Edit existing consents - Delete existing consents ![Consents table with Name, Created On, Updated On, Consent ID, and Actions columns. Each row has edit and delete icons.](https://developer.incode.com/assets/16c504cd81ba036da23dcb8e07938b10.png) The following table describes the fields in the Consents table. | Field | Description | | ---------- | ----------------------------------------------------- | | Name | Consent name defined when it was created. | | Created On | Date and time the consent was created. | | Updated On | Date and time the consent was last updated. | | Consent ID | Unique identifier for the consent. | | Actions | Provides icons to **Edit** or **Delete** the consent. | *** ## Add a New Consent 1. In the left menu, click **Configuration**. 2. Click the **Consents** tab. 3. Click **Add New Consent**. 4. Enter a name for the consent in **User Consent**, then click **Add New Consent**. 5. Select a **Language** for the consent from the drop-down. 6. Enter a **Title** and the text **Content**. Use HTML or Markdown to format the text. Use the live preview at the top to check the final output. - **Hyperlinks**: `[DISPLAY_TEXT](https://your.link.com)` - **Emphasis**: `` for strong importance or bold text, and `` for emphasized or italic text. - **Headings**: `

`, `

`, `

` for heading levels, with `

` being the largest. - **Paragraphs**: `

` defines a paragraph. - **Line Breaks**: `
` inserts a line break. - **Horizontal Rule**: `


` represents a horizontal line. - **Lists**: `
    ` for unordered (bullet) lists, `
      ` for ordered (numbered) lists, and `
    1. ` for list items in both. - **Markdown Shortcuts**: - `*` for bullet points - `*text*` for italic text - `**text**` for bold text - `#`, `##`, `###` for headings 7. Under **Checkboxes**, enter the text you want to display next to the first checkbox. Select **Make Optional** to allow users to continue without selecting the checkbox. You can **Delete** the checkbox. 8. Click **Add Checkbox** to add another checkbox. All checkboxes you add display above the mandatory data and privacy consent provided by Incode. 9. Click **Save New Consent Language**. 10. Use the **Default Consent** drop-down to select which configured language for the consent should be the default. 11. Click **Add Language** depending on your needs. Repeat steps 5–9 for each new language you add. 12. Click **Save Settings**. An example consent with a Title, Content, and Checkboxes configured. *** ## Edit an Existing Consent 1. In the left menu, click **Configuration**. 2. Click the **Consents** tab. 3. In the Actions column for the consent you want to edit, click **Edit**. 4. To change the name of the consent, enter a new value in **Consent Name**. Consent editing screen with Consent Metadata fields, Save settings button, and Languages section with Add language option. 5. To change the default language of the consent, select a new language from the **Default Consent** drop-down. 6. To add a new language to the list of available languages for this consent: 1. Click **Add Language**. 2. Select a **Language** from the drop-down. 3. Enter a **Title** and the text **Content**. Use HTML or Markdown to format the text. Use the live preview at the top to check the final output. - **Hyperlinks**: `[DISPLAY_TEXT](https://your.link.com)` - **Emphasis**: `` for strong importance or bold text, and `` for emphasized or italic text. - **Headings**: `

      `, `

      `, `

      ` for heading levels, with `

      ` being the largest. - **Paragraphs**: `

      ` defines a paragraph. - **Line Breaks**: `
      ` inserts a line break. - **Horizontal Rule**: `


      ` represents a horizontal line. - **Lists**: `
        ` for unordered (bullet) lists, `
          ` for ordered (numbered) lists, and `
        1. ` for list items in both. - **Markdown Shortcuts**: - `*` for bullet points - `*text*` for italic text - `**text**` for bold text - `#`, `##`, `###` for headings 4. Under **Checkboxes**, enter the text you want to display next to the first checkbox. Select **Make Optional** to allow users to continue without selecting the checkbox. You can **Delete** the checkbox. 5. Click **Add Checkbox** to add another checkbox. All checkboxes you add display above the mandatory data and privacy consent provided by Incode. 6. Click **Save New Consent Language**, then click the **\<** icon in the upper left corner of the Edit pane. 7. Click **Save Settings**. *** ## Delete Existing Consent :::danger Deleting a consent permanently deletes all associated language consents. ::: 1. In the left menu, click **Configuration**. 2. Click the **Consents** tab. 3. In the Actions column for the consent you want to delete, click **Delete**. 4. In the confirmation dialog, click **Delete**.
          --- - Path: `dashboard-platform-administration/configuration-customization-tab` - URL: https://developer.incode.com/dashboard-platform-administration/configuration-customization-tab/ - Markdown: https://developer.incode.com/dashboard-platform-administration/configuration-customization-tab.md # Configuration: Customization Tab Use this tab to customize the look and feel of your verification Flow or Workflow, the finish screen content, and your organization's email template. *** ## Configure the User Interface This section controls the visual appearance of the screens in your verification Flow or Workflow. ![Configuration page, Customization tab, User interface section. Settings include Logo and Subtitle, Button, and CSS. A phone mockup shows a preview.](https://developer.incode.com/assets/7e8bdcf69376daab5add8fa3f9c7588b.png) 1. In the left menu, click **Configuration**. 2. Click the **Customization** tab. 3. Under Logo and Subtitle, upload a logo. 1. Click the **Logo** upload area. 2. Select a JPEG, PNG, or SVG file. 3. Enter a **Subtitle** to appear under the logo. 4. Under Button, drag the **Corner Radius** slider to set the button's corner roundness. The value is shown in pixels. 5. Click the color swatch next to **Button Color** to set the button background color. Enter a hex value or use the color picker. 6. Click the color swatch next to **Button Color Text** to set the button label color. Enter a hex value or use the color picker. 7. Under CSS, select one of the following: - **Don't Include**: Uses default styles. - **CSS Format Supported**: Upload a CSS file to apply custom styles. 8. To hide the Incode branding in the footer of your Flow and Workflow screens, select **Hide Footer Branding**. 9. Click **Update UI**. To reset your changes, click **Reset to Incode Defaults**. *** ## Configure Finish Screen Content This section controls what customers see when they complete a verification Flow or Workflow. ![Content section of the Customization tab with fields for Finish Screen and SMS Content, and an Update content button.](https://developer.incode.com/assets/05288345253f5ac27f0251184b6db5ba.png) 1. In the left menu, click **Configuration**. 2. Click the **Customization** tab. 3. Scroll to the Content section. 4. Under Finish Screen Content, enter a **Headline**. This is the title shown on the finish screen. For example, _Thank you_. 5. Enter **Body Text**. This is the message shown below the headline on the finish screen. For example, _Your verification has been completed_. 6. Under Start Onboarding SMS Content, enter **SMS Text**. This is the message sent to the user when their onboarding session starts. 7. Click **Update Content**. *** ## Configure the Email Template This section controls the signature of emails sent from your organization. 1. In the left menu, click **Configuration**. 2. Click the **Customization** tab. 3. Scroll to the Email Template section. 4. Upload a logo: 1. Click the **Logo** upload area. 2. Select a JPEG, PNG, or SVG file. A preview of the logo appears on the left under **Preview**. 5. Enter a **Display Name**. This is the sender name shown in emails from your organization. 6. Click **Update Email Template**.
          --- - Path: `dashboard-platform-administration/configuration-general-tab` - URL: https://developer.incode.com/dashboard-platform-administration/configuration-general-tab/ - Markdown: https://developer.incode.com/dashboard-platform-administration/configuration-general-tab.md # Configuration: General Tab The General tab in Configuration lets you establish Dashboard and organization settings. This tab displays by default when you click Configuration. On the General tab, you can: - Configure Dashboard settings - Configure Authentications settings - Configure SSO redirect URL - Manage custom fields - Manage Proof of Address (POA) fields - Configure manual review options - Manage custom event types *** ## Configure Dashboard Settings You can configure one or all of the Dashboard settings described in this task. ![General tab of the Configuration page with Timezone, Onboarding, Token Expiration, Session Timeout, and CSV Export settings.](https://developer.incode.com/assets/f4a50f481122fc4bef8ef96d553ede30.png) | Setting | Description | | --- | --- | | Select Timezone | Sets the time zone for your organization's Incode implementation. | | Executive Viewing Limits | Sets how long a user with the [Executive role](/dashboard-platform-administration/roles-permissions/#executive) can view Session data. When a Session's age is greater than the number of hours, it is no longer available to that user. | | Onboarding Link Duration | Sets the length of time in minutes for which an onboarding link is valid and available to the customer. The maximum value is 24 hours (1,440 minutes). | | Onboarding Screen Capture Settings | ***Enable external analytics*** and ***Enable external screenshots***. | | CSV Export | Lets you specify whether exported CSV files are sent to an email address or downloaded to the location configured in the user's browser (this is the default). | | Token Expiration Configuration | ***Token Validity Duration*** and ***Time Unit*** work together to determine the length of time a token is valid before expiring. Enter a number for ***Token Validity Duration***, then use the ***Time Unit*** drop-down to select *Minutes*, *Hours*, *Days*, or *Months*. | | Session Timeout Duration | Allows you to configure a period of time after which all Dashboard sessions are automatically logged out. The minimum value in minutes is *10* and the maximum is *30* . | 1. In the left menu, click **Configuration**. 2. Under Timezone, use the drop-down to **_Select timezone_**. 3. Under Executive Viewing Limits, enter a numeric value or use the increase/decrease icons to set the **_Session visibility limit in hours_**. 4. Under Onboarding Link Duration, enter a numeric value or use the increase/decrease icons to set the **_TTL duration in minutes_**. 5. Under Onboarding Screencapture Settings, select the checkbox to **_Enable external analytics_**, **_Enable external screenshots_**, or both. 6. Select the checkbox for **_CSV Export_** if you want exports to be delivered by email. 7. Under Token Expiration Configuration, enter a numeric value in **_Token Validity Duration_** and select a **_Time Unit_** from the drop-down. You must configure both settings. 8. Enter a numeric value for **_Session Timeout Duration_** to specify when sessions automatically log out after inactivity. 9. If you are finished making changes, scroll to the bottom of the page and click **Update Organization**. *** ## Configure Authentications Settings If you're not using Incode for Authentications, you don't need to configure these settings. ![Authentication section of the General tab with an Auth Redirect URL field and checkboxes for blocklist and recording settings.](https://developer.incode.com/assets/b4fe8b4f2001546a7d5753fe105a8df5.png) | Setting | Description | | --- | --- | | Auth Redirect URL | Sets a global URL Authentications are redirected to if you are not using the Incode default. You can also choose to enable one or both of these settings: - ***Check if user is blocklisted during authentication*** - ***Enable authentication recording*** | | Check if user is blocklisted during authentication | | | Enable authentication recording | | 1. In the left menu, click **Configuration**. 2. Under Authentication, enter a URL for **_Auth Redirect URL_**. 3. Select the first checkbox if you want to **_Check if user is blocklisted during authentication_**. 4. Select the second checkbox if you want to **_Enable authentication recording_**. 5. If you are finished making changes, scroll to the bottom of the page and click **Update Organization**. *** ## Configure SSO Redirect URL If single sign-on (SSO) is not enabled for your Dashboard users, you don't need to configure this setting. ![The SSO section of the General tab, showing an optional Redirect URL text area.](https://developer.incode.com/assets/27cb028b780cba40fb837adf550162ce.png) 1. In the left menu, click **Configuration**. 2. Under SSO, enter a valid **_Redirect URL_** for your SSO page. 3. If you are finished making changes, scroll to the bottom of the page and click **Update Organization**. *** ## Manage Custom Fields If you're incorporating custom fields into your Incode Onboarding sessions, you must configure them here. The [Custom Fields](/features-and-modules/custom-fields/) module is only available for Flows. ![Custom Fields section of the General tab with three fields showing Name, Type, and Format inputs and a delete icon per row.](https://developer.incode.com/assets/de54a4e0aec281e4a9b41b459e9c5f17.png) | Setting | Description | | --- | --- | | Custom Field Name | The name of the field as you want it to appear to customers. | | Custom Field Type | You can choose from these types of custom fields: Integer (the field accepts only whole numbers), Double (the field accepts decimal numbers), String (the field accepts alphanumeric values exactly as they are entered), Boolean (the field accepts only yes or no values), and Date (the field accepts dates in the ***Custom Field Format*** you specify). | | Custom Field Format | This field is enabled only if you select *date* for ***Custom Field Type***.You can choose from these formats for your custom date fields: - yyyy-mm-dd - dd/mm/yyyy - dd.mm.yyyy - mm/dd/yyyy - yyyy.mm.dd - Unix_timestamp_ms - Unix_timestamp_s The first five options use common references to year, month, and date. The last two options use a standard [Unix timestamp](https://www.unixtimestamp.com/). | 1. In the left menu, click **Configuration**. 2. Under Custom Fields, click the plus sign (+) to create a new custom field. 3. Enter a **_Custom Field Name_**. 4. Select a **_Custom Field Type_** from the drop-down. 5. If you selected _date_, select a **_Custom Field Format_** from the drop-down. Otherwise, this field is unavailable. 6. If you are finished making changes, scroll to the bottom of the page and click **Update Organization**. *** ## Manage POA fields This section applies and is mandatory only if your onboarding Flow or Workflow captures power of attorney (POA) documents and extracts information from them using optical character recognition (OCR). ![Mandatory POA Fields Configuration section of the General tab with an Add POA Fields dropdown, delete icon, and add button.](https://developer.incode.com/assets/f8695f1457e9f281d85b9a442761bd76.png) 1. In the left menu, click **Configuration**. 2. Under Mandatory POA Fields Configuration, click the plus sign (+) to create a new POA field. 3. Select a field from the **_Add POA Fields_** drop-down. 4. If you are finished making changes, scroll to the bottom of the page and click **Update Organization**. *** ## Configure Manual Review Options This section lets you configure settings that apply when an onboarding session requires manual review. You can also populate a list of reasons for onboarding rejection, approval, or both. ![Manual Review Options on the General tab with two checkboxes and a Reject/Approve reason field with delete and add buttons.](https://developer.incode.com/assets/b4ac612d16d518f8d58a8014ddaf506a.png) 1. In the left menu, click **Configuration**. 2. Under Manual Review Options Configuration, select the checkbox if you want to **_Allow custom reasons only_**. 3. Select the checkbox if you want to **_Automatically create Identity after manual approval_**. 4. If you want to **_Add Reason for Reject/Approve_**: 1. Click the plus sign (+). 2. Enter a value in the text box. 3. If you are finished making changes, scroll to the bottom of the page and click **Update Organization**. *** ## Manage Custom Event Types ![Event Type Configuration section of the General tab with a Custom Event Type text field, delete icon, and add button.](https://developer.incode.com/assets/101c101cfb5edbf263525ac5c28816b6.png) | Setting | Description | | --- | --- | | Add Custom Event Type | | 1. In the left menu, click **Configuration**. 2. Under Event Type Configuration, click the plus sign (+). 3. Enter a name in **_Add Custom Event Type_**. 4. If you are finished making changes, click **Update Organization**.
          --- - Path: `dashboard-platform-administration/configuration-integration-tab` - URL: https://developer.incode.com/dashboard-platform-administration/configuration-integration-tab/ - Markdown: https://developer.incode.com/dashboard-platform-administration/configuration-integration-tab.md # Configuration: Integration Tab This tab shows a table of organizations and their IDs. Click the arrow in the first column to sort by organization name. You can add new organizations to the table. *** ## Add a New Organization 1. In the left menu, click **Configuration**. 2. Click the **Integration** tab. 3. Scroll down to the Add New Organization section. 4. Enter the **_Organization Name_**. 5. In the **_Organization Type_** drop-down, select _Default_ or _Integrator_. 6. In the **_Access Type_** drop-down, select _Limited_ or _Open_. 7. Click **Add Organization**.
          --- - Path: `dashboard-platform-administration/configuration-webhooks-tab` - URL: https://developer.incode.com/dashboard-platform-administration/configuration-webhooks-tab/ - Markdown: https://developer.incode.com/dashboard-platform-administration/configuration-webhooks-tab.md # Configuration: Webhooks Tab This tab shows information about your configured webhooks. On the Webhooks tab, you can also: - Configure general webhook settings - Configure new webhooks - Edit existing webhook configurations - Delete existing webhook configurations *** ## Understand Webhooks Webhooks are event notifications. They let your application know when a specific event happens on the Incode Platform or when a process initiated by a user is completed, also known as a callback. Your application can then take action based on the notification. Webhooks are asynchronous; communication flows only from the Incode Platform to your application. You must configure them before you can use them. The following webhooks are currently available: - **Onboarding status webhook**: Triggered every time an Onboarding Session status changes. [Learn more](/general-reference/onboarding-status-webhook/). - **Videoselfie uploaded webhook**: Triggered when the video selfie recording file becomes available. [Learn more](/general-reference/video-selfie-webhook/). - **Third party async retries webhook**: - **Watchlist updated webhook**: Triggered when a global watchlist result is updated. [Learn more](/general-reference/global-watchlists-webhook/). - **Work history callback**: Triggered after a work history search for a user is processed. This webhook is for Mexico only. [Learn more](/general-reference/work-history-webhook/). - **Proof of payment callback**: Triggered after payment proof validation for a user is processed. This webhook is for Mexico only. [Learn more](/general-reference/payment-proof-webhook/). - **Face Authentication**: Triggered when face authentication succeeds or fails. Learn more. - **Session Started**: Triggered when any session from a Flow or Workflow starts. [Learn more](/general-reference/session-webhooks/). - **Session Failed**: Triggered when any session from a Flow or Workflow fails. Learn more. - **Session Succeeded**: Triggered when any session from a Flow or Workflow succeeds. [Learn more](/general-reference/session-webhooks/). - **Session Pending Review: **Triggered when any session from a Flow or Workflow requires manual review. [Learn more](/general-reference/session-webhooks/). The following webhooks are deprecated: - **INE scraping webhook:** Provided INE scraping results. - **Authentication webhooks:** Contained information about the login attempt, matching identities, and the interview which best matched the biometric of the face used to log in. These webhooks were available for 1:1 and 1:N. *** ## Webhook Configurations The Webhook configurations table shows the fields for each configured webhook. | Field | Description | | ------- | --------------------------------------------------------------------------------------------------------------------- | | ID | Unique identifier Incode assigned to the webhook configuration. | | Type | The name of the webhook as shown in the drop-down when it was configured: for example, Onboarding Status Webhook URL. | | URL | The URL webhook notifications are sent to. Provided when the webhook was configured. | | Actions | Icons to **Edit Webhook** or **Delete Webhook**. | *** ## Configure General Webhook Settings The settings in this section of the Webhooks tab apply to all your webhooks. | Field | Description | | --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Authentication URL (Optional) | Only needed if you have configured webhook authorization using OIDC. Incode provides this URL when you set up OIDC authorization. | | Client ID (Optional) | Only needed if you have configured webhook authorization using OIDC. When you set up OIDC authorization, Incode provides this value. It's also known as a client secret. | | Secret Key (Optional) | Only needed if you have configured webhook authorization using OIDC. Incode provides this value when you set up OIDC authorization. | | Client Authentication (Required) | Select one of the following from the drop-down: **Send as Basic Auth Header** or **Send Client Credentials in Body**. | | Scopes (Optional) | Only needed if you have configured webhook authorization using OIDC. | | Webhook Custom Body Parameters | Creates key/value pairs that are included in the OAuth token request sent to your authorization server when Incode obtains a token to deliver webhooks. Useful for passing values your identity provider requires, such as `scope`, `audience`, `resource`, or a tenant identifier. Click **Add** to expose the following fields: **Custom Body Parameter Key** and **Custom Body Parameter Value**. `client_id` and `client_secret` are reserved and can't be used as keys. | | Webhook Custom Headers (Optional) | Creates custom headers that your endpoint receives as part of webhook notifications. All headers are sent for all webhooks. Dynamic values are not supported. Click **Add** to expose the following fields: **Custom Header Key** and **Custom Header Value**. You can add more than one header. | 1. In the left menu, click **Configuration**. 2. Click the **Webhooks** tab. 3. If you want to use authentication, enter values in **Authentication URL**, **Client ID**, and **Secret Key**. 4. Select a value from the **Client Authentication** drop-down. 5. Enter values in **Scopes** if needed. 6. To use custom headers, click the plus sign (+) and enter values in **Custom Header Name** and **Custom Header Value**. 7. Click **Update Settings**. *** ## Configure New Webhook 1. In the left menu, click **Configuration**. 2. Click the **Webhooks** tab. 3. Scroll down and click **Generate New** in the lower right corner. 4. Use the drop-down to select the **Type** of webhook you want to configure. 5. Enter the **URL** for this webhook to use. Only one URL per webhook is supported. If you need to send the webhook notification to more than one endpoint, broadcast it internally after receiving it at this URL. ### Configure Watchlist Update Webhook To receive notifications when watchlist search results change, configure a webhook and enable the **_Subscribe for updates_** setting in your [Watchlist Business](/dashboard-platform-administration/watchlist-business-dashboard/#configuration-options) module. 1. In the left menu, click **Configuration**. 2. Click the **Webhooks** tab. 3. In the Webhook configurations table, find the _Watchlist update webhook url_** **webhook and click **Edit**. 4. Add your webhook URL and click **Save**. 5. Run a search against `POST /omni/businessWatchlist-result` with `"subscribe": true` in the request body. At minimum, the request body must include: - **_businessName_**: Required. String. Name of the business. - **_country_**: Optional. String. Two-letter ISO 3166-1 alpha-2 country code. 6. Save the `ref` value from the response. This identifies the search when updates arrive. 7. When the search results are updated, Incode sends the saved `ref` to your webhook. 8. Call `GET /omni/updated-watchlist-result?ref=[ref]` to retrieve the updated results. The webhook request body includes three fields: | Field | Type | Description | | ----------- | ------ | --------------------------------------- | | interviewId | String | Session ID | | ref | String | Reference number for the search | | search\_id | String | ID assigned when the search was created | *** ## Edit Existing Webhook Settings 1. In the left menu, click **Configuration**. 2. Click the **Webhooks** tab. 3. In the Webhook configurations table, locate the webhook you want to change and click **Edit**. 4. Enter new values as needed. Click **Save**. *** ## Delete Existing Webhook 1. In the left menu, click **Configuration**. 2. Click the **Webhooks** tab. 3. In the Webhook configurations table, locate the webhook you want to delete and click **Delete**. 4. In the confirmation dialog, click **Confirm**.
          --- - Path: `dashboard-platform-administration/configure-workflow-conditions` - URL: https://developer.incode.com/dashboard-platform-administration/configure-workflow-conditions/ - Markdown: https://developer.incode.com/dashboard-platform-administration/configure-workflow-conditions.md # Configure Conditions [Conditions](/concepts-and-architecture/conditions-for-workflows-20/) act as decision nodes that dynamically route users down different paths based on data collected during verification. You can use them to control which modules each user encounters. ### **Note** You configure a Condition when you add it to a [Workflow](/dashboard-platform-administration/workflows-20/#create-workflows). This task assumes you are already building a Workflow. The modules, operators, and values available in a Condition depend on which modules are in your Workflow. See each module's configuration documentation for the Condition options it supports. 1. From the Workflow builder menu, click **Conditions**. Drag the condition node onto the canvas. 2. In the Condition panel, you can enter **Condition name**. The name appears on the condition node in the canvas. 3. Under **IF**, define the expression that the condition evaluates: 1. Use the **Select module** drop-down to select the data the condition is based on. Options are organized by the module the data comes from, and you can search or filter by module. 2. Use the **Operator** drop-down to select an operator. 3. Use the next drop-down to choose how the value should be compared, such as equals, does not equal, greater than, or less than. 4. Use the next field to set the value for the expression. This field may be a drop-down or a text box, depending on the operator you selected. 4. To add more rules to the condition: 1. Click **AND** if all rules must be met. 2. Click **OR** if any one rule must be met. 5. Under **THEN**, select what happens when the expression evaluates to true. Options are: - Continue to next step - Pass session - Fail session - Warn session - Manual review session 6. Under **OTHERWISE**, select what happens when the expression evaluates to false. The options are the same as for THEN. 7. Click **Save condition**. ## Conditions on the canvas The condition node displays the IF expression beneath its name, and the THEN and OTHERWISE paths branch to the outcomes you selected: If the condition has multiple rules, the node shows the first rule with a **+n more** indicator. Hover over the node to see the full expression. You can add more modules, processes, or conditions along either path to extend the user journey. --- - Path: `dashboard-platform-administration/cross-check-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/cross-check-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/cross-check-dashboard.md # Cross Check The Cross Check module compares a data field from one source against the same field from a second source and identifies whether the values match. You configure one or more comparisons, each specifying the two sources, the field to compare, and a severity level that controls how strictly the values must match. In Flows, Cross Check is a configurable setting instead of a module. For an overview of this module and how it works, see [Cross Check](/features-and-modules/cross-check/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Cross Check to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. Ensure the modules that collect the data you want to compare are in your Workflow. 4. From the **Processes** list, drag and drop the **Cross Check** module into the builder after those modules. 5. Click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings. ## Add Cross Check to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. Ensure the modules that collect the data you want to compare are in your Flow. 4. Click the **Settings** tab. 5. Under Custom Logic, click **Cross Checks**. 6. Click **Set Crosschecks**. 7. Click **New Comparison** to open the [Configuration Options](#configuration-options) dialog and adjust settings. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save Comparison** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. ![Image of the Cross Check module's configuration page. Has an Add new comparison button.](https://developer.incode.com/assets/8085cc5f6ce6ce4ed04b3a3de8222d4d.png) Click **Add new comparison** to create a comparison. Each comparison has the following settings: | Setting | Description | | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **_Crosscheck name_** | A label for this comparison. Used to identify the comparison in results and conditions. Maximum 30 characters. Cannot contain special characters: `!`, `@`, `#`, `$`, `%`, `^`, `&`, `*`, `(`, `)`, `_`, `-`, or `/`. | | **_First document source_** | The first source to use in the comparison. You can only select a source available from modules already in the Flow or Workflow. | | **_Second document source_** | The second source to use in the comparison. You can only select a source available from modules already in the Flow or Workflow. | | **_Left field_** | The field from the first document source to compare. | | **_Right field_** | The field from the second document source to compare. | | **_Comparison severity_** | Controls how strictly the two field values must match. Options: _Ultra low_, _Low_, _Medium_, _High_, _Exact_. See [Severity Levels](#severity-levels) for details. | This example compares the address in the user's ID to the address in their Proof of Address document. ID is the First document source, Proof of Address is the Second document source, and Address is both the Left and Right field. After configuring each setting, click **Save Comparison**. You can add multiple comparisons to a single Cross Check module using **Add new comparison**. Similarly, you can add multiple comparisons to the Cross Check setting in Flows using **New Comparison**. Each comparison is configured and saved independently. ### Severity Levels Severity levels control how strictly two values must match. Higher severity levels require a closer match. Lower levels allow more variation between values, including typos, spelling variants, or transliterations. | Severity level | Allowance | | -------------- | --------------------------- | | Exact | No difference allowed | | High | \~5–12% difference allowed | | Medium | \~10–18% difference allowed | | Low | \~15–27% difference allowed | | Ultra low | \~20–35% difference allowed |
          --- - Path: `dashboard-platform-administration/curp-validation-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/curp-validation-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/curp-validation-dashboard.md # CURP Validation The CURP Validation module validates a person's CURP (Clave Única de Registro de Población), a personal identification number issued in Mexico, against Mexico's RENAPO registry. It accepts a CURP extracted via OCR, entered manually, or generated from personal data when the user doesn't know it. For an overview of this module and how it works, see [CURP Validation](/features-and-modules/curp-validation/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add CURP Validation to Workflows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **CURP Validation** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add CURP Validation to Flows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Flows**. 2. Click **New** or select an existing Workflow. 3. On the **Select Modules** tab, find the **CURP Validation** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options After making changes, click **Save Configurations** to apply them. ![Image of CURP Validation module configuration in Workflows. Has three configuration options..](https://developer.incode.com/assets/a2c3609e50aac842bf28a21161b8e1ec.png) ![Image of CURP Validation module configuration in Flows. Has two configuration options..](https://developer.incode.com/assets/9fbfc611e313984fe07eb8e5828f79fa.png) | Setting | Description | | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **_CURP data match_**
          _Workflows only_ | When enabled, validates that the CURP data returned by RENAPO matches the personal data captured earlier in the Session (for example, name and birthdate from ID Capture). | | **_Deceased status verification_** | When enabled, the module checks the RENAPO response for a deceased status and treats a deceased result as a validation failure. | | **_Async retries enabled_** | When enabled, activates asynchronous retry logic if the provider call fails or times out, improving reliability when the primary provider is unavailable. |
          --- - Path: `dashboard-platform-administration/custom-fields-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/custom-fields-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/custom-fields-dashboard.md # Custom Fields The Custom Fields module captures additional user-provided data and saves it to the Session, making it available for reporting, server-side decisions, or cross-checking later in the journey. :::warning This module is deprecated. Existing implementations may continue use, but it is not available in new implementations. ::: Before adding this module, make sure you've [defined your custom fields](/dashboard-platform-administration/configuration-general-tab/#manage-custom-fields) in Dashboard in **Configuration > General**. Each field requires a name and a type. Once defined, those fields appear as selectable options in the module configuration panel. For an overview of this module and how it works, see [Custom Fields](/features-and-modules/custom-fields/). ## Supported with: :x: Workflows | :white_check_mark: Flows ## Add Custom Fields to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Custom Fields** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ### Note Adding the module enables the UI-collection path. Users will be prompted to complete the fields during the Flow. If you don't add the module, the field values must instead be supplied through the backend [via API](/reference/addcustomfields/). ## Configuration Options ![Image of Custom Fields module configuration in Flows. Has checboxes for each configured custom field.](https://developer.incode.com/assets/a0bd1f9655413a528425e08618cb5279.png) | Setting | Description | | ---------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | | **_Form Title_** | The heading shown at the top of the form presented to the user. | | **_Custom field checkboxes (field names variable)_** | The fields available to include. Select the checkbox for each field you want to include in the form. | | **_Alias_** | An optional override for the field's display label. If left blank, the field's name is used. |
          --- - Path: `dashboard-platform-administration/custom-module-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/custom-module-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/custom-module-dashboard.md # Custom Module The Custom Module pauses a Workflow and hands control to your application, which runs custom logic and returns a result that determines how the Workflow continues. :::warning The Custom Module requires an SDK integration to function. The steps on this page cover Dashboard configuration only: adding the module to a Workflow, referencing the callback function name from your SDK, and configuring Conditions to branch on the result. The callback that resumes the Workflow is implemented in your SDK code. See [SDK Reference](/sdk-reference/sdk-reference/) for those instructions. ::: For an overview of this module and how it works, see [Custom Module](/features-and-modules/custom-module/). ## Supported with: :white_check_mark: Workflows | :x: Flows ## Add Custom Module to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Custom Module** into the builder. 4. Click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options After making changes, click **Save configurations** to apply them. ![](https://developer.incode.com/assets/00180d567226d04ac4a01636cbf8ad40.png) | Setting | Description | | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **_Callback Function_** | The name of the callback function in your SDK integration that Incode invokes when the Workflow reaches this module. The value is a string and must exactly match the function name implemented in your SDK integration. Your callback must return `onSuccess`, `onFail`, or `onUnknown` to advance the Workflow. If no result is returned, the Workflow remains paused. | ## Add Conditions [Conditions](/dashboard-platform-administration/configure-workflow-conditions/) let you branch the Workflow based on a result. Your SDK callback must return one of three results: `onSuccess`, `onFail`, or `onUnknown`. Your Workflow should define a distinct path for each. A common pattern is to route `onUnknown` to a step-up such as [ID Capture](/features-and-modules/id-capture/) or manual review, instead of treating it the same as `onFail`. The steps below walk through one example configuration: two Conditions in sequence, with `onSuccess` routing to Session Pass, `onFail` routing to Session Failed, and `onUnknown` routing to Manual Review. This is one valid approach; you can structure the Conditions, result nodes, and step-up behavior differently to fit your use case. ### 1. Condition for `onSuccess` The following steps detail the Condition configuration for the `onSuccess` path. 1. Drag a Condition into the builder from the left panel. Place it directly after the Custom Module node. ![](https://developer.incode.com/assets/c6ae6445158661d9704ee25892c3764a.png) 2. In the first drop-down, search for and select your **_Callback Function_** name. 3. In the second drop-down, select _Status_. 4. Keep the third drop-down set to _==_. 5. From the final drop-down, select _OK_. This corresponds to an `onSuccess` result. 6. Select the **Yes path** radio button. This routes the Workflow along the Yes path when the callback returns `onSuccess`. 7. Click **Save condition**. ### Example ![](https://developer.incode.com/assets/19345e444bb8ac9729e19d6c8bf3e52d.png) ### 2. Condition for `onFail` and `onUnknown` The following steps detail the Condition configuration for the `onFail` and `onUnknown` paths. 1. Drag a second Condition into the builder. Connect it to the **No** side of the first Condition, before the result node. 2. In the first drop-down, search for and select your **_Callback Function_** name. 3. In the second drop-down, select _Status_. 4. Keep the third drop-down set to _==_. 5. From the final drop-down, select _UNKNOWN_. This corresponds to an `onUnknown` result. 6. Select the **Yes path** radio button. This routes the Workflow along the Yes path when the callback returns `onUnknown`. 7. Click **Save condition**. ### Example ![](https://developer.incode.com/assets/dbad0b3bef3fbfbf3e680ac713734ad6.png) By default, both the Yes and No paths of the second Condition connect to a Session Failed result node. Update the Yes path result node to reflect your step-up flow: 1. Click the three dots on the result node connected to the **Yes path** of the second Condition. 2. From the **Select Decision** menu, select _Manual Review_. 3. Click **Update Decision**. ### Example Following this configuration, your Workflow builder should look like this: ![](https://developer.incode.com/assets/ab3cf04fc8ff839871d042069a884e8d.png)
          --- - Path: `dashboard-platform-administration/custom-watchlist-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/custom-watchlist-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/custom-watchlist-dashboard.md # Custom Watchlist The Custom Watchlist module screens the user's collected data, including biometric face data when available, against your organization's private watchlist of blocked or trusted users, and influences the Session outcome accordingly. It runs as a background process and isn't visible to the end user. For an overview of this module and how it works, see [Custom Watchlist](/features-and-modules/custom-watchlist/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Custom Watchlist to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. Ensure that the modules that collect user data, such as ID Capture and Face Capture, are in your Workflow. 4. From the **Processes** list, drag and drop the **Custom Watchlist** module into the builder after the data-collection modules. 5. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Custom Watchlist to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. Ensure that the modules that collect user data, such as ID Capture and Face Capture, are in your Flow 4. On the **Select Modules** tab, find the **Custom Watchlist** module and click **Add**. 5. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. ![Image of the Custom Watchlist module's configuration panel in Workflows. Has four configuration options.](https://developer.incode.com/assets/6643ec8cc04a98178f65510762641427.png) ![Image of the Custom Watchlist module's configuration panel in Flows. Has five configuration options.](https://developer.incode.com/assets/e07a1e9fceb33e5a80fb74f8a1d979e9.png) | Setting | Description | | ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **_Fail in face match_**
          _Flows only_ | When enabled, a biometric face match against a Blocklist entry directly fails the Session, regardless of other scoring. | | **Automatically add suspected fraud** | When enabled, the system automatically adds a user to the Blocklist when fraud signals are detected: for example, if a face match fails or if there is a name or date of birth mismatch against a record already linked to the same biometric face template. Score updates apply to the current session and all future sessions. Historical sessions are not affected. | | **_Auto execute_**
          _Flows only_ | When enabled, the module runs automatically after ID and face data have been collected, without requiring a manual trigger. | | **_Shared device mode_** | When enabled, device-specific identifiers such as device hash are excluded from watchlist matching. Use this when users access the service on shared devices, such as a branch kiosk. | | **_Use fallback search_**
          _Workflows only_ | When enabled, the module performs a fallback search if the primary matching pass does not return a result. | | **_Exclude ID photo from matching_** | When enabled, the ID photo is not used when matching the user against watchlist entries. | ## Add Conditions [Conditions](/dashboard-platform-administration/configure-workflow-conditions/) let you branch the Workflow based on a result. Conditions are optional for Custom Watchlist, but you can add one or more Conditions after the module to route the session based on whether the user was found on a Blocklist or Allowlist. To add a Condition for Custom Watchlist: 1. Drag a Condition into the builder from the left panel. Place it after the Custom Watchlist module. 2. In the first drop-down, find the Custom Watchlist section and select one of the conditions listed below: | Condition | Description | | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Watchlist birth date match | If the user's date of birth matches a date of birth on a watchlist entry. | | Watchlist device hash match | If the user's device fingerprint matches a device hash on a watchlist entry. This is a high-impact signal. When **_Shared device mode_** is enabled, device identifiers are excluded from matching. | | Watchlist phone match | If the user's phone number matches a phone number on a watchlist entry. | | Watchlist name match | If the user's name matches a name on a watchlist entry. Name matching is scored and fuzzy. | | Watchlist type | The list classification of the matched entry: _BLOCKLIST_ or _ALLOWLIST_. Include this condition to determine whether a match should restrict or trust the user. Blocklist matches reduce the session score; Allowlist matches increase it. | | Watchlist email match | If the user's email address matches an email on a watchlist entry. | | Watchlist personal id number match | If the user's personal ID number matches a personal ID number on a watchlist entry. | | Watchlist face match | If the user's face matches a face template enrolled in the watchlist. If **_Fail in face match_** is enabled, a match against a Blocklist entry directly fails the session. | | Watchlist id number match | If the user's document number matches an ID number on a watchlist entry. | 3. In the second drop-down, select an operator. 4. In the value field, enter or select the value to compare against. 5. Select the **Yes path** or **No path** radio button to route the Workflow when the Condition is met. 6. Click **Save condition**.
          --- - Path: `dashboard-platform-administration/dashboard-platform-administration` - URL: https://developer.incode.com/dashboard-platform-administration/ - Markdown: https://developer.incode.com/dashboard-platform-administration.md # Dashboard Platform Administration Dashboard allows you to build verification experiences, monitor the sessions and identities they produce, review flagged cases, and manage your organization's users, integrations, and settings. This section walks through every page in Dashboard, organized by: - The order in which you likely want to complete tasks. - The order of pages in the left menu in Dashboard. *** ## Configure Workflows and Flows - **[Workflows](/dashboard-platform-administration/workflows-20/)**: Create, edit, test, and manage Workflows. Workflows are the recommended, no-code way to define an onboarding or authentication journey with conditional branching. - **[Flows](/dashboard-platform-administration/flows-1/)**: Create and manage Flows, the legacy, linear alternative to Workflows. Flows are being deprecated in favor of Workflows. - **[Configure Workflow Conditions](/dashboard-platform-administration/configure-workflow-conditions/)**: Add and configure Condition nodes in a Workflow to route users down different paths based on collected data. - **[Forward Data to Your Workflow](/dashboard-platform-administration/forward-data-to-your-workflow/)**: Forward custom fields, an external customer ID, or a redirect URL override into a Workflow via `/omni/start`, and use it to cross-check ID data or tag sessions with internal identifiers. - **[Add Modules](/dashboard-platform-administration/add-modules/)**: Select which modules to add to your Workflows or Flows. ## Monitor Sessions, Identities, and Authentications - **[Sessions](/dashboard-platform-administration/review-verification-sessions/)**: Browse, filter, and export every completed onboarding or authentication session, or start a manual session by sending an SMS link directly from Dashboard. - **[Identities](/dashboard-platform-administration/view-identities/)**: View every enrolled Incode Identity in your organization. Identities are reusable verified records created when users successfully onboard. - **[Authentications](/dashboard-platform-administration/review-authentications/)**: Review every 1:1 or 1:N face authentication attempt made against your identity pool, separate from onboarding sessions. ## Manage Assisted Verification Services - **[Helpdesk Verifications](/dashboard-platform-administration/manage-helpdesk-verifications/)**: Manually trigger identity verification for an employee in real time. This is useful for call-center or help-desk scenarios where an agent needs to confirm identity before granting access. - **[Candidate Verifications](/dashboard-platform-administration/manage-candidate-verifications/)**: Trigger identity verification for a job candidate on demand, including generating a verification-gated meeting link, to guard against hiring fraud. ## Monitor Risk & Compliance - **[Custom Watchlists](/dashboard-platform-administration/manage-custom-watchlists/)**: Maintain your organization's own blocklists and allowlists of individuals or entities, independent of Incode's built-in fraud lists. - **[Compliance](/dashboard-platform-administration/monitor-compliance/)**: Review data deletion records and a full audit trail of Dashboard user and system actions. - **[Escalations](/dashboard-platform-administration/view-escalations/)**: Track the status of sessions you've escalated to Incode for review, from submission through resolution. - **[Cases](/dashboard-platform-administration/manage-cases/)**: Assign and resolve sessions that were flagged for manual review. ## Check System Status - **[Status](/dashboard-platform-administration/check-system-status/)**: Links out to status.incode.com to check current service health, uptime history, and incident history, and to subscribe to status updates. ## Manage Dashboard Organization and Access - **[Users](/dashboard-platform-administration/manage-users/)**: Create, edit, and delete Dashboard user accounts, assign roles, and view each user's activity log. - **[Configuration](/dashboard-platform-administration/configuration/)**: Configure organization-wide settings: general settings, authorization, webhooks, API keys, integrations, consents, and the look and feel of the hosted onboarding experience. - **[Integrations](/dashboard-platform-administration/manage-integrations/)**: Create, edit, and manage the integrations (such as B2B onboarding or OIDC client credentials) used to trigger and authenticate verification sessions. - **[Directory Information](/dashboard-platform-administration/view-directory-information/)**: View the people and directories (such as Okta or Microsoft Entra) connected through a directory integration, along with each person's verification sessions. --- - Path: `dashboard-platform-administration/data-sharing-consent-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/data-sharing-consent-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/data-sharing-consent-dashboard.md # Data Sharing Consent The Data Sharing Consent module shows the user one or more preconfigured [consents](/dashboard-platform-administration/configuration-consents-tab/) to review and accept, then records their agreement. Consents obtain the user's permission to collect and process their data. Most jurisdictions require this at the start of an identity verification journey. Incode provides a default consent. If you want to add any additional consents, ensure you have [created them](/dashboard-platform-administration/configuration-consents-tab#add-a-new-consent) before configuring this module. For an overview of this module and how it works, see [Data Sharing Consent](/features-and-modules/combined-consent/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Data Sharing Consent to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Data Sharing Consent** module into the builder. Add it to the beginning of your Flow or Workflow. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel to select the consent to use in this Workflow. ## Add Data Sharing Consent to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Data Sharing Consent** module and click **Add**. 4. By default, the [Configuration Options](#configuration-options) panel opens so you can select your consent. ## Configuration Options This section details all the configuration options available for this module. If you are building a Workflow, click **Save configurations** before closing the configuration panel. If you are building a Flow, the configuration is saved automatically. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. ![Image of Data Sharing Consent module configuration in Workflows. Has one configuration option..](https://developer.incode.com/assets/c4de2c6afdbdb7ee5b94b80affd65c8f.png) | Setting | Description | | ------------- | --------------------------------------------------------- | | **_Consent_** | Use this drop-down to select the consent you want to use. | If you are building a Workflow and want to offer the user more than one consent screen, you can add the module again and select a different consent from the drop-down. Repeat this for as many consents as you need. Only one consent is supported when building a Flow. --- - Path: `dashboard-platform-administration/document-capture-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/document-capture-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/document-capture-dashboard.md # Document Capture The Document Capture module captures a supplementary document, such as a proof of address document, medical document, or bank statement. Users can upload a file or take a photo of the document with their device’s camera. Submitted documents appear in the **Other** tab in [single Session view](/dashboard-platform-administration/single-session-view/#other). For an overview of this module and how it works, see [Document Capture](/features-and-modules/document-capture/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Document Capture to Workflows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Document Capture** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Document Capture to Flows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Document Capture** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options After making changes on any tab, click **Save configurations** to apply them. ![Image of Document Capture module configuration in Workflows. Has four configurable options.](https://files.readme.io/c138b0768eab29a236a4238249e9730a51decdd85c2a752f828eaea88d96b06c-image.png) | Setting | Description | | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **_Title_** | Custom title text displayed to the user on the document capture screen. Leave blank to use the default. | | **_Text_** | Custom instructional text displayed to the user on the document capture screen. Leave blank to use the default. | | **_Processing Type_** | Determines how the captured document is processed after submission. Select one of the following options: _Capture_, _Process Proof Of Address OCR_, _Process Letter Of Authorization OCR_, _Process Asylum Seeker Visa ZAF OCR_, _Process Bank Statement OCR_, _Process Voided Check OCR_, _Process V5C Logbook_, _Process Car Invoice_, _Process Circulation Card_, _Process Finance Settlement_, or _Process Mexican INE as POA_. | | **_Allow user to skip document capture_** | When enabled, users can bypass the document capture step and continue without submitting a document. | --- - Path: `dashboard-platform-administration/ekyb-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/ekyb-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/ekyb-dashboard.md # eKYB This module verifies the identity and legitimacy of a business by matching business details submitted by the end user against records in recognized government and commercial data sources. The fields collected depend on the country the end user selects. ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows Prefill is currently supported only in Flows. See [Configuration Options](#configuration-options). ## Add eKYB to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **eKYB** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add eKYB to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **eKYB** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. The eKYB module supports two configuration options: **Verification** and **Prefill**. Switch between the two using the tabs at the top of the configuration panel. ### Verification Verification is the core business identity check. The end user submits business details (business name, tax ID, address, and optionally UBOs and directors), and the system verifies the submitted values against a source of truth. The response includes match results for each submitted field, along with enrichment details (registration status and entity type) where available. For request and response schemas, supported countries, and per-country details, see the [eKYB Verification Coverage](https://developer.incode.com/docs/ekyb-verification-coverage) and [eKYB Verification API Reference](https://developer.incode.com/docs/ekyb-verification-api-reference) pages. The field checkboxes control which fields are collected from the end user and submitted for verification. The end user selects the country in the flow itself; there is no country selector in the module configuration. ![](https://files.readme.io/ec87ed91485c5b59586b2a5f59a13b15c817b6af67e2e303e66d6a9b4389983f-image.png) ![](https://files.readme.io/2e73406744844265bdaee2a0c217c3570ef806aea1341c393135cd847894a940-image.png) | Setting | Description | | ----------------------------- | --------------------------------------------------------------------------------------------------------------- | | Business name | When enabled, the end user is asked to provide the business name. | | Address | When enabled, the end user is asked to provide the business address. | | Tax ID | When enabled, the end user is asked to provide the business tax ID. | | Unique Beneficial Owner (UBO) | When enabled, the end user is asked to provide the full legal names of the business's Unique Beneficial Owners. | | Directors | When enabled, the end user is asked to provide the full legal names of the business's directors. | Not all fields are supported by every country. See the country page for each country's supported fields. Country pages are listed on the [eKYB Verification Coverage](https://developer.incode.com/docs/ekyb-verification-coverage) page. ### Prefill Prefill is an enrichment option that reduces end user friction. The end user submits only the tax ID and business name, and the system looks up the business in official registries and returns additional details (registered address, entity type, and other authoritative data) for pre-fill. Prefill does not verify submitted values against a source of truth; it retrieves and returns data. Prefill is currently available only in Flows, and only for Mexico. For request and response schemas, supported countries, and per-country details, see the [eKYB Prefill Coverage](https://developer.incode.com/docs/ekyb-prefill-coverage) and [eKYB Prefill API Reference](https://developer.incode.com/docs/ekyb-prefill-api-reference) pages. ![](https://files.readme.io/dbdd952dc115d4bd86bdaf8ac116f5553f7805c16314668b3aba00f7027bd1ea-image.png) | Setting | Description | | -------------- | ---------------------------------------------------------------------------------------------- | | Prefill source | The prefill source to use. Currently the only available option is `MX_KYB_PREFILL` for Mexico. | | Tax ID | When enabled, the end user is asked to provide the business tax ID. | ## Add Conditions [Conditions](https://developer.incode.com/docs/configure-workflow-conditions) let you branch the Workflow based on the eKYB verification result. When adding a Condition after the eKYB module, search, filter, or browse for the **eKYB** section in the first drop-down and select from the following options: | Condition | Description | | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------- | | Address deliverability
          _US only_ | The USPS deliverability status for the submitted business address. Possible values: _DELIVERABLE_, _UNDELIVERABLE_. | | Unique beneficial owners count | The number of Unique Beneficial Owners associated with the business. Supports comparison operators. Possible values: any numeric value. | | TaxID verification | The match status for the submitted tax ID. Possible values: _VERIFIED_, _APPROXIMATE MATCH_, _UNVERIFIED_. | | Ubo name match | The match status for the submitted UBO names. Possible values: _VERIFIED_, _APPROXIMATE MATCH_, _UNVERIFIED_. | | Address verification | The match status for the submitted business address. Possible values: _VERIFIED_, _APPROXIMATE MATCH_, _UNVERIFIED_. | | Business name | The match status for the submitted business name. Possible values: _VERIFIED_, _APPROXIMATE MATCH_, _UNVERIFIED_. | | Address property type
          _US only_ | The property type of the submitted business address. Possible values: _RESIDENTIAL_, _COMMERCIAL_. |
          --- - Path: `dashboard-platform-administration/ekyc-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/ekyc-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/ekyc-dashboard.md # eKYC This module verifies an end user's identity by matching the personal information they provide against records in recognized data sources. The fields collected and the sources available depend on the country selected. ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add eKYC to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **eKYC** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add eKYC to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **eKYC** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. | Setting | Description | | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Country | The country whose data sources will be used to verify the end user. Select one country per eKYC module instance. See [Field Requirements by Source](/dashboard-platform-administration/ekyc-field-requirements-by-source/) for the sources and fields available per country. | | Source | The specific data source within the selected country to verify against. The available sources depend on the country selected. See [Field Requirements by Source](/dashboard-platform-administration/ekyc-field-requirements-by-source/) for the sources available per country. | | Field checkboxes (Name, Email, Address, Phone, Date of birth, and others) | The fields collected from the end user and submitted for verification. The fields available depend on the country and source selected. Some fields may be required for a given country and source and cannot be deselected. See [Field Requirements by Source](/dashboard-platform-administration/ekyc-field-requirements-by-source/) for the sources available per country. | | Field input source drop-down | For each field, specifies where the field's value comes from. Options vary per field. See [Field Input Sources](#field-input-sources) below for the options available per field. | | Risk Addons | Additional checks that run alongside the primary eKYC verification. Select one or more of _Phone Check_, _Advanced Phone Check_, and _Email Check_. See [Risk Addons](#risk-addons) below for a description of each. | ### Field input sources Each field checkbox has a drop-down specifying where the field's value comes from. The options available depend on the field. The default for all fields is _Input_, which means the value is entered by the end user. The other options pull the value from another module's output or from the end user's proof of address document. | Field | Available input sources | | ------------------------------- | ------------------------------------------------------------------------------------------ | | Name | Input, Auto-fill from ID (OCR), Proof of Address | | Email | Input, Email Module Input, Proof of Address | | Address | Input, Auto-fill from ID (OCR), Proof of Address | | Phone | Input, Phone Module Input, Proof of Address | | Tax ID | Input | | Date of birth | Input, Auto-fill from ID (OCR), Proof of Address | | Drivers License Number | Input, Auto-fill from ID (OCR), Proof of Address | | Drivers License State | Input, Auto-fill from ID (OCR), Proof of Address | | Drivers License Expiration Date | Input | | Last 4 SSN Numbers | | | National ID Number | Input | | TAX ID Number | Input, Proof of Address | | Gender | Input | | Nationality | Input | | PAN number | Input, Auto-fill from ID (OCR) | | ID Type | Input | ### Risk Addons Risk Addons are supplementary checks that evaluate the trust and potential risk of a phone number or email address. They can be added to any eKYC configuration to run alongside the country-specific verification, or configured as standalone checks under the Global country with the _Risk Add-ons Only_ source. Each add-on returns its own set of API response fields and an overall risk level. See the [eKYC API Reference](/general-reference/ekyc-api-reference/#risk-add-ons) for the full response schema. #### Phone Check Evaluates the trust and potential risk of a phone number using signals like validity, activity, carrier information, and fraud indicators. Signals include: - Line type and carrier - Whether the number is VOIP or prepaid - Whether the number has been exposed in recent data breaches - Whether the number has been reported for spam or harassment Best suited for standard phone-number risk assessment. #### Advanced Phone Check Extends _Phone Check_ with additional intelligence signals including porting history, breach history, social media presence, and digital footprint scoring. Signals include: - Whether the number has been ported, and the previous and current carriers - The number's first-seen date in the data partner's network - Associated social media platforms - Breach history, including first and last breach dates - A digital footprint score Best suited for higher-assurance workflows where extended phone intelligence is required. #### Email Check Evaluates the trust and potential risk of an email address using signals like validity, deliverability, breach exposure, and legitimate user activity. Signals include: - Whether the email address appears in recent database leaks - The estimated age of the email address - The age of the email domain - A measure of the email address's legitimate user activity (purchases, registrations, and other online behavior) Best suited for assessing the trust and potential risk of an email address at account creation or high-risk transaction points. ## Add Conditions [Conditions](/dashboard-platform-administration/configure-workflow-conditions/) let you branch the Workflow based on the eKYC verification result. When adding a Condition after the eKYC module, search, filter, or browse for the **eKYC** section in the first drop-down and select from the following options: | Condition | Description | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | Phone level | The risk level associated with the submitted phone. Possible values: _VERY HIGH_, _HIGH_, _MEDIUM_, _LOW_. | | Phone zipcode match | The match status for the submitted zip code against the phone record. Possible values: _EXACT_, _NO MATCH_. | | Phone address match | The match status for the submitted address against the phone record. Possible values: _EXACT_, _FUZZY_, _NO MATCH_. | | TaxID match | The match status for the submitted tax ID against the record. Possible values: _EXACT_, _FUZZY_, _NO MATCH_. | | Phone city match | The match status for the submitted city against the phone record. Possible values: _EXACT_, _NO MATCH_. | | Phone email match | The match status for the submitted email against the phone record. Possible values: _EXACT_, _NO MATCH_. | | TaxID DOB match | The match status for the submitted date of birth against the tax ID record. Possible values: _EXACT_, _FUZZY_, _NO MATCH_. | | Address risk level | The risk level associated with the submitted address. Possible values: _VERY HIGH_, _HIGH_, _MEDIUM_, _LOW_. | | DL state check | The match status for the submitted driver's license state against the phone record. Possible values: _EXACT_, _NO MATCH_. | | Email level | The risk level associated with the submitted email. Possible values: _VERY HIGH_, _HIGH_, _MEDIUM_, _LOW_. | | TaxID level | The risk level associated with the submitted tax ID. Possible values: _VERY HIGH_, _HIGH_, _MEDIUM_, _LOW_. | | Phone name match | The match status for the submitted name against the phone record. Possible values: _EXACT_, _FUZZY_, _NO MATCH_. | | Overall eKYC level | The overall risk level returned by the eKYC check. Possible values: _VERY HIGH_, _HIGH_, _MEDIUM_, _LOW_. | | TaxID state match | The match status for the submitted state against the tax ID record. Possible values: _EXACT_, _FUZZY_, _NO MATCH_. | | Phone dob match | The match status for the submitted date of birth against the phone record. Possible values: _EXACT_, _NO MATCH_. | | DL number check | The match status for the submitted driver's license number against the phone record. Possible values: _EXACT_, _NO MATCH_. | | Email domain level | The risk level associated with the submitted email's domain. Possible values: _VERY HIGH_, _HIGH_, _MEDIUM_, _LOW_. | | last4SSN | The match status for the submitted last four digits of SSN against the phone record. Possible values: _EXACT_, _NO MATCH_. | | Adverse media level | The adverse media risk score returned for the session. Supports comparison operators. Possible values: any numeric value. | | Phone state match | The match status for the submitted state against the phone record. Possible values: _EXACT_, _NO MATCH_. | | Sanction level | The sanction risk score returned for the session. Supports comparison operators. Possible values: any numeric value. | | Name risk level | The risk level associated with the submitted name. Possible values: _VERY HIGH_, _HIGH_, _MEDIUM_, _LOW_. | | Manual review | Result related to whether the session has flagged for manual review. Supports comparison operators. Possible values: any numeric value. | | TaxID name match | The match status for the submitted name against the tax ID record. Possible values: _EXACT_, _FUZZY_, _NO MATCH_. | | TaxID address match | The match status for the submitted address against the tax ID record. Possible values: _EXACT_, _FUZZY_, _NO MATCH_. | | Pep level | The PEP (politically exposed person) risk score returned for the session. Supports comparison operators. Possible values: any numeric value. |
          --- - Path: `dashboard-platform-administration/ekyc-field-requirements-by-source` - URL: https://developer.incode.com/dashboard-platform-administration/ekyc-field-requirements-by-source/ - Markdown: https://developer.incode.com/dashboard-platform-administration/ekyc-field-requirements-by-source.md # eKYC Field Requirements by Source This page lists the field requirements for each source available in the Dashboard's eKYC module configuration. Each country in [eKYC Dashboard configuration](/dashboard-platform-administration/ekyc-dashboard/) supports one or more sources, and the fields available for collection vary by country and source. This page lists what appears in the Dashboard for each country and source combination. For response schemas, `overallLevel` calculations, and API-level details, see the eKYC Reference section. ## Argentina Available sources: Argentina - Official Civil Register, Argentina - Resident Register. #### Argentina - Official Civil Register | Field | Required | | ------------------ | -------- | | Name | Required | | Address | Required | | Gender | Required | | Date of birth | Optional | | National ID Number | Optional | | TAX ID Number | Optional | #### Argentina - Resident Register | Field | Required | | ------------- | -------- | | Name | Required | | Address | Optional | | Date of birth | Optional | | Gender | Optional | ## Brazil Available sources: BR GOVT 1. #### BR GOVT 1 This source verifies submitted fields against Brazilian government records associated with the provided tax ID (CPF). | Field | Required | | ------------- | -------- | | Name | Required | | Tax ID | Required | | Address | Optional | | Date of birth | Optional | | Nationality | Optional | ## Canada Available sources: CA Credit Bureau FINTRAC, CA RES CREDIT. #### CA Credit Bureau FINTRAC | Field | Required | | ------------- | -------- | | Name | Required | | Address | Required | | Date of birth | Required | #### CA RES CREDIT This source verifies submitted fields against Canadian credit records. | Field | Required | | ------------- | -------- | | Name | Required | | Address | Required | | Date of birth | Required | | Phone | Optional | ## Chile Available sources: Chile - Official Census. #### Chile - Official Census This source verifies submitted fields against Chilean census records associated with the provided National ID Number (RUT). | Field | Required | | ------------------ | -------- | | Name | Required | | National ID Number | Required | | Date of birth | Optional | ## Colombia Available sources: CO 1. #### CO 1 | Field | Required | | ------------------ | -------- | | National ID Number | Required | | Name | Optional | ## Costa Rica Available sources: CR 1. #### CR 1 | Field | Required | | ------------------ | -------- | | National ID Number | Required | | Name | Optional | ## Guatemala Available sources: GT 1. #### GT 1 This source verifies submitted fields against Guatemalan records associated with the provided National ID Number (DPI). | Field | Required | | ------------------ | -------- | | Date of birth | Required | | National ID Number | Required | | Name | Optional | ## India Available sources: India DMV, INDIA PAN. #### India DMV | Field | Required | | ------------------ | -------- | | Name | Required | | Date of birth | Required | | National ID Number | Required | | Address | Optional | | Gender | Optional | #### INDIA PAN This source verifies submitted fields against records associated with the provided PAN (Permanent Account Number). | Field | Required | | ---------- | -------- | | Name | Required | | PAN number | Required | ## Mexico Available sources: MX CONSUMER 1. #### MX CONSUMER 1 Combines phone and email risk-scoring from third-party providers to produce an overall eKYC risk assessment. **Phone** returns a risk score based on account history, prepaid status, account duration, and monthly bill amount. **Email** returns a predictive risk score based on historical transaction data and behavior patterns. | Field | Required | | ----- | -------- | | Email | Required | | Phone | Required | | Name | Optional | ## Nigeria Available sources: NG MONO BVN, NG MONO NIN. #### NG MONO BVN | Field | Required | | ------------- | -------- | | Name | Required | | Phone | Required | | Date of birth | Required | | TAX ID Number | Required | #### NG MONO NIN | Field | Required | | ------------- | -------- | | Name | Required | | Phone | Required | | Date of birth | Required | | TAX ID Number | Required | ## Philippines Available sources: Philippines Residential + Credit Bureau. #### Philippines Residential + Credit Bureau | Field | Required | | ------------------ | -------- | | Name | Required | | Date of birth | Required | | Address | Optional | | National ID Number | Optional | | ID Type | Optional | ## Spain Available sources: Spain Phone Register 2. #### Spain Phone Register 2 Verifies individuals against Spain's Utility - Phone Register as the source of truth. Supports fuzzy matching on name, date of birth, address components, national ID number (DNI), and phone. | Field | Required | | ------------------ | -------- | | Name | Required | | Address | Optional | | Phone | Optional | | Date of birth | Optional | | National ID Number | Optional | ## United Kingdom Available sources: UK CREDIT BUREAU 1, UK VOTER REGISTER. #### UK CREDIT BUREAU 1 | Field | Required | | ------------- | -------- | | Name | Required | | Address | Required | | Date of birth | Optional | #### UK VOTER REGISTER Verifies individuals against the United Kingdom's Voter Register as the source of truth. Supports fuzzy matching on name, address components, date of birth, gender, and phone. | Field | Required | | ------------- | -------- | | Name | Optional | | Address | Optional | | Phone | Optional | | Date of birth | Optional | | Gender | Optional | ## United States Available sources: US CREDIT BUREAU 1, US CREDIT BUREAU 3, US CREDIT TELCO, US DRIVERS LICENSE 1, US TELCO 1, US TELCO 2, US TELCO 4, US TELCO 5. #### US CREDIT BUREAU 1 This source verifies submitted fields against credit bureau records associated with the provided tax ID. | Field | Required | | ------------- | -------- | | Name | Required | | Address | Required | | Tax ID | Required | | Email | Optional | | Phone | Optional | | Date of birth | Optional | #### US CREDIT BUREAU 3 This source verifies submitted fields against credit bureau records. | Field | Required | | ------------- | -------- | | Name | Required | | Email | Optional | | Address | Optional | | Phone | Optional | | Tax ID | Optional | | Date of birth | Optional | #### US CREDIT TELCO | Field | Required | | ------------- | -------- | | Name | Required | | Address | Optional | | Phone | Optional | | Tax ID | Optional | | Date of birth | Optional | #### US DRIVERS LICENSE 1 This source verifies submitted driver's license details against state driver's license records. Driver's license verification is currently supported in 42 of the 50 US states. The following states are not supported: Alaska, California, Louisiana, Minnesota, New Hampshire, New York, Oklahoma, Pennsylvania, and Utah. | Field | Required | | ------------------------------- | -------- | | Drivers License Number | Required | | Drivers License State | Required | | Name | Optional | | Date of birth | Optional | | Drivers License Expiration Date | Optional | #### US TELCO 1 This source verifies submitted fields against the record associated with the provided phone number, so Phone is required. | Field | Required | | ---------------------- | -------- | | Name | Required | | Phone | Required | | Address | Optional | | Date of birth | Optional | | Email | Optional | | Drivers License Number | Optional | | Drivers License State | Optional | | Last 4 SSN Numbers | Optional | #### US TELCO 2 This source verifies submitted fields against the record associated with the provided phone number, so Phone is required. | Field | Required | | ------------- | -------- | | Phone | Required | | Name | Optional | | Address | Optional | | Date of birth | Optional | #### US TELCO 4 #### US TELCO 5 This source verifies submitted fields against the record associated with the provided phone number, so Phone is required. | Field | Required | | ------------- | -------- | | Phone | Required | | Name | Optional | | Email | Optional | | Address | Optional | | Tax ID | Optional | | Date of birth | Optional | #### US ADDRESS 1 ## Global Available sources: Risk Add-ons Only. #### Risk Add-ons Only Select Global when no country-specific source of truth is required and the check should run against Risk Add-ons only. No identity fields are collected through this source; configuration is limited to the Risk Add-ons selector. _See [Risk Addons](/dashboard-platform-administration/ekyc-dashboard/#risk-addons) in the eKYC Dashboard configuration for available add-on options._
          --- - Path: `dashboard-platform-administration/electronic-signature-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/electronic-signature-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/electronic-signature-dashboard.md # Electronic Signature The Electronic Signature module captures a signature the user hand-draws on screen. It is typically placed at the end of a verification journey to capture explicit consent. For an overview of this module and how it works, see [Electronic Signature](/features-and-modules/electronic-signature-module/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Electronic Signature to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Electronic Signature** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Electronic Signature to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Electronic Signature** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. ![Image of the Electronic Signature module's configuration panel. Has two configuration options.](https://developer.incode.com/assets/5e29244dad7a8f2f2e22b0a1ad9e2052.png) ### General | Setting | Description | | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **_Title_** | Custom title displayed to the end user during the signing step. Leave blank to use the default title. | | **_Subtitle_** | Custom subtitle displayed to the end user during the signing step. Use this field to add instructions or communicate the purpose of the signature. Leave blank to use the default subtitle. |
          --- - Path: `dashboard-platform-administration/email-input-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/email-input-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/email-input-dashboard.md # Email Input The Email Input module collects a user's email address and can confirm email ownership by sending a one-time password (OTP) to that address. For an overview of this module and how it works, see [Email Input](/features-and-modules/email-input/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Email Input to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Email Input** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Email Input to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Email Input** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. ![Image of Email Input module configuration in Workflows. Has three configuration options.](https://developer.incode.com/assets/42b195f0d01363a5efb0a14e2125554e.png) ![Image of Email Input module configuration in Flows. Has two configurable options.](https://developer.incode.com/assets/7e5b4cf1f93ec44ddd6f6bc4e8d89922.png) | Setting | Description | | ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | **_Enable OTP verification_** | When enabled, sends a one-time passcode to the user's email address and requires them to enter it before proceeding. | | **_Expiration duration for OTP (min)_** | The number of minutes before an OTP expires. Default: _10_. | | **_Skip if email already collected_**
          _Workflows only_ | When enabled, skips the Email Input module if an email address has already been collected during the session. |
          --- - Path: `dashboard-platform-administration/external-decision-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/external-decision-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/external-decision-dashboard.md # External Decision The External Decision module calls a configured external endpoint and exposes the returned decision value for routing [Conditions](/dashboard-platform-administration/configure-workflow-conditions/). For an overview of this module and how it works, see [External Decision](/features-and-modules/external-decision/). ## Supported with: :white_check_mark: Workflows | :x: Flows ## Prerequisites Before adding the External Decision node to a Workflow, the client must: - Expose an endpoint that accepts the Incode payload (`sessionId`, `identityId`, `flowId`, `timestamp`) and returns a single `decision` string. - Secure the endpoint with OAuth 2.0 (client credentials) and issue Incode a Client ID and Client Secret. - Define the set of `decision` values the endpoint will return (for example, `valid`, `blocked`, `on_hold`). These exact strings are used when configuring routing conditions. ## Add External Decision to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. Ensure you have at least one Module node in the builder. 4. From the **Processes** list, drag and drop the **External Decision** module into the builder. Place it after an authentication module only if the decision depends on `identityId`. 5. Click the three dots > **Edit** on the node to open the [Configuration Options](#configuration-options) panel and configure the endpoint, authentication, and routing. ## Configuration Options After making changes, click **Save configurations** to apply them. ![](https://developer.incode.com/assets/d72df4f6ab085865b64e1c4e5d5e3c3a.png) The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. | Setting | Description | | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **_Node Name_** | The reference used for this node in routing conditions (for example, _eligibility\_status_). Conditions act on the returned decision string using this name as the reference. | | **_Endpoint URL_** | The client-owned endpoint that Incode calls when the Workflow reaches this node. | | **_Client ID_** | The identifier the client issues to Incode for the OAuth client-credentials grant. | | **_Saved Client Secret_** | Displays the masked Client Secret currently saved for this node. Read-only. To change the value, enter a new one in **_Replacement Client Secret_**. | | **_Replacement Client Secret_** | Enter a new Client Secret value here to replace the one currently saved. Use the visibility toggle to ensure your new secret is correct before saving. After you click **Save configurations**, the value is masked. | | **_Authorization URL_** | The client's OAuth token endpoint. Incode requests an access token from this URL on each execution. | | **_Scopes_** | The OAuth scopes Incode requests when obtaining an access token. | | **_Auth Method_** | How Incode presents its credentials to the token endpoint. Options are _Client secret basic_ and _Client secret post_. | | **_Custom Headers_** | Optional static headers that Incode sends as-is on every request to the endpoint (for example, an API gateway key). Add additional key/value pairs using the **+** button.
          Custom header values are not masked in the configuration UI. | ## Add a Condition After configuring the module, add [Condition](/dashboard-platform-administration/configure-workflow-conditions/) nodes that act on the returned `decision` string. Reference the node by the **_Node Name_** configured above (for example, `eligibility_status == "valid"`). Example routing for a status look-up: - `valid` → continue to the next module - `blocked` → block access - `on_hold` → trigger step-up identity verification - `INCODE_UNRESOLVED` → handle failure (no response within 30 seconds, error, unavailable endpoint, or unmatched value) Decision string matching is case-sensitive. Returned values must exactly match the strings configured in conditions, or the outcome maps to `INCODE_UNRESOLVED`. ## Observability A session event is emitted on every execution, capturing the endpoint called, the decision value, the optional `reason` field if returned, and the branch taken. Credentials are never exposed in logs or the flow definition.
          --- - Path: `dashboard-platform-administration/face-authentication-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/face-authentication-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/face-authentication-dashboard.md # Face Authentication The Face Authentication module captures a returning user's face with the device camera and matches it against the face already enrolled for that user. It then returns a pass or fail result. For an overview of this module and how it works, see [Face Authentication](/features-and-modules/face-authentication/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Face Authentication to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New**. 3. From the Modules list, drag and drop the Face Authentications module into the builder. 4. On the module node, you can click the three dots > **Edit** to change specific settings for the module, like using 1:N, setting image quality, or setting a different number of allowed capture attempts. The [Configuration Options]() section below describes all of these settings. The default settings work as designed, so no changes are needed. 5. Add a Condition after the Face Authentications module and configure it: 1. IF `Face authentication result` `STATUS` `==` `OK` 2. Select **Yes path** for _Configure what happens with existing steps after condition_. 3. Click **Save Condition**. 6. Click **Save & Publish**. ## Add Face Authentication to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New**. 3. On the Select Modules tab, find the Face Authentication Module and click **Add**. 4. You can click **Details & Configurations** to change specific settings for the module, like using 1:N, setting image quality, or setting a different number of allowed capture attempts. The [Configuration Options]() section below describes all of these settings. The default settings work as designed, so no changes are needed. 5. Click **Save Changes**. ## Configuration Options After adding the _Face Authentication_ module to your Incode Flow or Workflow, there are several settings you can configure based on your needs. Click the module in the Workflow to open the configuration panel, adjust the settings as needed, then click **Save configurations**. ![](https://files.readme.io/d17cdbe3787c9b5458e347d5a2e88988d36de7855a4fe959a0317a3625a777bf-image.png) Refer to the table below for details about each setting. | Setting | Description | |---|---| | **_Mode_** | Determines the mode of comparison. Select one: _1:1_ (compares the authentication selfie against a specific existing user) or _1:N_ (compares the authentication selfie against all the faces in the customer organization and finds the closest match). Default value: _1:1_.| | **_Number of attempts_** | The maximum number of auto capture attempts Incode will make. As soon as there is a successful attempt, the module ends. Enter a number. Default value: _3_ | | **_Auto capture timout (secs)_** | The maximum number of seconds Incode will attempt to auto capture the selfie. After which time, manual capture is required. Enter a number of seconds. Default value: _25_. | | **_Show face capture tutorial_** | Controls whether the user sees a tutorial on how to capture the best possible selfie. Selected by default. | | **_Stateless face match_** | When enabled, allows face authentication for users who have deleted their biometric data. The face match process uses the selfie submitted via API instead of a stored template. | | **_Exact face match check_** | When enabled, compares the selfie captured during authentication against the selfie from the original onboarding session to detect the reuse of identical images. Face recognition scores above a fixed threshold are failed. This setting is disabled by default. | | **_Face Match Threshold_** | Controls the severity on the model that does the face matching process. A high threshold is better for security, but a low threshold is better for conversions. Select one: _Lo_, _Me_, or _Hi_. Default value: _Me_. Note that this setting cannot be deselected; it is a crucial part of the authentication process. | | **_Liveness Threshold_** | Controls the severity on the model that performs liveness checks. A high threshold is better for security, but a low threshold is better for conversions. There are three separate Liveness checks. **_Physical attack_** is selected by default; its default value is _Me_. **_Digital attack_** is deselected by default; its default value is _Lo_. **_Evasion attack_** is deselected by default; its default value is _Me_. | | **_Image Quality Threshold_** | Checks for the quality of the captured selfie. A high threshold is better for security, but a low threshold is better for conversions. Select one: _Lo_, _Me_, or _Hi_. Default value: _Me_. | | **_Lenses validation_** | In the Face Attributes section. Controls whether the system checks if the user is wearing lenses or sunglasses in the selfie. Selected by default. | | **_Mask validation_** | In the Face Attributes section. Controls whether the system checks if the user is wearing a mask in the selfie. Selected by default. | | **_Hat validation_** | In the Face Attributes section. Controls whether the system checks if the user is wearing a hat in the selfie. Selected by default. | | **_Closed eyes validation_** | In the Face Attributes section. Controls whether the system checks if the user's eyes are closed in the selfie. Selected by default. | | **_Brightness validation_** | In the Face Attributes section. Controls whether the system checks for minimum necessary brightness of the image. Selected by default. | ### Scoring Every authentication attempt gets its own score. When Liveness is OFF - The numerical score represents the face recognition/match score. - The face attributes have binary impact on the scoring - if any fail, the attempt fails When Liveness is ON - The numerical score represents combination face recognition/match score and Liveness score. - The face attributes have binary impact on the scoring - if any fail, the attempt fails ## --- - Path: `dashboard-platform-administration/face-capture-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/face-capture-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/face-capture-dashboard.md # Face Capture The Face Capture module captures a user’s face with their device’s camera and runs configurable liveness, face recognition, and image quality checks. It can enroll new users so their face can be matched against an ID photo or used for later authentication. It can also log in returning users using [1:1](/get-started-with-incode/glossary/#11-face-authentication) or [1:N](/get-started-with-incode/glossary/#1n-face-authentication) face authentication. For an overview of this module and how it works, see [Face Capture](/features-and-modules/face-capture/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Face Capture to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New**. 3. From the Modules list, drag and drop the **Face Capture** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Face Capture to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New**. 3. On the **Select Modules** tab, find the **Face Capture** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. Several liveness and validation checks use a threshold scale (Ultra Low, Low, Medium, High, Ultra High) that controls how strictly the check is applied. A lower threshold matches faces with a higher degree of anomalies (more permissive); a higher threshold matches faces with a lower degree of anomalies (more strict). ![](https://developer.incode.com/assets/cd6a624f528a8fb3d1832c65b2844efe.png) | Setting | Description | | -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **_Face capture tutorial_** | When enabled, displays an instructional screen before the capture step to guide the user through the process. | | **_Show preview_** | When enabled, shows the user a preview of the captured face or selfie. | | **_Assisted Onboarding_** | When enabled, allows face capture using the rear camera. | | **_Enable face recording_** | When enabled, records the face capture session for review purposes. | | **_Autocapture timeout (Seconds)_** | The number of seconds the camera will attempt automatic capture before timing out. Default: _25_. If autocapture does not succeed within this window, the user is prompted to retry or switch to manual capture. | | **_Number of image capture attempts_** | The maximum number of times a user can attempt to capture their face before the session ends. Default: _3_. | | **_Reliable age estimation check_** | When enabled, estimates the user's age from the captured selfie and checks it against a minimum age threshold (set in the adjacent "years old" field; default _18_). | | **_Physical attack _**(Liveness) | When enabled, checks the selfie for signs of a physical presentation attack (e.g., printed photo, mask). Threshold sets the strictness of the check. | | **_Digital attack _**(Liveness) | When enabled, checks the selfie for signs of a digital presentation attack (e.g., a face displayed on a screen). Threshold sets the strictness of the check. | | **_Evasion attack _**(Liveness) | When enabled, checks the selfie for signs that the user is attempting to evade detection (e.g., obscuring or distorting their face). Threshold sets the strictness of the check. | | **_Image quality_** | When enabled, validates that the captured image meets a minimum quality standard. Severity is configured in the **Image Quality Severity** dropdown, with options _Ultra Low_, _Low_, _Medium_, _High_, and _Ultra High_. | | **_Occlusion check_** | When enabled, checks whether the user's face is partially obscured in the captured image. Threshold sets the strictness of the check. | | **_Lenses validation_** | When enabled, checks whether the user is wearing glasses or contact lenses that may interfere with capture. | | **_Mask validation_** | When enabled, checks whether the user is wearing a face mask. | | **_Hat validation_** | When enabled, checks whether the user is wearing a hat or other headwear that may obscure the face. | | **_Closed eyes validation_** | When enabled, checks whether the user's eyes are closed in the captured image. | | **_Brightness validation_** | When enabled, checks whether the image brightness is within an acceptable range. | | **_Allow manual review_** | When enabled, sessions that fail face capture after all attempts are routed for manual review instead of being rejected outright. | | **_On-Device Processing_** | When enabled, performs face capture processing on the user's device rather than server-side. |
          --- - Path: `dashboard-platform-administration/face-match-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/face-match-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/face-match-dashboard.md # Face Match The Face Match module compares the user's selfie against their ID photo, their NFC chip photo, or both in a 3-way match. It then returns a confidence score. For an overview of this module and how it works, see [Face Match](/features-and-modules/face-match/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Face Match to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the **Processes** list, drag and drop the **Face Match **module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Face Match to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Face Match **module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. ![](https://developer.incode.com/assets/1e57130a305248d30925364232e91f17.png) | Setting | Description | | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **_Select ID_** | Specifies which ID in a multi-ID session this module applies to (_First ID_ or _Second ID_). Use this when your Workflow or Flow captures more than one identity document. | | **_Disable face match animation_** | When enabled, suppresses the animation shown to the user during face matching. | | **_Face Recognition Severity_** | Sets the strictness of face recognition matching, with options _Low_, _Medium_, and _High_. A higher severity requires a closer match between the compared faces. | | **_Exact face match_** | | | **_Face Matching Type_** | The pair of images compared during face matching. Options: _Selfie vs. Id Photo_, _Selfie vs. NFC Photo_, and _Selfie vs. ID vs. NFC Photo_. | | **_Check face EXIF for software modification_** | When enabled, inspects the EXIF metadata of the captured face image for signs that it was modified by editing software. | | **_Check face EXIF field Data Time Original was not older than the time of addition by more than_** | When enabled, checks that the EXIF `DateTimeOriginal` field on the captured face image is no older than the configured number of seconds before submission. |
          --- - Path: `dashboard-platform-administration/face-onboarding-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/face-onboarding-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/face-onboarding-dashboard.md # Face Onboarding The Face Onboarding module allows a user to begin or resume Onboarding using face recognition, reusing their data from a previous Session with their consent. This reduces friction for returning users. For an overview of this module and how it works, see [Face Onboarding](/features-and-modules/face-onboarding/). ## Supported with: :x: Workflows | :white_check_mark: Flows ## Add Face Onboarding to Flows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Face Onboarding** module and click **Add**. ## Configuration Options Face Onboarding has no configurable settings. ![Image of Face Onboarding module configuration in Flows. Has no configurable options.](https://developer.incode.com/assets/fe95f870509bae9f5581d500fcaff8e1.png)
          --- - Path: `dashboard-platform-administration/field-comparison-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/field-comparison-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/field-comparison-dashboard.md # Field Comparison The Field Comparison module compares fields from different sources, such as OCR data extracted from an ID and information entered by the user, to verify they match. It supports branching, so you can route users down separate paths depending on whether the comparison passes or fails. For an overview of this module and how it works, see [Field Comparison](/features-and-modules/field-comparison-1/). ## Supported with: :x: Workflows | :white_check_mark: Flows ## Add Field Comparison to Flows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Field Comparison** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options Field Comparison has no configurable settings. ![Image of Field Comparison module configuration in Flows. Has no configurable options.](https://developer.incode.com/assets/9988a3c89f6d0273f76418b13e83bca1.png) --- - Path: `dashboard-platform-administration/fiscal-qr-ocr-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/fiscal-qr-ocr-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/fiscal-qr-ocr-dashboard.md # Fiscal QR OCR The Fiscal QR OCR module scans the QR code on a Constancia de Situación Fiscal, the SAT tax document issued in Mexico, and extracts the associated fiscal data. For an overview of this module and how it works, see [Fiscal QR OCR](/features-and-modules/fiscal-qr-ocr/). ## Supported with: :x: Workflows | :white_check_mark: Flows ## Add Fiscal QR OCR to Flows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Fiscal QR OCR** module and click **Add**. ## Configuration Options This module has no configurable settings. ![Image of Fiscal QR OCR module configuration in Flows. Has no configurable options.](https://developer.incode.com/assets/dc6aab7d5825c0dc9c9c3dd6af5a046a.png)
          --- - Path: `dashboard-platform-administration/flows-1` - URL: https://developer.incode.com/dashboard-platform-administration/flows-1/ - Markdown: https://developer.incode.com/dashboard-platform-administration/flows-1.md # Configure Flows Flows are the legacy way to build reusable, linear identity verification journeys. They run modules in a fixed order without conditional logic or branching. We recommend [Workflows](/dashboard-platform-administration/workflows-20/) for all new implementations. Flows remains fully supported, but new capabilities are being built on Workflows. Flows are created and configured in Dashboard. In the left menu, click **Flow Builder** > **Flows**. The Flows page in Dashboard, showing a table with the names and statuses of Flows. On this page, you can: - Search the list of Flows - [Create](#create-flows) or [import](#import-flows) new Flows - [View Sessions](#view-sessions-for-a-flow) that used a Flow - [Copy a Flow URL or ID](#other-flow-actions) - [Edit](#other-flow-actions) a Flow - [View a list of modules](#other-flow-actions) in a Flow - [Pause](#other-flow-actions) a Flow - [Download the Flow configuration](#other-flow-actions) - [Delete](#other-flow-actions) a Flow *** ## Create Flows 1. In the left menu, click **Flow Builder** >**Flows**. 2. Click **New**. 3. In the top left, click **Edit**. Enter a name for the Flow and click **Save**. 4. On the Select Modules tab, browse or search for a module you want to add. Hovering over the module name and click **Add**. The cursor hovers over the ID Capture module, and the Add option appears. 5. Hover over the module name and click **Details & Configurations** to open the configuration panel. Each module has its own settings. You can leave the default settings or customize them to meet your needs. Documentation for individual module settings is in progress. 6. Continue adding and configuring modules to complete the Flow. Use the Flow Preview on the right to confirm the modules you added. Hover over module names to edit configurations or remove modules. The cursor hovers over ID Capture in the Flow Preview, and options to edit or remove the module appear. 7. On the Settings tab, you can customize settings to meet your needs. The default settings work for most cases. 1. If your system is configured with Risk AI Agent or Deepsight, you can enable them for the Flow. Separate licensing is required for each. Contact your Incode Representative for more information. 2. Customize the Session Results settings. | Setting | Description | | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Identity creation** | | | Session Score: Pass | If the session ends with Pass, you can **Approve** Identity creation or **Send to manual review**. Click **Reset All** to remove a selection. | | Session Score: Warn | If the session ends with Warn, you can **Approve** Identity creation, **Send to manual review**, or **Fail** Identity creation. Click **Reset All** to remove a selection. | | Session Score: Failed | If the session ends with Failed, you can **Send to manual review** or **Fail** Identity creation. Click **Reset All** to remove a selection. | | **Session completion** *Optional* | | | Mark Verification as Finished On | Use this drop-down to define which milestone ends the Session. You can select from the following options: **ID Validation Finished**, **Face Validation Finished**, **EKYC Validation Finished**, or **Government Validation Finished** | 3. Customize the User Experience settings. | Setting | Description | Default | | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | | **Getting Started** | | | | Skip intro screen | Sends users directly to verification steps, skipping the launch screen. | Off | | Create Flow template for Onboarding Optimizer | Automatically generates a reusable template based on this Flow to optimize future setups. | Off | | Phishing Resistance | Protects against man-in-the-middle phishing attacks using dynamic QR codes and device-session binding. Also enables **Redirect Desktop attempts to Mobile** and its sub-setting **Disable SMS option**. | Off | | OAuth2 Secured (web only) | Strengthens the security of the user journey against replay attacks with [OAuth2 security protocol](/general-reference/oauth2-secured-sessions/). A **Redirect URL** is required when this setting is enabled. The OAuth clientid is saved in the configuration settings for future reference. | Off | | Redirect Desktop attempts to Mobile | Redirects users who start the Flow on desktop to continue on their mobile device. You can configure the following sub-settings: **Allow "continue on desktop"** (shows users the option to continue on desktop); **Redirect origin only** (redirects users only at the starting point of the Flow; once they switch to mobile, the Flow ends there); **Display result on desktop** (shows the verification result on the original desktop tab after the mobile Flow completes); **Disable SMS option** (removes the SMS option and shows only the QR code to transfer the Flow to mobile). | Off | | In person or assisted Onboarding | Indicates that Sessions using this Flow will happen in person or in branch. | Off | | Hide unsupported browser screen |Lets users continue with any browser. Only Chrome and Safari are officially supported. | Off | | **After Verification** | | | | Redirect URL | The URL users are sent to after completing the onboarding Session. This field is required if **OAuth2 Secured (web only)** is enabled. | | | **Session Control** | | | | Mark Session as "Expired" | Labels Sessions as expired in Dashboard after the specified time of inactivity. Enter the number of minutes before a Session is marked expired. | Off | | Allow multiple Onboarding completions |Allows users to complete the onboarding Flow more than once. | Off | 4. Customize the Compliance & Privacy settings. | Setting | Description | Default | | --------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ------- | | **Age Verification** | | | | Enhanced privacy protection | Shows a privacy-adjusted tutorial. Incode doesn't save any personally identifiable information (PII) except date of birth. | Off | | **Compliance** | | | | Require biometric consent | Shows required consent before biometric capture for users in applicable U.S. states. | Off | | Save verification videos | Merges ID and Face Capture recordings into a single video and stores it with the Session data for audit purposes. | Off | 5. Customize [Cross Checks](/dashboard-platform-administration/cross-check-dashboard/#add-cross-check-to-flows). 6. Customize Verification Rules. 8. Click **Save Changes**. *** ## Import Flows 1. In the left menu, click **Flow Builder** >**Flows**. 2. Click **Import**. The Select Flow Configuration File field appears. 3. Click **Select Flow Configuration File** and browse to the JSON file on your device. 4. Click **Import**. *** ## View Sessions for a Flow 1. In the left menu, click **Flow Builder** >**Flows**. 2. Browse or search for the Flow you want. 3. Click **Open Sessions**. You are redirected to the Sessions page, filtered to show only Sessions that used that Flow. *** ## Other Flow Actions 1. In the left menu, click **Flow Builder** >**Flows**. 2. Browse or search for the Flow you want. 3. Select from the available options: Copy Flow URL is an icon of a link; Edit is an icon of a pencil. - **Copy Flow URL**: Copies the URL needed to start the Flow. - **Edit**: Opens the Flow for editing. - **Copy Flow ID**: Copies the unique identifier for the Flow. - **View Modules**: Hover over this option to see list of modules used in the Flow. 4. Click **Actions **for more options: There are six more options in the Actions menu. - **Pause Flow**: Prevents the Flow from being used in Onboarding. When a Flow is paused, the menu displays **Activate Flow** instead. - **Download Flow Configuration**: Downloads a JSON file of the Flow configuration. - **Copy Embed Code**: Copies the iFrame for the Flow to your clipboard. - **See Log**: Opens a panel showing the change history for the Flow. You can select a date range or view all history. - **Duplicate**: Makes a copy of the Flow. - **Delete Flow**: Permanently deletes the Flow. This cannot be undone. In the confirmation dialog, click **Confirm**.
          --- - Path: `dashboard-platform-administration/forms-and-data-entry-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/forms-and-data-entry-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/forms-and-data-entry-dashboard.md # Forms and Data Entry The Forms and Data Entry module presents one or more custom form screens to collect information from a user. You define the questions, their input types, and whether each is required or optional. In Workflows, form responses can be used as [conditions](/dashboard-platform-administration/configure-workflow-conditions/) to route users to different steps based on their answers. For an overview of this module and how it works, see [Forms and Data Entry](/features-and-modules/forms-and-data-entry/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Forms and Data Entry to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Forms and Data Entry** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Forms and Data Entry to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Forms and Data Entry** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. Each form is made up of one or more pages. Use the numbered page tabs to switch between pages. Click the plus sign (+) to add a new page. Each page has a different title and can contain one or more questions. ![Image of the Forms and Data Entry module's configuration panel. Has two configuration options, plus the option to add a new question.](https://developer.incode.com/assets/257fddd1d3d31da29f44fcbdef51e717.png) ### Title | Setting | Description | | ---------------- | ---------------------------------------------------------------------------------------------------------------------- | | **_Title_** | The title displayed at the top of the form page. Enter the text you want users to see or leave blank to show no title. | | **_Hide title_** | When enabled, hides the title from the form page even if a title is configured. | ### Questions ![When Pre-defined is selected, options for Select a question, Input type, and Make optional appear.](https://developer.incode.com/assets/bbb2096b392bf48ff6016a1bdf4daa9d.png) ![When Customized is selected, options for Enter question, Input, and Make optional appear.](https://developer.incode.com/assets/593ccd98623f5fb880695cbe5bb7efca.png) To add a question, click **New question**. The following settings are available for each question. | Setting | Description | |---|---| | **_Pre-defined_** / **_Customized_** | Determines whether the question uses a pre-defined template or a custom configuration. Select **_Pre-defined_** to choose from a set of common questions with the question text and input type already set. Select **_Customized_** to write your own question text and select the input type manually. | | **_Select a question_**
          _Pre-defined only_ | The pre-defined question to add to the form. Choose from the available options in the dropdown: _ID number, Country of residence, Nationality, Date of birth, Phone number, Email address, CPF, Full name, First name, or Last name_. The **_Input type_** is set automatically based on the selected question and cannot be changed. | | **_Enter Question_**
          _Customized only_ | The custom question text to display to the user. Allows you to manually change the **_Input type_**. | | **_Input type_** | The type of input field presented to the user. When using a pre-defined question, this field is read-only. When using a customized question, select the type that matches the data you want to collect:
          • _Text_: Free-form text input.
          • _Number_: Numeric input.
          • _Date_: Date input in DD/MM/YYYY format. Responses are stored as milliseconds since the Unix epoch (UTC).
          • _Country_: A searchable drop-down showing full country names. Responses are stored as ISO 3166-1 alpha-3 codes: for example, _USA_ and _GBR_.
          • _Phone_: Phone number input.
          • _Email_: Email address input with format validation.
          • _CPF_: Document number input formatted for Brazilian Cadastro de Pessoas Físicas (CPF) numbers.
          • _Yes or No_: A toggle or drop-down for Boolean responses.
          • _Select_: A drop-down for single selection from a defined list of options. | | **_Make optional_** | When enabled, the question is optional and users can proceed without answering it. When disabled, the question is required and **Continue** remains inactive until the user provides a valid response. | Click **Save** after configuring each question. After saving multiple questions, you can drag and drop to reorder them. Click the three dots next to a saved question to edit or delete it. ### Tip **Only ask for what you need**. Every question adds friction and creates privacy obligations. Remove any question that isn't required for compliance, the user journey, or downstream processing. --- - Path: `dashboard-platform-administration/forward-data-to-your-workflow` - URL: https://developer.incode.com/dashboard-platform-administration/forward-data-to-your-workflow/ - Markdown: https://developer.incode.com/dashboard-platform-administration/forward-data-to-your-workflow.md # Forward Data to Your Workflow You can forward custom data when initializing your integrated Workflows. This option is available when the Workflow is initialized on your side via the `/omni/start` endpoint. *** ## Custom Fields The `/omni/start` endpoint accepts a key-value map in the `customFields` parameter. To define these key-value pairs, go to **Configuration** > **General** > **Custom Fields**. Define custom fields in Configuration > General. Custom fields appear on the single session view. *** ## Use Cases The two most common ways to use custom fields are crosschecking collected data and passing internal identifiers. ### Crosscheck Data If you already have a user's first and last name in your system, you can use that data to confirm that the person completing verification matches the existing user. To do this, set up a crosscheck between the data from the ID and the data in your system. 1. Add a Process node to your Workflow and select **Cross Check** from the drop-down. Add Cross Check node to Workflow. 2. Configure the Cross Check node: 1. Click **Add New Comparison**. 2. Enter a **_CrossCheck Name_**. Do not include special characters. 3. Use the drop-downs to select sources and fields to compare. One source should be _CUSTOM\_FIELDS_ and the other is usually _ID_. 4. Set the **Comparison Severity**. This determines the minimum match level required to pass. 5. Click **Save Comparison**. 6. Add more comparisons to the same Cross Check node as needed or return to the Workflow. Click Add New Comparison to add the Cross Check node. The configurable sources and fields for the Cross Check node. 3. Add a [Condition](/concepts-and-architecture/conditions-for-workflows-20/) to set the Yes and No paths after the Cross Check node. For example, if you are checking that first names match, configure the Condition so that a matching first name returns OK. First Name crosscheck comparison must equal OK. ### Pass Internal Identifiers, Tags, and Markers Internal identifiers, tags, and markers distinguish different Sessions or connect with internal systems. #### External Customer ID To connect an Incode Session with your own Session, use the `externalCustomerId` parameter. This is an optional string parameter in the `omni/start` call. #### Configuration ID This is the ID of the Workflow the user will go through. To find it, go to the Workflows page in Dashboard, find the Workflow you want, and click **...** > **Copy ID** in the Actions column. Copy ID is listed third in the Actions column. #### Redirect URL Override the **_Redirect URL_** from a Workflow's settings to redirect per user or group. Use the format: `https://your.url`. --- - Path: `dashboard-platform-administration/geolocation-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/geolocation-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/geolocation-dashboard.md # Geolocation The Geolocation module requests location permission, then captures the precise physical location of the user's device, using its GPS sensor to record coordinates and location fields such as country, state, and city. For an overview of this module and how it works, see [Geolocation](/features-and-modules/geolocation-2/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Geolocation to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Geolocation** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Geolocation to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Geolocation** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. ![Image of the Geolocation module's configuration panel. Has one configuration option.](https://developer.incode.com/assets/8751a1b240a879dd89c257ddde9c3112.png) ### General | Setting | Description | | ------------------------------------ | ----------------------------------------------------------------------------------------------------------- | | **_Allow user to skip geolocation_** | When enabled, users can skip geolocation. Enable this option to reduce drop-off when users deny permission. |
          --- - Path: `dashboard-platform-administration/government-record-verification-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/government-record-verification-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/government-record-verification-dashboard.md # Government Record Verification The Government Record Verification module verifies a person's identity by comparing identity attributes and, where supported, a live selfie against government-held records, producing a match or no-match outcome. For an overview of this module and how it works, see [Government Record Verification](/features-and-modules/government-record-verification/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Government Record Verification to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the **Processes** list, drag and drop the **Government Record Verification** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Government Record Verification to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Government Record Verification** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. ![](https://developer.incode.com/assets/6a46cf98-1704-4ac3-a5cc-b5a64ac56dc8.png) | Setting | Description | | --- | --- | | **Validation Countries** | The countries for which government verification is performed. Select one or more countries from the drop-down menu. Verification will only run for documents issued by the selected countries. If the country you need is not available, contact your Incode representative. | | **Data Validation** | Compares identity attributes extracted from the ID, such as name and date of birth, against the government record for the selected country. | | **Facial Validation** | Compares the live selfie biometric against the government portrait for the selected country. | | **Face and Data** | Performs a biometric comparison of the user's selfie against the photo in the government record alongside identity attribute matching. | | **Use Cropped Id Face Photo** | Only relevant for USA. When selected, the verification uses the photo captured from the front of the ID for biometric comparison instead of a live selfie. | | **Face Match Override Data Score** | Prioritizes the result of the face match check over the data verification score when determining the overall outcome. | | **Fingerprint Validation** | Only relevant for Mexico. The minimum number of fingerprints that must match for the fingerprint validation check to pass. Default: 1. See [INE Fingerprint Validation](/features-and-modules/ine-fingerprint-validation/) for more details. | | **Fingerprint Match Override Score** | Only relevant for Mexico. Prioritizes the result of the fingerprint match check over other scores when determining the overall outcome. See [INE Fingerprint Validation](/features-and-modules/ine-fingerprint-validation/) for more details. | | **Auto Execution** | The verification check runs automatically when the Flow or Workflow reaches this module. |
          --- - Path: `dashboard-platform-administration/id-capture-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/id-capture-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/id-capture-dashboard.md # ID Capture The ID Capture module captures the front and back of a government-issued ID, with auto-capture and quality checks, and produces clean images for processing. For an overview of this module and how it works, see [ID Capture](/features-and-modules/id-capture/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add ID Capture to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **ID Capture** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add ID Capture to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **ID Capture** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. ### General ![](https://developer.incode.com/assets/829734a0e9b1240a86269fd3c0fa190d.png) ![](https://developer.incode.com/assets/220fe6b4caddcc7da9fe9d29f33822f4.png) | Setting | Description | | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **_Set country specific_** | Restricts accepted document types to those issued by a specific country. Enable this when your use case requires country-level document validation. | | **_Accepted Documents_** | The document types that users can present for ID capture. Select one or more from the available options (e.g., _Drivers License_, _Passport_, _Federal ID_). Only the selected document types will be accepted during the capture flow. | | **_Select ID_**
          _Workflows only_ | Specifies which ID in a multi-ID session this module applies to (_First ID_ or _Second ID_). Use this when your Workflow captures more than one identity document. | | **_Second ID_**
          _Flows only_ | When enabled, designates this ID Capture module as the second ID in a multi-ID session. Use this when your Flow captures more than one identity document. | | **_Third ID_**
          _Flows only_ | When enabled, designates this ID Capture module as the third ID in a multi-ID session. Use this when your Flow captures more than two identity documents. | | **_Manual upload ID capture_** | When enabled, allows users to upload an image of their ID from their device instead of capturing it with the camera. | | **_Show document chooser screen_** | When enabled, displays a screen prompting the user to select their document type before capture begins. Recommended when multiple document types are accepted. | | **_ID capture tutorial_** | When enabled, displays an instructional screen before the capture step to guide the user through the process. | | **_Enable ID recording_** | When enabled, records the ID capture session for review purposes. | | **_Only Front Capture Id_** | When enabled, captures only the front of the ID, skipping the back. Use this for document types that do not require a back-side scan. | | **_Back Id Only (barcode)_** | When enabled, captures only the back of the ID and reads the barcode. Use this when only barcode data from the back of the ID is required. | | **_Barcode Capture_** | When enabled, activates barcode scanning during ID capture. | | **_US Smart Capture_** | When enabled, uses enhanced capture logic optimized for US-issued identity documents. | | **_Unordered ID Capture_** | When enabled, allows the front and back of the ID to be captured in any order, rather than requiring front first. | | **_Always capture back of ID_** | When enabled, always requires capture of the back of the ID, regardless of document type. | | **_Do not redact unknown images_** | When enabled, prevents redaction of images that cannot be identified as a known document type. By default, unidentified images are redacted. | | **_Require date of birth_** | When enabled, users will be prompted to scan the back of their ID if date of birth is not detected on the front side. This applies even when the flow is configured as front-only capture, and ensures date of birth is always extracted regardless of document template. | | **_Capture optional ID page_** | When enabled, prompts the user to capture an additional optional page of the ID (e.g., a visa page). | | **_Disable Alignment Classification_** | When enabled, turns off alignment classification during capture, which checks that the ID is properly aligned before accepting the image. Disabling this may speed up capture but can reduce image quality. | | **_US Barcode Classification_** | When enabled, uses barcode classification logic specific to US-issued documents. | | **_Allow manual review_**
          _Flows only_ | | | **_Add watermark to cropped ID_** | When enabled, adds watermark text to cropped ID images to indicate they have been processed. | | **_Enable Device Wallet verification_** | When enabled, allows users to verify their identity using a digital ID stored in their device wallet (e.g., Apple Wallet, Google Wallet) as an alternative to camera capture. See [Digital ID Wallet Verification](/features-and-modules/digital-id-wallet-verification/) and [Supported Digital IDs](/general-reference/supported-digital-ids/). | | **_Enable Digital ID upload_** | When enabled, allows users to submit a digital ID file as an alternative to live camera capture. See [Supported Digital IDs](/general-reference/supported-digital-ids/) for supported schemes by region. | | **_Enable DigiLocker
          _**_Flows only_ | When enabled, lets users verify their identity through DigiLocker. See [Supported Digital IDs: Asia](/general-reference/supported-digital-ids-asia/) for DigiLocker attributes. | | **_Autocapture timeout (Seconds)_** | The number of seconds the camera will attempt automatic capture before timing out. Default: _25_. If autocapture does not succeed within this window, the user is prompted to retry or switch to manual capture. | | **_ID Detection Timeout (Seconds)_** | The number of seconds the system will attempt to detect an ID in the camera frame before timing out. Default: _60_. | | **_Onboarding flow attempts_**
          _Flows only_ | The number of onboarding attempts after which the user drops off. Default: _0_. | | **_Number of image capture attempts_** | The maximum number of times a user can attempt to capture their ID before the session ends. Default: _3_. | ### Redaction The Redaction tab lets you define which fields should be redacted on captured identity documents, configured per country. Each country entry specifies the document type, the document subtype (the specific version or format of that document), the issuing year (which identifies the document version and determines which fields are available for redaction), and the fields to redact. You can add multiple country configurations to a single session using the **Add country** button. ![](https://developer.incode.com/assets/60bd3ece47e157af19ebd7ca8800bba0.png) The following countries are available for redaction configuration. All country entries use **State: ALL**. #### Norway | Document type | Subtype | Issuing year | Fields to be redacted | | ------------------- | --------------------- | ------------ | ------------------------- | | Identification Card | `IDENTIFICATION_CARD` | 2015 | `creditCardNumber`, `ccv` | #### Indonesia | Document type | Subtype | Issuing year | Fields to be redacted | | ------------------- | --------------------- | ---------------- | --------------------- | | Identification Card | `IDENTIFICATION_CARD` | 2000 | `documentNumber` | | Passport | `NATIONAL_PASSPORT` | 2013, 2015, 2022 | `documentNumber` | #### Germany | Document type | Subtype | Issuing year | Fields to be redacted | | ------------------- | ----------------------- | ------------ | ----------------------------- | | Identification Card | `IDENTIFICATION_CARD` | 2007 | `documentNumber` | | Identification Card | `IDENTIFICATION_CARD` | 2010, 2021 | `documentNumber`, `refNumber` | | Identification Card | `TEMP_GERMAN_IDCARD` | 2004 | `documentNumber` | | Passport | `NATIONAL_PASSPORT` | 2007, 2017 | `documentNumber` | | Residence Document | `RESIDENCE_PERMIT` | 2011, 2019 | `documentNumber`, `refNumber` | | Residence Document | `FICTIONAL_CERTIFICATE` | 2020, 2024 | `documentNumber` | #### Hong Kong | Document type | Subtype | Issuing year | Fields to be redacted | | ------------------ | ----------------------------- | ------------ | ---------------------------------- | | Passport | `NATIONAL_PASSPORT` | 2005 | `documentNumber`, `personalNumber` | | Residence Document | `PERMANENT_RESIDENT_IDENTITY` | 2003, 2018 | `documentNumber` | #### Netherlands | Document type | Subtype | Issuing year | Fields to be redacted | | ------------------- | -------------------------------- | ---------------------------- | --------------------- | | Identification Card | `DIPLOMATIC_IDENTIFICATION_CARD` | 2016 | `personalNumber` | | Identification Card | `IDENTIFICATION_CARD` | 2014 | `personalNumber` | | Passport | `NATIONAL_PASSPORT` | 2006, 2014 | `personalNumber` | | Residence Document | `RESIDENCE_PERMIT` | 2014, 2020, 2022 | `personalNumber` | | Drivers License | `DRIVER_LICENSE` | 1990, 2006, 2013, 2018, 2025 | `personalNumber` | #### Japan | Document type | Subtype | Issuing year | Fields to be redacted | | ------------------- | --------------------- | ------------ | --------------------- | | Identification Card | `IDENTIFICATION_CARD` | 2020 | `personalNumber` | #### Thailand | Document type | Subtype | Issuing year | Fields to be redacted | | ------------------- | --------------------- | ------------ | --------------------- | | Identification Card | `IDENTIFICATION_CARD` | 2001 | `religion` | #### Singapore | Document type | Subtype | Issuing year | Fields to be redacted | | ------------------- | ------------------------------ | ------------ | ---------------------------------- | | Identification Card | `IDENTIFICATION_CARD` | 2001 | `documentNumber` | | Passport | `NATIONAL_PASSPORT` | 2005, 2017 | `documentNumber`, `personalNumber` | | Residence Document | `RESIDENCE_PERMIT` | 2005 | `documentNumber` | | Drivers License | `DRIVER_LICENSE` | 2002 | `documentNumber` | | Military | `MILITARY_IDENTIFICATION_CARD` | 2010 | `documentNumber` | #### Korea, Republic of | Document type | Subtype | Issuing year | Fields to be redacted | | ------------------- | --------------------- | ------------ | ---------------------------------- | | Identification Card | `IDENTIFICATION_CARD` | 2000 | `personalNumber` | | Passport | `NATIONAL_PASSPORT` | 2008, 2022 | `documentNumber`, `personalNumber` | | Residence Document | `RESIDENCE_PERMIT` | 2018, 2023 | `documentNumber` | | Drivers License | `DRIVER_LICENSE` | 2000, 2020 | `documentNumber`, `personalNumber` | --- - Path: `dashboard-platform-administration/id-validation-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/id-validation-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/id-validation-dashboard.md # ID Validation The ID Validation module determines whether a submitted identity document is authentic. It analyzes the images captured by the [ID Capture](/features-and-modules/id-capture/) module against known parameters for the document type, runs a set of authenticity checks, and produces a validation result. For an overview of this module and how it works, see [ID Validation](/features-and-modules/id-validation-module/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add ID Validation to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. Ensure the [ID Capture](/dashboard-platform-administration/id-capture-dashboard/) module is in your Workflow. 4. From the **Processes** list, drag and drop the **ID Validation** module into the builder after the ID Capture module. 5. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add ID Validation to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, ensure the [ID Capture](/dashboard-platform-administration/id-capture-dashboard/) module is added to the Flow. After you add ID Capture, the ID Validation module becomes available. 4. For ID Validation, click **Add**. 5. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options After making changes, click **Save Configurations** to apply them. ![Image of the ID Validation module's configuration panel in Workflows. Has 28 configuration options.](https://developer.incode.com/assets/127805d6760ca42121b96f7ff248d2eb.png) ![Image of the ID Validation module's configuration panel in Flows. Has 28 configuration options.](https://developer.incode.com/assets/b5c54cc2504a89ee7006df1f414c8b73.png) | Setting | Description | | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **_Set country specific_** | Restricts validation to documents issued by a specific country. Enable this when your use case requires country-level document validation. | | **_Select ID_**
          _Workflows only_ | Specifies which ID in a multi-ID session this module applies to; for example, _First ID_ or _Second ID_. Use this when your Workflow captures more than one identity document. | | **_Score Severity_** | Sets the strictness threshold used to evaluate the overall validation score: _Soft_, _Relaxed_, _Medium_, or _Conservative_. | | **_Screen ID Liveness Enabled_** | When enabled, checks whether the submitted ID was captured from a live physical document rather than a screen or digital display. | | **_Screen ID Liveness Severity_** | Sets the strictness threshold for the Screen ID Liveness check: _Low_, _Medium_, or _High_. In Flows, this is the **_Threshold_** radio button. | | **_ID Alteration_** | When enabled, checks whether the ID has been digitally or physically altered. | | **_ID Alteration Severity_** | Sets the strictness threshold for the ID Alteration check: _Low_, _Medium_, or _High_. In Flows, this is the **_Threshold_** radio button. | | **_Font Alteration Enabled_** | When enabled, checks for inconsistencies in font rendering that may indicate document tampering. | | **_Paper ID Liveness Enabled_** | When enabled, checks whether the submitted ID is a physical paper or card document rather than a photocopy or printout. | | **_Paper ID Liveness Severity_** | Sets the strictness threshold for the Paper ID Liveness check: _Low_, _Medium_, or _High_. In Flows, this is the **_Threshold_** radio button. | | **_Tamper Check Enabled_** | When enabled, checks the document for signs of physical or digital tampering. | | **_Tamper Severity_** | Sets the strictness threshold for the Tamper check: _Low_, _Medium_, or _High_. In Flows, this is the **_Threshold_** radio button. | | **_Age Verification via Selfie & ID_** | When enabled, compares the apparent age of the user captured in a selfie against the date of birth on the submitted ID. | | **_Fake ID Check_** | When enabled, checks whether the submitted document matches characteristics of known fake or fraudulent IDs. | | **_Fake ID Severity_** | Sets the strictness threshold for the Fake ID Check: _Low_, _Medium_, or _High_. In Flows, this is the **_Threshold_** radio button. | | **_Barcode Content_** | When enabled, reads and validates the barcode on the ID as part of the authenticity check. | | **_Voided ID check_**
          _Flows only_ | When enabled, flags IDs that have been canceled. | | **_Lamination Check_** | When enabled, checks for the presence of security lamination on the ID. | | **_Damaged ID Check_** | When enabled, flags IDs that appear physically damaged in a way that may affect validation reliability. | | **_Barcode only verification_** | When enabled, limits validation to barcode data only, skipping other visual checks. | | **_Underage Check_** | When enabled, flags sessions where the date of birth on the submitted ID indicates the user is under the configured age threshold. | | **_Type Side Cross Check_** | When enabled, verifies that the document type indicated on the front of the ID is consistent with data on the back. | | **_Disable Expiration Date Check_** | When enabled, skips validation of the ID's expiration date. Use this to accept expired documents. | | **_Expiration tolerance (in days)_** | The number of days past a document's expiration date that the system still accepts as valid. Default: 0. | | **_Check if ID is already used by face_** | When enabled, checks whether the identity document has previously been submitted in a session associated with a different face. | | **_Check Front ID EXIF for software modification_** | When enabled, inspects [EXIF](/get-started-with-incode/glossary/#exif) metadata on the front ID image to detect signs that the image was digitally modified using software. | | **_Check Back ID EXIF for software modification_** | When enabled, inspects EXIF metadata on the back ID image to detect signs that the image was digitally modified using software. | | **_Check front ID EXIF field Data Time Original was not older than the time of addition by more than_** | When enabled, validates that the front ID image's EXIF timestamp is within an acceptable window of the time it was submitted. The time window is set in seconds. The default is 30 seconds. | | **_Check back ID EXIF field Data Time Original was not older than the time of addition by more than_** | When enabled, validates that the back ID image's EXIF timestamp is within an acceptable window of the time it was submitted. The time window is set in seconds. The default is 30 seconds. |
          --- - Path: `dashboard-platform-administration/instant-bav-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/instant-bav-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/instant-bav-dashboard.md # Instant BAV The Instant BAV module validates a user's bank account information by checking key details such as name, address, account ID, and balance. For an overview of this module and how it works, see [Instant BAV](/features-and-modules/instant-bav/). ## Supported with: :x: Workflows | :white_check_mark: Flows ## Add Instant BAV to Flows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Instant BAV** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options ![Image of Instant BAV module configuration in Flows. Has two configuration options.](https://developer.incode.com/assets/24f8034475b6f876d429920a08d474a6.png) | Setting | Description | | --------------------- | --------------------------------------------------------------------------------------------------------------- | | **_Country_** | The country for the bank accounts this module verifies. | | **_Number of tries_** | The maximum number of attempts a user is allowed to complete bank account verification before the session ends. |
          --- - Path: `dashboard-platform-administration/manage-candidate-verifications` - URL: https://developer.incode.com/dashboard-platform-administration/manage-candidate-verifications/ - Markdown: https://developer.incode.com/dashboard-platform-administration/manage-candidate-verifications.md # Manage Candidate Verifications Candidate Verification lets your recruiting team confirm a job candidate's identity during the hiring process, on demand, without requiring the candidate to already exist in a connected directory. This helps protect against hiring fraud, such as someone interviewing under a false identity or having another person perform the job on their behalf. Recruiters can request verification for a new or existing candidate via link, SMS, or email, or generate a protected meeting link that requires identity verification before a candidate can join a video call. All verification requests and their results are tracked directly on this page. In the left menu, click **Services** > **Candidate Verification** to access the page. *** ## Send a Verification Request Use the section at the top of the page to start a new verification for a candidate. This section has two tabs: **Existing Candidate** and **New Candidate**. ### Existing Candidate Use this tab to send a verification request to a candidate you've previously added. You can add candidates on the **New Candidate** tab on this page or by using an external trigger, such as an ATS webhook. 1. In the left menu, click **Services** > **Candidate Verification**. 2. Click the **Existing Candidate** tab. 3. In **Candidate Name**, search for and select the candidate you want to verify. 4. Choose how you want to deliver the verification to the candidate: **Via sharing a Link**, **Via SMS**, **Via Email**, or **Protect meeting with Incode**. 5. Choose how long the verification link remains active before it expires. Enter a number and select a unit: **minutes**, **hours**, or **days**. 6. Depending on the verification method selected, the button at the bottom of the section changes: - If you selected **Via sharing a Link**, click **Generate Verification & Copy Link** to create the verification and copy a shareable link to your clipboard. Send this link to the candidate through any channel you choose. - If you selected **Via SMS**, click **Send SMS** to text the verification link directly to the candidate's phone number. - If you selected **Via Email**, click **Send Email** to email the verification link directly to the candidate's email address. - If you selected **Protect meeting with Incode**, click **Generate Verification & Copy Link** to create a verification-gated link for a video meeting. The candidate must complete identity verification before being redirected to the meeting. ### New Candidate Use this tab to add a candidate who hasn't been verified before and request their first verification. Adding a candidate here creates them in your organization's candidate list. 1. In the left menu, click **Services** > **Candidate Verification**. 2. Click the **New Candidate** tab. 3. In **Candidate Name**, enter the name of the candidate you want to add. 4. Choose how you want to deliver the verification to the candidate: **Via sharing a Link**, **Via SMS**, **Via Email**, or **Protect meeting with Incode**. 5. Choose how long the verification link remains active before it expires. Enter a number and select a unit: **minutes**, **hours**, or **days**. 6. Depending on the verification method selected, the button at the bottom of the section changes: - If you selected **Via sharing a Link**, click **Generate Verification & Copy Link** to create the verification and copy a shareable link to your clipboard. Send this link to the candidate through any channel you choose. - If you selected **Via SMS**, click **Send SMS** to text the verification link directly to the candidate's phone number. - If you selected **Via Email**, click **Send Email** to email the verification link directly to the candidate's email address. - If you selected **Protect meeting with Incode**, click **Generate Verification & Copy Link** to create a verification-gated link for a video meeting. The candidate must complete identity verification before being redirected to the meeting. *** ## View Candidates Below the **Existing Candidate** and **New Candidate** tabs, a table lists your organization's candidates and the verification requests sent to them. Click a row in the table to open a dialog listing every verification session tied to that candidate. | Column | Description | | ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Name** | The candidate's name, entered when they were added. | | **User Identifier** | The candidate's unique identifier: their email address or phone number. | | **Sessions** | The number of verification requests sent to this candidate, including pending, successful, failed, and expired ones. | | **Last Update** | The date and time the candidate's most recent verification request was last updated. | | **Expiration Estimation** | The date and time the candidate's most recent verification link expires, based on the **Valid for** duration selected when the request was created. Shows a dash (-) if not applicable. | | **Score** | The verification result: _Pass_, _Warn_, _Fail_, _Not Applicable_, _Needs Review_, _Pass (Manual)_, _Fail (Manual)_, or _Pending (Manual)_. | | **Session Status** | The current status of the verification: _Completed_ or _Not Completed_. | | **Action** | Click the trash icon to permanently [delete](#delete-candidates) this candidate from the table. | *** ## Filter Candidates You can filter the table by one or more criteria to find the candidates or verification requests you need. 1. In the left menu, click **Services** > **Candidate Verification**. 2. Click one of the filter fields above the table: - **Name**: Enter the name of the candidate you want to search for. - **User Identifier**: Enter the email address or phone number for the candidate you want to search for. - **Last Update**: Select **All dates**, **Last Week**, **Last Month**, **Last Quarter**, or **Custom Date Range**. If you select **Custom Date Range**, select a start and end date. - **Score**: Select _Pass_, _Warn_, _Fail_, _Not Applicable_, _Needs Review_, _Pass (Manual)_, _Fail (Manual)_, or _Pending (Manual)_. - **Session Status**: Select _Completed_ or _Not Completed_. 3. Filters are applied immediately. The table displays the requests that fit your criteria, and the filter appears as a tag above the table. 4. Repeat these steps to add any additional filters. Click the **x** on a filter tag to remove it. The dialog showing a candidate's individual sessions can be filtered the same way, using the **Name**, **Last Update**, **Score**, and **Session Status** fields above that table. *** ## Delete Candidates You can permanently delete candidates and their verification history. 1. In the left menu, click **Services** > **Candidate Verification**. 2. In the Action column in the table, click the trash icon. 3. In the confirmation dialog, click **Delete**.
          --- - Path: `dashboard-platform-administration/manage-cases` - URL: https://developer.incode.com/dashboard-platform-administration/manage-cases/ - Markdown: https://developer.incode.com/dashboard-platform-administration/manage-cases.md # Manage Cases Case Management lets reviewers work through Sessions that need a manual look, such as those that failed automated checks. Each row in the table is a **case** tied to a Session. The **Case Management** page in Dashboard shows every case in your organization, along with details about each one. When you first open the page, the following columns appear. | Column | Description | | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Assigned To** | The reviewer assigned to the case, or _Unassigned_ if no one has claimed it yet. | | **Issue** | The type of issue flagged on the case, if any: _Incorrect rejection_, _Incorrect approval_, _Bug_, or _Other_. | | **Opened By** | The user who opened the case. | | **Opened On** | The date and time the case was opened. | | **Resolved By** | The user who resolved the case, if it's been resolved. | | **Resolved On** | The date and time the case was resolved, if it's been resolved. | | **Case Status** | The current status of the case: _Unassigned_, _In Progress_, or _Resolved_. | | **Session Score** | The outcome of the case's Session: _Pass (Manual)_, _Fail (Manual)_, _Pending (Manual)_, _Needs Review_, _Pass_, _Warning_, _Not Applicable_, or _Fail_. | | **ID Type** | The type of identity document submitted in the Session. | | **Country** | The country associated with the Session. | | **Case Number** | The unique ID for the case. | | **Session ID** | The unique ID for the Session tied to the case. | | **Comments** | Any comments left on the case. | On this page, you can: - Filter the cases that are shown - Assign a case, or multiple cases at once, to a reviewer - Review cases assigned to you *** ## Filter Cases You can filter the list of cases by one or more criteria to find the cases you need. You can also use the status options above the table as quick filters. ### Use the Status Options 1. In the left menu, click **Case Management**. 2. Click **Unassigned**, **In Progress**, or **Resolved** to filter by case status. Click **Pass Manual** or **Fail Manual** to filter by session score. Once applied, the option shows the number of cases matching that filter. ### Use Add Filter 1. In the left menu, click **Case Management**. 2. Click **Add Filter** in the top left. 3. Select the filter you want to add: - **Session ID**: Enter the unique ID for the Session tied to the case you want to see. - **Assigned To**: Select the reviewer assigned to the cases you want to see. - **Opened By**: Select the user who opened the cases you want to see. - **Resolved By**: Select the user who resolved the cases you want to see. - **Case ID**: Enter the unique ID for the case you want to see. - **Issue Type**: Select the type of issue flagged on the case: _Incorrect rejection_, _Incorrect approval_, _Bug_, or _Other_. - **Status**: Select the current status of the case: _Unassigned_, _In Progress_, or _Resolved_. - **Session Score**: Select the outcome of the Session tied to the case: _Pass (Manual)_, _Fail (Manual)_, _Pending (Manual)_, _Needs Review_, _Pass_, _Warning_, _Not Applicable_, or _Fail_. - **Country**: Select a country from the drop-down. - **Created At**: Select a start and end date from the calendar to only show cases created in that range. 4. Click **Apply**. The table displays the cases that fit your criteria. 5. Repeat these steps to add any additional filters. *** ## Assign Cases If you have permission, you can assign a single case, or multiple cases at once, to a reviewer, including yourself. Once you assign a case to a reviewer, you cannot mark it as _Unassigned_ again. ### Assign a Single Case 1. In the left menu, click **Case Management**. 2. Click the value in the **Assigned To** column for the case you want to assign. This works whether the case is currently **Unassigned** or already assigned to someone. 3. In the **Assign a Case** dialog, search for and select a reviewer. 4. Click **Assign**. ### Assign Multiple Cases 1. In the left menu, click **Case Management**. 2. Select the checkbox next to each case you want to assign. Click **Cancel** to clear your selection. 3. Click **Assign Case**. 4. In the **Assign a Case** dialog, search for and select a reviewer. 5. Click **Assign**. *** ## Review Cases You can review cases that are assigned to you. 1. In the left menu, click **Case Management**. 2. Click the row for the case you want to review. You may want to [filter](#use-add-filter) the table to see all the cases assigned to you. The case opens, displaying [single Session view](/dashboard-platform-administration/single-session-view/), plus the following information: - **Account Executive**: The name of the account executive for this case's organization. - **Days in Review**: The number of days this case has been in review. 3. Click **Case Resolution** at the bottom. 4. In the Case Resolution panel, select an **Issue** from the drop-down: _Screen Selfie_, _Liveness_, _Screen ID_, _Paper_, _Tamper_, _Paper ID_, _Injection_, _FN_ (False Negative), or _Other_. 5. In **Resolve Case Reason**, enter details about the issue you identified and the case resolution. 6. Click one of the following: - **Resolve**: Change the case status to _Resolved_, but keep the session score the same. - **Fail**: Change the case status to _Resolved_ and the session score to _Fail (Manual)_. - **Approve**: Change the case status to _Resolved_ and the session score to _Pass (Manual)_. 7. Click **Next Session to Review** to open the next case assigned to you.
          --- - Path: `dashboard-platform-administration/manage-custom-watchlists` - URL: https://developer.incode.com/dashboard-platform-administration/manage-custom-watchlists/ - Markdown: https://developer.incode.com/dashboard-platform-administration/manage-custom-watchlists.md # Manage Custom Watchlists The **Custom Watchlists** page lets you maintain your own blocklists and allowlists of individuals, independent of Incode's built-in fraud lists. Use it to review existing entries, add new ones, and control how each entry affects future sessions. This page uses two related terms: - **Entity**: The real-world person or business a watchlist record represents (their name, ID numbers, contact details, and so on). - **Entry**: A single row in the table. One entity can have more than one entry: for example, if they were added to the watchlist more than once, or through different sessions. The table on **Custom Watchlists** can show the following columns. | Column | Description | | --- | --- | | Image | Face image associated with the entry. Click it to open an expanded view. | | Name | User's name associated with the entry. | | Watchlist ID | Unique identifier generated for the entry. | | Created | Date and time the entry was created. | | Updated | Date and time the entry was last modified. | | Block expires on | Date the entry's block expires, if set. | | Phone | Phone number associated with the entity. | | Device Hash | Device identifier associated with the entry, if available. | | Email | Email address associated with the entity. | | ID Number | User's government-issued identifier on file associated with the entry; this is typically their main document number (the CIC). | | Personal ID Number | User's personal identifier on file, such as a CURP. Only shown if mapping has been configured for a relevant ID type or region. | | Birth Date | User's date of birth. | | Watchlist Type | Whether the entry is on the Blocklist or Allowlist. | | Actions | Edit or delete the entry. | On this page, you can: - [Filter the Custom Watchlists that are shown](#filter-custom-watchlists) - [Manually add a single watchlist entity](#add-watchlist-entities) - [Bulk upload watchlist entries](#upload-watchlist-entries) - [Edit watchlist entries](#edit-watchlist-entries) - [Export Custom Watchlists to a CSV file](#export-custom-watchlists) - [Configure your view of the Custom Watchlists table](#configure-custom-watchlists-view) - [Delete watchlist entries](#delete-watchlist-entries) ## Filter Custom Watchlists 1. In the left menu, click **Custom Watchlists**. 2. Click **Add Filter** in the top left. 3. Select the column you want to filter by: - **Name**: Enter the entity name you want to search for. - **Watchlist ID**: Enter the unique identifier for the entry you want to search for. - **Created At**: Select a start and end date from the calendar to only show Custom Watchlists created in that range. - **Updated At**: Select a start and end date from the calendar to only show Custom Watchlists modified in that range. - **Phone**: Enter the phone number for the entity you want to search for. - **Device Hash**: Enter the device hash for the entry you want to search for. - **Email**: Enter the email address for the entity you want to search for. - **Watchlist Type**: Select **Blocklist** or **Allowlist**. - **ID Number**: Enter the government-issued ID number for the entity you want to search for. - **Birthdate**: Select a date from the calendar. - **Expires**: Select a date from the calendar. 4. Click **Apply**. The table displays the Custom Watchlists that fit your criteria. 5. Repeat these steps to add additional filters. ## Add Watchlist Entities You can manually add a single entity to a watchlist. 1. In the left menu, click **Custom Watchlists**. 2. Click the three-dot menu (⋮) in the top right. 3. Select **Add to Watchlist**. The Add Entity to Watchlist dialog opens. 4. Optionally upload a photo, front ID image, and back ID image (JPG, JPEG, or PNG, up to 10 MB each). 5. Enter the entity's details: _**Name**_, _**Birth Date**_, _**ID Number**_, _**Personal ID Number**_, _**Email**_, and _**Phone Number**_. You must include at least a Name or ID Number. 6. Choose the _**Watchlist**_ type (_Blocklist_ or _Allowlist_) and, optionally, a _**Watchlist Expiry**_ date. 7. Click **Add to Watchlist**. ## Upload Watchlist Entries Add multiple entities at once via CSV import. Bulk upload only adds entity data; you must then add photos manually by editing each entry. 1. In the left menu, click **Custom Watchlists**. 2. Click the three-dot menu (⋮) in the top right. 3. Select **Upload Watchlist**. The Upload Watchlist File dialog opens. 4. If needed, click **Download template CSV** to get the correct file format. 5. Drag and drop your CSV file or click to browse and select it. 6. Click **Add to Watchlist**. ### Other Ways to Add Entities In addition to the manual and bulk methods above, entities can be added to a Custom Watchlist through: - **Single Session view**: [Add a user](/dashboard-platform-administration/single-session-view/#risk) directly from the Risk tab in single Session view. This pulls the relevant information from the Session and creates a Custom Watchlist entry automatically. - **Automatic addition**: Enable **Automatically add suspected fraud** in the [Custom Watchlist module](/dashboard-platform-administration/custom-watchlist-dashboard/) to have suspected fraudulent sessions added as entries without manual action. ## Edit Watchlist Entries 1. In the left menu, click **Custom Watchlists**. 2. Click the pencil icon in the **Actions** column for the entry you want to edit. 3. In the Edit Watchlist Entity dialog, update any field: _**Name**_, _**Birth Date**_, _**ID Number**_, _**Personal ID Number**_, _**Email**_, _**Phone Number**_, _**Watchlist**_, and _**Watchlist Expiry**_. 4. Click **Edit Entity** to save. ## Export Custom Watchlists 1. In the left menu, click **Custom Watchlists**. 2. Click the three-dot menu (⋮) in the top right. 3. Select **Export to CSV** to download the current table data. Download starts immediately; no dialog appears. ## Configure Custom Watchlists View You can show, hide, and reorder columns in the Custom Watchlists table. This change only affects your account. Other users still see their own view. 1. In the left menu, click **Custom Watchlists**. 2. Click the three-dot menu (⋮) in the top right. 3. Select **Table Settings**. 4. In the Configure Table View panel: - Click the eye icon next to a column to show or hide it. - Drag a column by its handle (⋮⋮) to reorder it. 5. Click **Save View** to apply your changes. This view of the page is shown on future visits, even after logging out. ## Delete Watchlist Entries Deletion happens immediately with no confirmation dialog, and it cannot be undone. 1. In the left menu, click **Custom Watchlists**. 2. Click the trash can icon in the Actions column for the entry you want to delete. --- - Path: `dashboard-platform-administration/manage-helpdesk-verifications` - URL: https://developer.incode.com/dashboard-platform-administration/manage-helpdesk-verifications/ - Markdown: https://developer.incode.com/dashboard-platform-administration/manage-helpdesk-verifications.md # Manage Helpdesk Verifications Helpdesk Verification lets you manually trigger identity verification for an employee, in real time, without waiting for the employee to initiate the request themselves. This is useful in agent-assisted scenarios such as call center support, in-branch help desk visits, or any time a support agent needs to confirm an employee's identity before granting access, resetting credentials, or resolving an account issue. Support agents can send a verification to the employee via link, SMS, or email, then track the result directly from this same table. In the left menu, click **Services** > **Helpdesk Verification** to access the page. The employees listed here come from your connected [directory integration](/ecosystem-workforce/directory-integrations/). *** ## Send a Verification Request Use the New Verification Request section at the top of the page to start a new verification for an employee. 1. In the left menu, click **Services** > **Helpdesk Verification**. 2. Search for and select the **Employee** you want to verify. Type into the field to filter the drop-down by name or email. 3. Choose how you want to deliver the verification to the employee: **Via sharing a Link**, **Via SMS**, or **Via Email**. 4. Depending on the verification method selected, the button at the bottom of the section changes: - If you selected **Via sharing a Link**, click **Generate Verification & Copy Link** to create the verification and copy a shareable link to your clipboard. Send this link to the employee through any channel you choose. - If you selected **Via SMS**, click **Send SMS** to text the verification link directly to the employee's phone number on file. - If you selected **Via Email**, click **Send Email** to email the verification link directly to the employee's email address on file. *** ## View Verification Requests Below the New Verification Request section, a table lists the Helpdesk verification requests for your organization. | Column | Description | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | **Name** | The employee's name recorded in the directory. | | **User Identifier** | The employee's unique identifier: their email address, username, or directory ID. | | **Last Update** | The date and time the verification request was last updated. | | **Score** | The verification result: _Pass_, _Warn_, _Fail_, _Not Applicable_, _Needs Review_, _Pass (Manual)_, _Fail (Manual)_, or _Pending (Manual)_. | | **Session Status** | The current status of the verification: _Completed_ or _Not Completed_. | *** ## Filter Verification Requests You can filter the table by one or more criteria to find the verification requests you need. 1. In the left menu, click **Services** > **Helpdesk Verification**. 2. Click one of the filter fields above the table: - **Name**: Enter the name of the employee you want to search for. - **User Identifier**: Enter the email address, username, or directory ID for the employee you want to search for. - **Last Update**: Select **All dates**, **Last Week**, **Last Month**, **Last Quarter**, or **Custom Date Range**. If you select **Custom Date Range**, select a start and end date. - **Score**: Select _Pass_, _Warn_, _Fail_, _Not Applicable_, _Needs Review_, _Pass (Manual)_, _Fail (Manual)_, or _Pending (Manual)_. - **Session Status**: Select _Completed_ or _Not Completed_. 3. Filters are applied immediately. The table displays the requests that fit your criteria, and the filter appears as a tag above the table. 4. Repeat these steps to add any additional filters. Click the **x** on a filter tag to remove it.
          --- - Path: `dashboard-platform-administration/manage-integrations` - URL: https://developer.incode.com/dashboard-platform-administration/manage-integrations/ - Markdown: https://developer.incode.com/dashboard-platform-administration/manage-integrations.md # Manage Integrations All integrations are created, configured, and managed from the Integrations page in Dashboard. This page covers the common Dashboard operations that apply to all integration types. For integration-specific setup instructions, see [the guide for the integration type you're configuring](/ecosystem-workforce/integrations-ecosystem-overview/). :::note The Integrations page is only visible when the Integrations Ecosystem feature is enabled for your organization. Contact your Incode Representative if you do not see it. ::: *** ## Create Integrations 1. In the left menu, click **Integrations**. 2. Click **New Integration**. 3. Select from the available integration templates, then click **Continue**. 4. Complete the configuration fields for the selected integration type. The required fields vary by type. Refer to [the guide for your integration](/ecosystem-workforce/integrations-ecosystem-overview/) for details. 5. Click **Save**. After saving, the integration appears on the Integrations page and is ready to use. An Integration ID is generated automatically. *** ## Edit Integrations 1. In the left menu, click **Integrations**. 2. Locate the integration you want to edit. 3. Click the integration card to open its configuration. 4. Make your changes and click **Update**. :::note Changing the Workflow linked to an active integration takes effect immediately. Existing in-progress sessions are not affected, but all new sessions will use the updated Workflow. ::: *** ## Find Integration Details The sections below cover the credentials and identifiers you may need from Dashboard and where to find them. ### API Key 1. In the left menu, click **Configuration**. 2. Click the **API Keys** tab. 3. Click **Copy** for the key you want to use, or click **Generate New API Key** to create a new one. ### Configuration ID 1. In the left menu, click **Workflows**. 2. Open the Workflow you want to use. 3. Copy the Configuration ID from the Workflow details panel or the page URL. ### Integration ID 1. In the left menu, click **Integrations**. 2. Open the integration card. 3. Click **Copy ID** to copy the Integration ID. The Integration ID is required when triggering verification sessions via the [Request New Onboarding API](/features-and-modules/b2b-request-new-onboarding-api/). ### Client ID 1. In the left menu, click **Integrations**. 2. Under **Custom**, open **OIDC Client Credentials**. 3. Copy the Client ID from the integration details. ### Client Secret 1. In the left menu, click **Integrations**. 2. Under **Custom**, open **OIDC Client Credentials**. 3. Click **Generate Secret**. :::note The Client Secret is shown only once. Store it securely in a secrets manager or vault. If lost, you must generate a new one. ::: *** ## View the Directory If you set up a directory-backed integration such as Okta or Microsoft Entra, the **Directory Information** [page](/dashboard-platform-administration/view-directory-information/) appears in the left menu. Click it to see all users synced from the connected directory, as well as each user's enrollment status, identity record, and completed sessions. *** ## Delete an Integration 1. In the left menu, click **Integrations**. 2. Click the integration card to open its details. 3. Select **Delete** and confirm. :::danger Deleting an integration cannot be undone. Any systems or automation that reference the deleted integration's Integration ID will stop receiving verification sessions. Update or remove those references before deleting. ::: --- - Path: `dashboard-platform-administration/manage-users` - URL: https://developer.incode.com/dashboard-platform-administration/manage-users/ - Markdown: https://developer.incode.com/dashboard-platform-administration/manage-users.md # Manage Users **Required role**: [_Admin_](/dashboard-platform-administration/roles-permissions#admin) or higher, or _[Executive with custom permissions](/dashboard-platform-administration/roles-permissions#executive-with-custom-permissions)_ including _users:all_. The Users page lists all the users in your Dashboard organization, as well as their email and phone number. From this page, you can: - [Create users](#create-users) - [Edit users](#edit-existing-users) - [View an activity log for a user](#view-user-activity-log) - [Export the list of users](#export-user-list) - [Delete users](#delete-users) The Users page in Dashboard, showing a list of users, their email addresses, and their phone numbers. *** ## Create Users 1. In the left menu, click **Users**. 2. Click **Add User**. 3. Enter the user's **_Name_**, **_Email_**, and an 11-digit **_Phone_** number. Fields for Name, Email, Phone, and Role. 4. Use the drop-down to select a **_Role_**. See [Roles & Permissions](/dashboard-platform-administration/roles-permissions/) for details. 5. If the role you selected requires additional configuration, use the drop-downs accordingly. 6. Select **Limited Visibility** if you want the user to only see Sessions from a limited timeframe. You configure this timeframe in **Configuration** > **General**. 7. Click **Register User**. After the user is created, they can access Dashboard based on the permissions defined by their role. *** ## Edit Existing Users 1. In the left menu, click **Users**. 2. Browse or search for the user you want to edit. 3. In the Actions column, click **Edit**. 4. Modify the user's information. All fields are editable. Fields for Name, Email, Phone, and Role. 5. Click **Edit User**. A dialog appears confirming your changes were made. *** ## View User Activity Log 1. In the left menu, click **Users**. 2. Browse or search for the user you want. 3. In the Actions column, click **See Log**. 4. In the Activity Log panel, use the drop-down to select a date range: - **Week to Date**: Shows user activity from the most recent Monday to the current day. - **Last Week**: Shows user activity from the previous full week. - **Month to Date**: Shows user activity from the start of the current month to the current day. - **Last Month**: Shows user activity from the previous full month. - **Year to Date**: Shows user activity from the start of the current calendar year to the current day. - **Last Year**: Shows user activity from the previous calendar year. 5. Click **X** to close the Activity Log panel. *** ## Export User List You can export the list of users to a CSV file. This file includes all users in your organization, along with their creation timestamp, phone number, role, and email. If the user has the Executive with custom permissions role, the file also includes any specific permissions they're assigned. The file is automatically saved to your device's default download location. 1. In the left menu, click **Users**. 2. Click **Export to CSV**. A notification appears with the message "Your download will start soon." *** ## Delete Users :::danger You cannot recover a deleted user. ::: 1. In the left menu, click **Users**. 2. Browse or search for the user you want. 3. In the Actions column, click **Delete**. 4. In the confirmation dialog, click **Delete**. After the user is deleted, they can no longer access Dashboard. --- - Path: `dashboard-platform-administration/monitor-compliance` - URL: https://developer.incode.com/dashboard-platform-administration/monitor-compliance/ - Markdown: https://developer.incode.com/dashboard-platform-administration/monitor-compliance.md # Monitor Compliance The **Compliance** page in Dashboard supports compliance reviews and incident investigations. It has two tabs: - **Data Management**: Shows a record for every session or identity whose data has been deleted, whether through automatic data retention rules or an individual deletion request. Use this tab to confirm that a deletion completed successfully. - **Audit Logs**: Shows a trail of actions taken by users and system processes in Dashboard. Use this tab to see who performed an action, when they performed it, and from which IP address. On this page, you can: - Filter the data shown on the Data Management and Audit Logs tabs - View individual audit logs - Export audit logs to a CSV file *** ## Data Management The table on the **Data Management** tab shows the following columns. | Column | Description | | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Name | Name associated with the deleted record, if available. To protect privacy, only the first name and last initial are shown. | | Type | Whether the deleted record was a _Session_ or an _Identity_. | | Entity ID | Unique identifier of the deleted Session or Identity. | | Created On | Date and time the original record was created. | | Data Deleted On | Date and time the record's data was deleted. | | Status | Current state of the deletion: _Init_, _Success_, _Processing_, _Failed_, or _Interrupted_. _Init_ means the deletion task has been created and is queued to run. | Records on this tab cannot be edited or deleted. It provides a read-only trail confirming that deletions occurred. ### Filter Data Management 1. In the left menu, click **Compliance**. 2. Make sure you're on the **Data Management** tab. 3. Click **Add Filter** in the top left. 4. Select the column you want to filter by: - **Deleted Name**: Enter the name you want to search for. - **Deleted Type**: Select _Session_ or _Identity_. - **Deleted ID**: Enter the entity ID you want to search for. - **Created At**: Select a start and end date from the calendar to only show records created in that range. - **Deleted At**: Select a start and end date from the calendar to only show records deleted in that range. - **Status**: Select _Init_, _Success_, _Processing_, _Failed_, or _Interrupted_. 5. Click **Apply**. The table displays the records that fit your criteria. 6. Repeat these steps to add additional filters. *** ## Audit Logs The **Audit Logs** tab records actions taken by Dashboard users and system processes, so you can trace who performed an action, when, and from which IP address. The first time you open this tab in a session, the **Audit logs time preview** dialog appears, letting you know that only events from the past 30 days are displayed by default; you can expand the range with the Timestamp filter. Select **Don't show this anymore** to stop seeing this dialog, or click **Continue** to dismiss it. The table on the **Audit Logs** tab shows the following columns. | Column | Description | | --------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | Timestamp | Date and time the event occurred. | | Event ID | Unique identifier generated for the event. | | Actor | User or system process that performed the action, shown with their ID and, if applicable, email. | | Event | Action that was performed: _Configuration Create_, _Configuration Update_, _Login Attempt_, _Logout_, _User Created_, or _User Deleted_. | | Type | Category of the resource the event affected: _Configuration_, _Executive_, _Flow_, _Workflow_, _Identity_, or _Session_. | Audit log entries cannot be edited or deleted. ### Filter Audit Logs 1. In the left menu, click **Compliance**. 2. Click the **Audit Logs** tab. 3. Click **Add Filter** in the top left. 4. Select the column you want to filter by: - **Event**: Select _Configuration Create_, _Configuration Update_, _Login Attempt_, _Logout_, _User Created_, or _User Deleted_. - **Type**: Select _Configuration_, _Executive_, _Flow_, _Workflow_, _Identity_, or _Session_. - **Actor**: Enter the name or ID of the actor you want to search for. - **Email**: Enter the email address of the actor you want to search for. - **IP Address**: Enter the IP address you want to search for. - **Timestamp**: Select a start and end date from the calendar to only show events that occurred in that range. 5. Click **Apply**. The table displays the events that fit your criteria. 6. Repeat these steps to add additional filters. ### View Audit Logs Click anywhere in the **Timestamp** column for a row in the Audit Logs table to open a panel with more details about that event. The panel slides out from the right side of the screen. The panel has four tabs: - **User**: Shows details about the person or system that performed the action. | Field | Description | | ------------ | ------------------------------------------------------- | | Executive ID | Unique identifier of the user who performed the action. | | Email | Email address of the user who performed the action. | | Role | Role of the user at the time of the action. | - **Event**: Shows details about the action itself. | Field | Description | | ----------------- | -------------------------------------------------------------------------------- | | Timestamp | Date and time the event happened. | | Event IUDD | Unique identifier generated for the event. | | Type | Category of the resource the event affected, such as _SESSION_. | | Event | Name of the action that was performed, such as _Session viewed_. | | Managed Entity ID | ID of the specific record the action affected, such as a session or identity ID. | - **Source**: Shows details about where the action came from. | Field | Description | | ---------- | -------------------------------------------------------- | | IP | IP address the action came from. | | User Agent | Browser and operating system used to perform the action. | - **Location**: Shows details about the part of the system where the action took place. | Field | Description | | ----------- | ---------------------------------------------------------------------- | | Application | Internal service where the action took place, such as _USER\_SERVICE_. | | API Key | API key associated with the request. | ### Export Audit Logs 1. In the left menu, click **Compliance**. 2. Click the **Audit Logs** tab. 3. Click **Export to CSV** in the top right to download the current table data. Download starts immediately; no dialog appears.
          --- - Path: `dashboard-platform-administration/nfc-scan-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/nfc-scan-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/nfc-scan-dashboard.md # NFC Scan The NFC Scan module reads the secure [NFC](/get-started-with-incode/glossary/#nfc-scan) chip embedded in ICAO 9303-compliant travel documents, such as e-passports. It then returns the document holder's data, including the chip's portrait image. For an overview of this module and how it works, see [NFC Scan](/features-and-modules/nfc/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add NFC Scan to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **NFC Scan** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add NFC Scan to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **NFC Scan** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options After making changes, click **Save Configurations** to apply them. ![Image of the NFC Scan configuration page in Workflows. Has three configuration options.](https://developer.incode.com/assets/858d3a5a97930e8cc6ade98143164a9c.png) | Setting | Description | | ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | **_NFC symbol availability check screen_** | Displays a screen prompting the user to confirm that the NFC symbol is visible on their document before scanning begins. Enabled by default. | | **_NFC Validation_** | Activates NFC chip data extraction for verification. Enabled by default. | | **_Display document OCR data confirmation screen before the first NFC scan_** | Shows a screen displaying the data extracted via OCR for the user to confirm before the NFC scan is initiated. Enabled by default. |
          --- - Path: `dashboard-platform-administration/phone-number-input-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/phone-number-input-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/phone-number-input-dashboard.md # Phone Number Input The Phone Number Input module collects a user's phone number and can confirm phone ownership by sending a one-time password (OTP) via SMS. For an overview of this module and how it works, see [Phone Number Input](/features-and-modules/phone-number-input/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Phone Number Input to Workflows 1. In the left menu. Select **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Phone Number Input** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Phone Number Input to Flows 1. In the left menu. Select **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Phone Number Input** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options After making changes, click **Save Configurations** to apply them. ![Image of the Phone Number Input configuration panel in Workflows. Has four configuration options.](https://developer.incode.com/assets/f6cc16fc90e4956e2b786fb7d2be8c27.png) ![Image of the Phone Number Input configuration panel in Flows. Has four configuration options.](https://developer.incode.com/assets/f066c28eaa461a7185d9b3b040a6edef.png) | Setting | Description | | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Enable OTP verification** | The user must confirm their phone number by entering a one-time password (OTP) sent via SMS before the module completes. | | **Expiration duration for OTP (min)** | The number of minutes an OTP remains valid after it is sent. Default: _10_. | | **Enable SNA verification**
          _Flows only_ | Activates Silent Network Authentication as the primary verification method, with SMS OTP as an automatic fallback when SNA is unavailable. | | **Prefill phone number** | Pre-populates the phone number field with a number already associated with the Session. Allows the user to review or edit it before continuing. | | **Skip if phone number already collected**
          _Workflows only_ | Skips this module if a phone number has already been collected in the Session. |
          --- - Path: `dashboard-platform-administration/proof-of-address-capture-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/proof-of-address-capture-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/proof-of-address-capture-dashboard.md # Proof of Address Capture The Proof of Address module captures a proof-of-address document, such as a utility bill, bank statement, or telecom agreement, as an image or PDF. It then extracts the address data through [OCR](/get-started-with-incode/glossary/#ocr) to validate the user's residential address. For an overview of this module and how it works, see [Proof of Address Capture](/features-and-modules/proof-of-address-capture/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Proof of Address Capture to Workflows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Proof of Address Capture** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Proof of Address Capture to Flows 1. In Dashboard, find **Build & Verify** in the left menu. Select **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Proof of Address Capture** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options After making changes on any tab, click **Save Configurations** to apply them. ![Image of the Proof of Address Capture configuration screen. Has six configuration options.](https://developer.incode.com/assets/f33e9d37ae6d4629ed8823df9dbf3b28.png) | Setting | Description | | ---------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **_Title_** | Custom title text displayed to the user on the Proof of Address Capture screen. Leave blank to use the default title. | | **_Text_** | Custom body text displayed to the user on the Proof of Address Capture screen. Leave blank to use the default text. | | **_Address fields are mandatory_** | When enabled, the user must recapture their document if a valid address cannot be extracted from it. | | **_Date field is mandatory_** | When enabled, the user must recapture their document if a required date cannot be extracted from it. | | **_Disable skip POA step_** | When enabled, the user cannot skip the Proof of Address Capture step. By default, the step includes a skip option. | | **_POA as Bank Statement_** | When enabled, submitted documents are routed through a bank statement processor instead of the standard proof-of-address processor. Enable this when you expect users to submit bank statements as their proof of address. |
          --- - Path: `dashboard-platform-administration/qualified-electronic-signature-dashboard-1` - URL: https://developer.incode.com/dashboard-platform-administration/qualified-electronic-signature-dashboard-1/ - Markdown: https://developer.incode.com/dashboard-platform-administration/qualified-electronic-signature-dashboard-1.md # Qualified Electronic Signature The Qualified Electronic Signature module shows the user documents to sign, collects their consent, and captures a Qualified Electronic Signature (QES), the highest-assurance electronic signature under the [EU eIDAS Regulation](https://eur-lex.europa.eu/eli/reg/2014/910/oj/eng). A qualified certificate from a Qualified Trust Service Provider (QTSP) backs the signature, making it legally equivalent to a handwritten signature across EU member states. For an overview of this module and how it works, see [Qualified Electronic Signature](/features-and-modules/qualified-electronic-signature/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Qualified Electronic Signature to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Qualified Electronic Signature** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Qualified Electronic Signature to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Qualified Electronic Signature** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. ![Image of the Qualified Electronic Signature module's configuration panel. Has five configuration options.](https://developer.incode.com/assets/ae1179dcb9954a6601cc39c9d3b2b1c3.png) | Setting | Description | | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **_Region_** | The region for which Qualified Electronic Signature is configured. Country-specific configurations are available. Contact your Incode representative for more information. | | **_Allow user to upload document_** | Allows the user to upload a PDF document to sign. Disabled by default. | | **_Allow user to download signed document_** | Allows the user to download the signed document. Enabled by default. | | **_Type of certificate for signature_** | The certificate type used to generate the signature. Select one of the following: _One time_ (single-use certificate), _Short term_ (valid for multiple signers or documents), or _Long term_ (extended validity). | | **_Display email as part of issued certificate_** | Includes the user's email address in the issued certificate. Disabled by default. |
          --- - Path: `dashboard-platform-administration/review-authentications` - URL: https://developer.incode.com/dashboard-platform-administration/review-authentications/ - Markdown: https://developer.incode.com/dashboard-platform-administration/review-authentications.md # Review Authentications The **Authentications** page in Dashboard shows every authentication attempt in your organization, along with details about each one. Authentications are [1:1](/get-started-with-incode/glossary/#11-face-authentication) or [1:N](/get-started-with-incode/glossary/#1n-face-authentication) face searches performed against your identity pool, separate from onboarding Sessions. When you first open the page, the following columns appear. | Column | Description | | ------------------------- | ------------------------------------------------------------------------------------------------------- | | **User** | The profile photo captured during the authentication attempt. Click the photo to see an expanded image. | | **Transaction ID** | The unique ID generated for the authentication attempt. | | **Identity** | The unique ID of the identity matched during the authentication, if one was found. | | **Source ID** | The identifier of the source system that initiated the authentication, or _NA_ if none was provided. | | **Device Type** | The type of device used for the authentication: _iOS_, _Android_, _Webapp_, or _NA_. | | **Device Name** | The model of the device used for the authentication, or _NA_ if unavailable. | | **Version** | The operating system version of the device used, or _NA_ if unavailable. | | **Timestamp** | The date and time the authentication attempt occurred. | | **Liveness** | Whether the liveness check succeeded for the authentication attempt. | | **Confidence** | The confidence score of the face match, or _NA_ if a score wasn't generated. | | **Video Record** | Whether a video recording exists for the authentication attempt. | | **Blocklisted** | Whether the matched identity is on a blocklist. | | **Blocklist Confidence** | The confidence score of the blocklist match, or _NA_ if not applicable. | | **Final Result** | The outcome of the authentication attempt: _Pass_ or _Fail_. | | **Authentication Mode** | The matching mode used for the authentication: _1:1_ or _1:N_. | | **Authentication Method** | The method used to perform the authentication, such as _server_, or _NA_ if unavailable. | | **Recognition Threshold** | The confidence threshold configured for a successful face match, or _NA_ if not configured. | | **Spoof Threshold** | The confidence threshold configured for spoof detection, or _NA_ if not configured. | On this page, you can: - Filter the authentications that are shown - Export authentications to a CSV file - Configure your view of the Authentications table *** ## Filter Authentications You can filter the list of authentications by one or more criteria to find the authentications you need. 1. In the left menu, click **Authentications**. 2. Click **Add Filter** in the top left. 3. Select the filter you want to add: - **Transaction ID**: Enter the unique ID for the authentication attempt you want to see. - **Identity**: Enter the unique ID of the identity you want to see. - **Identity Availability**: Select _Available_ or _Not Available_. - **Source ID**: Enter the source ID you want to search for. - **Device Type**: Select _iOS_, _Android_, _Webapp_, or _N/A_. - **Device Name**: Enter the device model you want to search for. - **Version**: Enter the OS version you want to search for. - **Timestamp**: Select a start and end date from the calendar to only show authentications that occurred in that range. - **Liveness**: Select _Success_ or _Fail_. - **Confidence**: Select _Success_, _Fail_, or _N/A_. - **Final Result**: Select _Pass_ or _Fail_. 4. Click **Apply**. The table displays the authentications that fit your criteria. 5. Repeat these steps to add any additional filters. *** ## Export Authentications to CSV 1. In the left menu, click **Authentications**. 2. Click the three-dot menu (**⋮**) in the top right. 3. Select **Export to CSV**. Download starts immediately; no dialog appears. *** ## Configure Authentications View You can show, hide, and reorder columns in the Authentications table. This change only affects your account. Other users still see their own view. 1. In the left menu, click **Authentications**. 2. Click the three-dot menu (**⋮**) in the top right. 3. Select **Table Settings**. The Configure Table View panel slides out from the left. 4. In the Configure Table View panel: - Click the eye icon next to a column to show or hide it. - Drag a column by its handle (**⋮⋮**) to reorder it. 5. Click **Save View** to apply your changes. This view of the page is shown on future visits, even after logging out. --- - Path: `dashboard-platform-administration/review-ocr-data-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/review-ocr-data-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/review-ocr-data-dashboard.md # Review OCR Data The Review OCR Data module extracts text from a captured identity document using [Optical Character Recognition (OCR)](/get-started-with-incode/glossary/#ocr)​. It then shows that text to the user to confirm it's correct before the session continues. When enabled, users can correct missing or misread fields. For an overview of this module and how it works, see [Review OCR Data](/features-and-modules/review-ocr-data/). ## Supported with: :white_check_mark: Workflows | :x: Flows ## Add Review OCR Data to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Review OCR Data** module into the builder. Place it after the [ID Capture](/dashboard-platform-administration/id-capture-dashboard/) module. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options After changing anything, click **Save Configurations** before closing the configuration panel. ![Image of the Review OCR Data module's configuration page. Has two configuration options.](https://developer.incode.com/assets/5bd9d9ac477333c00cca9afacac5bd38.png) | Setting | Description | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **_Select ID_** | Specifies which ID in a multi-ID Session this module applies to: _First ID_ or _Second ID_. Use this when your Workflow captures more than one identity document. | | **_Editable OCR_** | Allows the user to edit and correct the OCR-extracted values displayed on the review screen. Useful when a field is missing or was misread: for example, when an address is not detected on the document. Enabling this setting may require back-end enablement. Contact your Incode Representative for more information. |
          --- - Path: `dashboard-platform-administration/review-verification-sessions` - URL: https://developer.incode.com/dashboard-platform-administration/review-verification-sessions/ - Markdown: https://developer.incode.com/dashboard-platform-administration/review-verification-sessions.md # Review Verification Sessions Sessions represent completed Onboardings or Authentications. The Sessions page in Dashboard shows you all completed Sessions in a table. This table includes details about the Session, such as the Session ID, the user's Name, timestamps, the final Score, and more. ![Sessions page table showing Session ID, CURP, Name, Phone Number, Flow, and Started At columns, with an Add Filter button.](https://files.readme.io/53258f9626417484de26bdafebc47d4054c31c960e9a2e4e2225f6329b102403-Sessions.png) On this page, you can: - Filter the Sessions that are shown - Configure the view of the page - Click a Session to enter [single Session view](/dashboard-platform-administration/single-session-view/), which provides detailed data for the Session - Start a new manual Session - Export the Sessions list *** ## Filter Sessions You can filter the list of Sessions by one or more criteria to find the Sessions you need. 1. In the left menu, click **Sessions**. 2. Click **Add Filter **in the top left. 3. Select the filter you want to add. ![Sessions filter panel with criteria organized by category, including Session Data, Identification, Device Data, and eKYB.](https://files.readme.io/abd6625dcfc12c94e204d5866f877a263b1777cce084c279ae18c58af000652f-SessionsFilters.png) 3) Depending on your selection, configure the filter. 4) Press `Enter` or click **Apply**. The table displays the Sessions that fit your criteria. 5) Repeat these steps to add any additional filters. *** ## Configure Sessions View You can change the view of the Sessions table by hiding or reordering columns. Changing the view is only applied to your user; it does not impact how others see this page. 1. In the left menu, click **Sessions**. 2. Click the three dots > **Table Settings**. 3. In the side panel, click and drag to reorder the columns. Click the eye icon next to a column to hide or show it. 4. Click **Save View**. This view of the page is shown on future visits, even after logging out. *** ## Start a Manual Session Manual sessions allow you to initiate verification directly from Dashboard by sending an SMS link, rather than triggering it from your application. This is typically used in agent-assisted scenarios such as call center support, in-branch verification, or re-onboarding a user who needs to redo their verification. 1. In the left menu, click **Sessions**. 2. Click the three dots > **New Manual Session**. 3. Enter the customer's phone number. Change the country calling code if needed. 4. Use the **_Flow Type_** drop-down to select either Flow or Workflow. 5. Use the second drop-down to **_Select Session Flow_** or Workflow, depending on your Flow Type. 6. Click **Send SMS**. *** ## Export Sessions Exporting a session creates a shareable record of verification outcomes outside Dashboard, useful for compliance archiving, audits, or sharing with stakeholders who lack Dashboard access. 1. In the left menu, click **Sessions**. 2. Click the three dots, then one of the following: - **Export to CSV**: Prepares a CSV file. The system shows a notification when the file is ready to download, and another when it has successfully downloaded. You can find the file in your computer's default Downloads folder. - **Export to CSV with PDF links**. Prepares a CSV file with links to customers' **CURPs** (Mexico only) or **Names**, depending on what you select in the dialog. Paste the values in the dialog, then click **Submit**.
          --- - Path: `dashboard-platform-administration/roles-permissions` - URL: https://developer.incode.com/dashboard-platform-administration/roles-permissions/ - Markdown: https://developer.incode.com/dashboard-platform-administration/roles-permissions.md # Roles & Permissions This page describes the roles and permissions available in Dashboard. Roles are assigned when [creating users](/dashboard-platform-administration/manage-users/#create-users) but can be changed later by [editing the user](/dashboard-platform-administration/manage-users/#edit-existing-users). *** # Executive This is the lowest-level role in Dashboard. Users with this role can see and review Sessions they worked on in a single organization. *** # Executive with Custom Permissions This role has no default access. You must configure granular permissions for the user based on the sections of Dashboard you want them to access. Some sections of Dashboard are enabled by feature flags and may not be available for your organization. Contact your Incode Representative with any questions. The following permissions are available for this role: | Permission | Access Details | | :-------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ALL | Grants full access to every permission listed in this table, as long as the Dashboard section is enabled for your organization. | | users:all | Grants access to the [Users](/dashboard-platform-administration/manage-users/) section and all user management functions. Users with this permission cannot modify their own information or role. | | sessions:all | Grants access to the Sessions section and all related functions, including the single session view. You can apply **Limited Visibility** to restrict the timeframe for sessions available for the user. | | authentications:all | Grants access to the Authentications section and all related functions. To access Sessions or Identities related to an Authentication, the user must also have **sessions:all** and **identities:all**. | | identities:all | Grants access to the Identities section and all related functions. To access Sessions or Authentications related to an Identity, the user must also have **sessions:all** and **authentications:all**. | | flows:all | Grants access to create, edit, and delete [Flows](/dashboard-platform-administration/flows-1/). This includes edit access for all modules enabled in the organization. | | custom-watchlist:all | Grants access to the Custom Watchlist section of Dashboard. The user can view and edit all watchlist entities, manually add an entry to either the Allowlist or the Blocklist, upload a watchlist from their device, or export the watchlist to their device. To create a watchlist entity from an Identity, the user must also have **identities:all**. | | status:all | Grants access to status.incode.com, which shows system operations and any incidents. Users can subscribe to receive updates about outages. | | configuration:all | Grants access to all tabs in the Configuration section. | | analytics:all | Grants access to the Analytics section. The user can view data and metrics on the organization's performance, monitoring, eKYB, and eKYC. | | workflows:all | Grants access to create, edit, and delete [Workflows](/dashboard-platform-administration/workflows-20/). This includes edit access for all modules enabled in the organization. | | cms:agent | Grants agent-level access to the Case Management section. | | cms:reviewer | Grants reviewer-level access to the Case Management section. | | compliance:all | Grants access to the Compliance section. This section includes a table view of data added to the system, including new Sessions and Identities. It also includes an audit log of all user activity in the organization. Users can export the audit log to a CSV. | | escalations:all | Grants access to the Escalations section. This section shows a table view of escalated Sessions. The table includes the Session ID, the reason for escalation, the escalation status, the Session decision, and more. To access Sessions related to an Escalation, the user must also have **sessions:all**. | | directory-information:all | Grants access to the Directory Information section. | | integrations:all | Grants access to the Integrations section. | | helpdesk-verifications:all | Grants access to the Helpdesk Verification section. | | candidate-verifications:all | Grants access to the Candidate Verification section. | *** # Admin This role can: - Access a single organization - View all sections in dashboard - Create and edit users with the following roles: Admin, Executive, and Executive with custom permissions This role cannot: - Create new organizations - Create users with the following roles: Super Admin, Integrator, Admin of multiple organizations *** # Admin of Multiple Organizations This role grants the same access as the Admin role but allows this access for multiple organizations. When assigning this role, you must select which organizations the user will have admin access to. *** # Integrator This role allows a user to create child organizations. This role can: - Create and delete child organizations - Preview all pages from the organization and child organizations - Create users with the following roles: Admin of multiple organizations, other roles This role cannot: - Create users with the following roles: Super Admin, Integrator (will be changed)
          --- - Path: `dashboard-platform-administration/single-identity-view` - URL: https://developer.incode.com/dashboard-platform-administration/single-identity-view/ - Markdown: https://developer.incode.com/dashboard-platform-administration/single-identity-view.md # Single Identity View Single Identity view contains all the information Incode has stored about a user's Identity, including their documents, Sessions, and Authentications. :::note The information and images provided on this page are examples. Specific data or details may differ in your configuration. ::: *** ## Enter Single Identity View 1. In the left menu, click **Identities**. 2. Find the Identity you want to review. You can [use filters](/dashboard-platform-administration/view-identities/#filter-identities) to sort the table. 3. Click an Identity to view its details. *** ## Tabs Single Identity view is organized into four tabs: **General**, **Documents**, **Sessions**, and **Authentications**. ### General The General tab shows the Identity holder's selfie, name, status, country, and key details. At the top, next to the identity holder's name, you may see one or both of the following labels: - **Identity confirmed**: Incode successfully verified the identity based on the completed verification checks. - **Protected**: The Identity is covered by an Incode Protect guarantee. Below the name, summary cards show: - **Date of Entry**: The date this Identity was created. - **Sessions**: The number of Sessions linked to this Identity. - **Authentications**: The number of Authentications linked to this Identity. - **Protect Guarantee**: The guaranteed amount covered by Incode Protect if eligible identity fraud occurs. Only appears for Protected Identities. **General information** shows the Identity holder's personal data: - **Phone**: The Identity holder's phone number. - **Identity**: The unique identifier for the Identity. - **Date of Birth**: The Identity holder's date of birth. - **Personal ID Number**: The Identity holder's personal ID number, if collected. - **Address**: The Identity holder's address. - **Email**: The Identity holder's email address. - **National ID Number**: The Identity holder's national ID number, if collected. **Directory information** shows the directory entries linked to this Identity, with one group per connected directory: for example, an Entra or Okta directory. Each directory group shows: - **Name**: The Identity holder's name as recorded in that directory. - **Username**: The Identity holder's username in that directory. - **Email**: The Identity holder's email address in that directory. - **User ID**: The unique identifier for the Identity holder within that directory. - **Phone Number**: The Identity holder's phone number, if collected. - **Date of Birth**: The Identity holder's date of birth, if collected. - **Street Address**: The Identity holder's street address, if collected. - **Location**: The Identity holder's location, if collected. - **Region**: The Identity holder's region, if collected. - **Postal Code**: The Identity holder's postal code, if collected. - **Country**: The Identity holder's country, if collected. Fields that don't have data show a dash (**-**). If the Identity holder isn't linked to any directory, this section doesn't appear. **Location** shows a map with pins for the Identity holder's Government ID and Device Location addresses. Beside the map, those addresses appear as text: - **Government ID**: The address on file from the Identity holder's government-issued ID. - **Device Location**: The location of the device used during verification. Shows _N/A_ if not available. ### Documents The Documents tab lists every document type Incode can capture, grouped under **All Documents**. It also shows electronic signatures, verbal signatures, and signed contracts under **Signatures**. Click a document type to expand it, or click **Expand all** / **Collapse all** to open or close every section at once. If the Identity holder hasn't submitted a document of that type, the section shows _N/A_. If they have, the section shows: - A photo of the captured document. - The country that issued the document. - The document's ID number. - The document's expiration date, if applicable. ### Sessions The Sessions tab lists every [Session](/dashboard-platform-administration/review-verification-sessions/) linked to this identity. | Column | Description | | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Session ID** | The unique identifier for the Session. Click it to open [single Session view](/dashboard-platform-administration/single-session-view/) for that Session. | | **CURP** | The identity holder's CURP (Clave Única de Registro de Población, a personal identification number issued in Mexico), if collected. | | **Phone** | The identity holder's phone number. | | **Flow** | The name of the Flow or Workflow used for the Session. | | **Date & Time** | The date and time the Session took place. | | **Version** | The platform used for the Session: for example, _Web_. | | **Score** | The verification result: _Pass_, _Fail_, or _Needs Review_. | | **Validation** | Whether the result was determined automatically or needs manual review. | | **Status** | The current status of the Session: _Completed_ or _Not Completed_. | ### Authentications The Authentications tab lists every [Authentication](/get-started-with-incode/glossary/#authentication) attempt linked to this identity. If none exist, the tab displays "No authentications." | Column | Description | | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **User** | The Identity holder's photo. | | **Transaction ID** | The unique identifier for the Authentication attempt. | | **Identity** | The unique identifier for the Identity. | | **Source ID** | The identifier of the source Session, if applicable. | | **Device Type** | The type of device used for the attempt. | | **Device Name** | The name of the device used for the attempt. | | **Version** | The platform version used for the attempt. | | **Timestamp** | The date and time of the attempt. | | **Liveness** | Whether the attempt passed liveness detection. | | **Confidence** | The confidence score for the face match. | | **Video Record** | A link to the video recorded during the attempt, if available. | | **Blocklisted** | Whether the Identity holder is on the blocklist. | | **Blocklist Confidence** | The confidence score for the blocklist match, if applicable. | | **Final Result** | The overall result of the attempt: _Pass_ or _Fail_. | | **Authentication Mode** | Whether the attempt compared against one record ([1:1](/get-started-with-incode/glossary/#11-face-authentication)) or searched across many ([1:N](/get-started-with-incode/glossary/#1n-face-authentication)). | | **Authentication Method** | The method used to authenticate the Identity holder. | | **Recognition Threshold** | The confidence score required for a match. | | **Spoof Threshold** | The confidence score required to flag a spoof attempt. | *** ## Add an Identity to a Watchlist Use the **Blocklist** and **Allowlist** buttons at the top of single Identity view to add the Identity holder to a watchlist. 1. Enter single Identity view. 2. Click **Blocklist** or **Allowlist** at the top. *** ## Delete Identity PII Data Delete an identity holder's personally identifiable information (PII) when you no longer need to retain it. 1. Enter single Identity view. 2. Click the three dots (**⋯**) in the top right. 3. Select **Delete Identity PII Data**.
          --- - Path: `dashboard-platform-administration/single-session-view` - URL: https://developer.incode.com/dashboard-platform-administration/single-session-view/ - Markdown: https://developer.incode.com/dashboard-platform-administration/single-session-view.md # Single Session View Single Session view contains all the information about an Onboarding or Authentications attempt, including data, captured images, the Flow or Workflow used, and the result. :::note The information and images provided on this page are examples. Specific data or details may differ in your configuration. ::: *** ## Enter Single Session View 1. In the left menu, click **Sessions**. 2. Find the Session you want to review. You can [use filters](/dashboard-platform-administration/review-verification-sessions/#filter-sessions) to sort the table. 3. Click a Session to view its details. *** ## Sections Single Session view contains multiple sections. The sections and information displayed in them depends on the Onboarding Flow or Workflow used for the Session. ### Overview The section at the top of single Session view shows the user's selfie and the following information: | Field | Description | | ---------------------------------- | ------------------------------------------------------------------------------------------- | | **Workflow **or **Flow** | The name of the Workflow or Flow used for the verification Session. | | **Session ID** | The unique identifier for the Session. | | **Session Start** | The date and time the Session began. | | **Session End** | The date and time the Session ended. | | **Expired At** | The date and time the Session expired. If the Session has not expired, this field is empty. | | **Organization** | The organization associated with the Session. | | **Session Status** | The current status of the Session. For example: Completed. | | **Total Score** | The overall verification result for the Session: Pass or Fail. | ### Workflows The Workflows tab shows the user's progression through the Workflow, including: - The time they started the Workflow - Each module they completed - The conditions they met or did not meet - The time they completed the Workflow - The Workflow result, if the user completed the Workflow ![Workflow tab showing Workflow progress with six steps and an OK result.](https://developer.incode.com/assets/c005c93e1444ac3b2cfd1e4b629083db.png) This tab does not appear if the session used a Flow. ### ID Verification The ID Verification tab includes three sections: - **ID Verification**: Shows the ID verification tests performed and the result of each. At the top, it indicates the total ID verification score and the severity used when calculating that score. Severity controls how strongly failed ID checks deduct points from the total score by applying a multiplier to the checks’ weights:⁠ - **Conservative**: Multiplier 1.0 (strictest; full deduction) - **Medium**: Multiplier 0.7 - **Relaxed**: Multiplier 0.5 (more lenient) - **Soft**: Multiplier 0.0 (failed checks don’t impact the score) - **ID OCR**: Shows the data extracted from the ID using [Optical Character Recognition (OCR)](/get-started-with-incode/glossary/#ocr), including data extracted from the [Machine-Readable Zone (MRZ)](/get-started-with-incode/glossary/#mrz). The total score at the top estimates the accuracy of the OCR-extracted ID data. - **Capture Attempts**: Shows how many attempts the user took to capture their ID and selfie. Expand each section to see the photo the user took. ### Face Recognition The Face Recognition tab compares the user's selfie and ID photo. It shows the results of checks for face masks, lenses, closed eyes, and hats, if configured in the Workflow. It also shows the results of brightness and image quality checks. The total score at the top indicates how confident Incode is that the selfie and ID photo match. ### Liveness Detection The Liveness Detection tab shows the Session's liveness scores. Liveness detection confirms that a selfie was captured from a live person rather than from a photo, video, or synthetic image. Depending on how the Workflow is configured, the tab can show up to three scores: - **Physical Check**: Confidence that the selfie is not a mask or printed photo - **Digital Check**: Confidence that the selfie is not a screen replay or injected video - **Evasion Check**: Confidence that there was no attempt to bypass detection If [Deepsight](/features-and-modules/deepsight/) is enabled, the Deepsight tab appears instead. ### Deepsight The Deepsight tab shows [Deepsight](/features-and-modules/deepsight/) results for the Session, including the signals and checks used to detect sophisticated fraud such as injection and deepfake attacks. It includes three sections: - **Multi-Modal Intelligence (MMI)**: Deepsight's core detection results, broken down by attack category. Only checks enabled in the Flow or Workflow appear as active results. Checks that weren't enabled appear as not applicable. - **Trust Checks**: Higher-level trust signals summarized as pass/fail results, grouped into three categories: - Device trust - Behavior trust - Camera trust - **Media**: Deepsight-related media, including selfie videos and direct video links. You can also view all capture attempts, which is useful for investigation. ### GovMatch The GovMatch tab shows government-source verification results for the Session. It includes three sections: - **Summary**: The overall GovMatch score and the provider used. If the check couldn't run, an error code appears here. - **Data Match**: A field-level comparison of the Session's captured ID data against government database records, plus a Data Match score. - **Face Match**: A comparison of the Session's selfie against the government database portrait, plus a Face Match score. This section only appears when the provider supports face comparison. If GovMatch is running in shadow mode, a banner indicates that results don't affect the session's Total Score. ### Video The Video tab displays recordings captured during the Session. It includes two sections: - **Video Selfie**: Appears for Video Selfie Sessions. Shows pass/fail results for basic recording checks, including: - File is present - Video track is present - Audio track is present - File is not empty - **Recordings**: Video recordings from ID Capture and Face Capture. You can view and download these recordings. If recordings aren't enabled for the Session's Flow or Workflow, or weren't successfully uploaded, the tab may be empty. If [Deepsight](/features-and-modules/deepsight/) is enabled, Deepsight-captured video appears in the Deepsight tab instead. ### Business The Business tab only appears if the [eKYB](/features-and-modules/ekyb/) or [Watchlist Business](/features-and-modules/business-watchlist/) modules ran during the Session. It displays different information, depending on which module ran: - **eKYB results**: Business identity details (name, address, registration/tax identifier, registration status) and verification outcomes (name, address, city, postal code matches). May also include owners, UBOs, and directors. - **Business Watchlist results**: Business-specific sanctions and PEP screening results. ### Risk The Risk tab shows fraud and risk signals for the Session that fall outside standard ID and face verification scores. It includes the following sections: - **Watchlist**: Potential matches against watchlist entries, when a Watchlist module is enabled for the Flow or Workflow. If a user matched any entry in the watchlist, the specific field that triggered the match is indicated. If no results appear, the module may not have run or returned no matches. You can add a user to a watchlist in single Session view. Click the three dots in the top right and select **Allowlist** or **Blocklist**. A new watchlist entry is created by extracting data from session. Next to Add face to database, the three dots icon is clicked. Options for Allowlist and Blocklist appear. - **Risk Signals**: Device and network risk signals, including device reputation, bot level, VPN/proxy likelihood, emulator detection, OS anomaly, remote software level, incognito mode, and screenshots taken. - **Behavior Risks**: Interaction pattern signals, including time spent, context switches, copy/paste events, autofill events, and hesitation percentage. Depending on your organization's configuration, the Risk tab may also include outputs from third-party risk providers. ### Other The Other tab shows supporting Session metadata. It includes the following sections: - **Consents**: The consents presented to the user during the Session, shown as they appeared onscreen. Each entry includes the consent status and timestamp. If a user didn't accept a consent, the Session may still complete, but the consent appears as not signed. This depends on your [configuration](/dashboard-platform-administration/configuration-consents-tab/). Shows the consent's title, checkbox text, if the user signed, and the date and time they signed. * **Event Log**: A chronological list of all events in the Session. Useful for debugging Flow and Workflow progress and confirming what executed. - **Device Details**: Device and network information, including device identifiers, OS, browser, SDK version, and IP location. - **Device Risk**: An overall Device Risk result with available sub-checks, including device reputation, bot level, VPN/proxy detection, emulator detection, OS anomaly, mocked browser, remote software level, incognito mode, and screenshots taken. - **Behavioral Risk**: An overall Behavioral Risk result with available sub-checks, including motion status, virtual camera detection, inspector opened, and ID/selfie stats analysis. Interaction signals such as time spent, context switches, copy/paste, and autofill events may also appear. - **Other Documents:** Captured document artifacts from Document Capture or other document modules, when enabled for the Flow or Workflow. - **Location**: Document and device location data. - **Signatures**: Signature artifacts captured during the session. Drawn signatures appear as images. Checkbox signatures are shown as JSON web tokens (JWTs) you can store or share with your compliance or legal team. - **Forms Answers**: User input provided for the questions configured in the [Forms and Data Entry](/features-and-modules/forms-and-data-entry/) module. ![The Forms Answers section on the Other tab in single Session view shows form questions and answers.](https://developer.incode.com/assets/0b12b7b8a7067e6405bc48febca490a5.png) *** ## Add a Face to the Database Add face to the database to create an [Incode Identity](/get-started-with-incode/glossary/#incode-identity) record for the user from the session's captured face and ID data. This enrolls the face in Dashboard so it can be referenced in future checks and generates a `FACE_ADDED_TO_DATABASE` event in **Compliance** > **Audit Logs**. The button appears when an identity record doesn't yet exist for the session. 1. Enter single Session view. 2. Click **Add Face to Database** at the top. *** ## Escalate a Session Escalate a session when you need Incode's internal teams to review a problem tied to that session. Common reasons include false approvals or rejections, classification or OCR errors, and bugs or incorrect data shown in Dashboard. 1. Enter single Session view. 2. Click **Escalate** at the top. 3. In the Escalation dialog, select an **Escalation Reason** from the drop-down. 4. If the **Issues** drop-down appears, select the issue related to the escalation reason. 5. In **Comments**, enter details about why you're escalating this session. 6. Click **Open Escalation**.
          --- - Path: `dashboard-platform-administration/video-conference-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/video-conference-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/video-conference-dashboard.md # Video Conference The Video Conference module connects the user with a live agent over video and audio to conduct an identity verification interview. The agent can request that documents be shown on camera and complete any verifications needed to meet regulatory or business requirements. For an overview of this module and how it works, see [Video Conference](/features-and-modules/video-conference/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Video Conference to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Video Conference** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Video Conference to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Video Conference** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save Configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. ![Image of the Video Conference module's configuration page. Has one configuration option.](https://developer.incode.com/assets/6c5e02c8855ec1134f334db7e7e801c0.png) ### General | Setting | Description | | --------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | **_Enable conference OTP_** | Requires the user to verify their identity using a one-time passcode (OTP) before the video conference session begins. |
          --- - Path: `dashboard-platform-administration/video-selfie-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/video-selfie-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/video-selfie-dashboard.md # Video Selfie The Video Selfie module records a short video of the user performing a guided series of actions, including capturing their ID and selfie, to confirm physical presence and run liveness and face match checks. It can also capture voice consent. For an overview of this module and how it works, see [Video Selfie](/features-and-modules/video-selfie/). ## Supported With: :white_check_mark: Flows | :white_check_mark: Workflows > **Prerequisites:** Video Selfie requires the ID Capture and Face Capture modules to be completed earlier in the same session. These prior steps provide the reference data used for all downstream comparisons within this module. ## Add Video Selfie to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Video Selfie** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. > **Note:** In Workflows, Dashboard does not enforce that Face Capture is present before Video Selfie. Adding Video Selfie without a preceding Face Capture step will produce unexpected behavior. Additionally, the **Use as Selfie** setting has a known issue in Workflows that may cause session errors. See the setting description below for details. ### Add Async Resolution Video Selfie is an asynchronous module. It finishes the user interaction quickly, but the final result is not ready immediately. If you run normal branching conditions directly after an asynchronous module, the logic may break. A Process node called Async Resolution prevents this. It instructs the back end to wait for Video Selfie to finish before evaluating conditions and producing a final score or decision. Every branch of your Workflow that includes Video Selfie must include an Async Resolution node before it ends. You can only add conditions after Async Resolution. 1. Open the Workflow where you added the Video Selfie module. 2. From the **Async** list, drag and drop the **Async Resolution** node into the builder. Place it at the end of each branch that includes a Video Selfie module. > **Note:** This is only required for Workflows, not Flows. ## Add Video Selfie to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find Video Selfie and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. > **Note:** In Flows, Dashboard does not allow you to add Video Selfie if you have not previously selected Face Capture. This prevents misconfigured sessions. ## Configuration Options After making changes on any tab, click **Save configurations** to apply them. The settings you see in your configuration options may differ from those documented below. Contact your Incode representative for more information. ### General | Setting | Description | | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **_Face Recognition Severity_** | Sets the strictness threshold for the face recognition check. Options: _Low_, _Medium_ (default), _High_. Higher severity requires a closer match between the selfie captured during Video Selfie and the selfie from the prior Face Capture step. | | **_Use as Selfie_** | When enabled, the selfie captured during Video Selfie is used as the Face Capture for the session. This allows Video Selfie to substitute for a separate Face Capture step. **Note:** This option has a known issue in Workflows that causes a session error when no preceding Face Capture step is present. It works correctly in Flows. | | **_Liveness_** | When enabled, runs a real-time liveness check during the selfie capture to confirm the user is physically present and not a spoof or static image. | | **_ID Scan_** | When enabled, prompts the user to show their identity document during the video recording. | | **_Compare ID Enabled_** | When enabled, compares the ID shown during Video Selfie against the ID captured in the earlier ID Capture step to verify it is the same document. | | **_Compare OCR Enabled_** | When enabled, compares the full name extracted via OCR from the ID shown during Video Selfie against the OCR data captured in the earlier ID Capture step. | | **_Tutorials_** | When enabled, displays instructional screens guiding the user through the Video Selfie steps before recording begins. | | **_Allow Video Quality results to affect score_** | When enabled, video quality checks can affect the session score. These checks include whether the video file is present, is non-empty, and contains both video and audio. When disabled (default), these checks are recorded but do not affect scoring. **Note:** This setting is not fully supported in Workflows. Enabling it in a Workflow may not produce the expected score impact. | | **_Seconds_** | The number of seconds at the end of the video to evaluate when **_Execute video quality check for the last seconds of the video_** is enabled. Default: _15_. | | **_Authorization screen_** | When enabled, displays a screen to the user before the video recording begins. | | **_Voice Consent_** | When enabled, prompts the user to read a consent statement aloud during the recording. The spoken text is transcribed and validated against the expected statement. When **_Voice Consent_** is enabled, all video quality checks must pass for the Video Selfie score to have a chance of success. | | **_Questions Count_** | The number of questions presented to the user during the Voice Consent step. Default: 3. Only applicable when **_Voice Consent_** is enabled. |
          --- - Path: `dashboard-platform-administration/view-directory-information` - URL: https://developer.incode.com/dashboard-platform-administration/view-directory-information/ - Markdown: https://developer.incode.com/dashboard-platform-administration/view-directory-information.md # View Directory Information The Directory Information page in Dashboard shows the people and directories connected to your organization through Incode's directory integrations, such as Okta or Microsoft Entra. It also shows the verification Sessions tied to each person. In the left menu, click **Services **> **Directory Information** to access the page. It's organized into two tabs: **People** and **Directories**. *** ## People The People tab lists everyone found across your connected directories. Use the search bar to look up a person. Click **Name**, **Email**, **Username**, or **Identity ID** above the search bar to choose which field to search by; the search bar's placeholder text updates to match your selection. | Column | Description | | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Name** | The person's name recorded in the directory. | | **Email** | The person's email address, if collected. Shows a dash (-) if not available. | | **Username** | The person's username in the directory. | | **Identity ID** | The unique identifier for the corresponding [Identity](/dashboard-platform-administration/view-identities/), if one exists. Click it to open [Single Identity view](/dashboard-platform-administration/single-identity-view/) for that Identity. Shows a dash (-) if the person isn't linked to an Identity. | ### View a Directory Profile Click a row on the People tab to open that person's directory profile. This shows their name, email, and username at the top. The profile is organized into two tabs: **Summary** and **Sessions**. - **Summary**: Shows a card for each directory the person belongs to, labeled with the directory's name. Each card shows: - **Name**: The person's name as recorded in that directory. - **Username**: The person's username in that directory. - **Email**: The person's email address, if collected. - **User ID**: The unique identifier for the person within that directory. - **Phone Number**: The person's phone number, if collected. - **Date of Birth**: The person's date of birth, if collected. - **Street Address**: The person's street address, if collected. - **Location**: The person's location, if collected. - **Region**: The person's region, if collected. - **Postal Code**: The person's postal code, if collected. - **Country**: The person's country, if collected. Fields that don't have data show a dash (-). - **Sessions**: Lists every [Session](/dashboard-platform-administration/review-verification-sessions/) linked to this person. | Column | Description | | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Session ID** | The unique identifier for the Session. Click it to open [single Session view](/dashboard-platform-administration/single-session-view/) for that Session. | | **Flow** | The name of the Flow or Workflow used for the Session. | | **Started At** | The date and time the Session began. | | **Updated At** | The date and time the Session was last updated. | | **Score** | The verification result: _Pass_, _Pass (Manual)_, _Fail_, _Fail (Manual)_, _Needs Review_, or _Not Applicable_. | | **Session Status** | The current status of the Session: _Completed_ or _Not Completed_. | *** ## Directories The Directories tab shows the directories connected to your organization and when each one last synced. If no directories are connected, the tab shows **0 directories** and a **Manage Integrations** button. Click **Manage Integrations** to go to the Integrations page, where you can [set up](/dashboard-platform-administration/manage-integrations#create-integrations) a [directory integration](/ecosystem-workforce/directory-integrations/). Once directories are connected, each one appears with: - **Status**: The directory's sync status, such as _Active_, _Pending_, or _Expired_. - **Last synced**: How long ago the directory last synced (for example, _2 hours ago_). Hover over the timestamp to see the exact date and time.
          --- - Path: `dashboard-platform-administration/view-escalations` - URL: https://developer.incode.com/dashboard-platform-administration/view-escalations/ - Markdown: https://developer.incode.com/dashboard-platform-administration/view-escalations.md # View Escalations You can [escalate a session](/dashboard-platform-administration/single-session-view/#escalate-a-session) when you need Incode to review a problem tied to that session. Instead of reporting an issue over email or a call, you can submit it directly from Dashboard and get automatic confirmation that it's been received. The **Escalations** page in Dashboard allows you to track the status of every Session you've escalated. The escalation's status is updated in the table as it moves through review. You'll be notified when a fix is live. Clicking a row in the table on the **Escalations** page opens single Session view for that escalation. The table can show the following columns. | Column | Description | | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Session ID | Unique identifier of the session the escalation was raised for. | | Opened On | Date and time the escalation was created. | | Resolved On | Date and time the escalation was resolved, if applicable. | | Status | Current stage of the escalation in Incode's review pipeline: _In Progress_, _Closed_, _Released to Demo_, _Resolved_, or _Opened_. _Released to Demo_ means a fix has been deployed to the Demo environment, ahead of its release to production. | | Issue Found | Whether Incode's review confirmed an issue with the session: _Found_ or _Not Found_. | | Issue Type | Category of the issue Incode's review identified, such as _Liveness_ or _Face Recognition_. | | Resolution Reason | Reason recorded by Incode when the escalation is resolved. | | Opened By | Name of the user who opened the escalation. This may be an Incode team member if the escalation was opened on your behalf. | | Session Decision | Outcome of the underlying session: _Pass_, _Warning_, _Fail_, _Not Applicable_, _Needs Review_, _Pass (Manual)_, _Fail (Manual)_, or _Pending (Manual)_. | | Submitted Reason | Reason selected when the escalation was opened: _False Approval_, _False Rejection_, _OCR_, _Classification_, _ID Validation Crosscheck_, _Bug_, or _Other_. | | Submitted Issue | Issue category selected when the escalation was opened, such as _ID Verification_ or _Missing Data_. | | Submitted Comment | Optional comment provided when the escalation was opened. | | Escalation ID | Unique identifier generated for the escalation. | On this page, you can: - Filter the escalations that are shown - Upload multiple escalations at once via CSV import - Configure your view of the Escalations table *** ## Filter Escalations 1. In the left menu, click **Escalations**. 2. Click **Add Filter** in the top left. 3. Select the column you want to filter by: - **Session ID**: Enter the session ID you want to search for. - **Escalation ID**: Enter the unique identifier for the escalation you want to search for. - **Opened By**: Enter the name of the user who opened the escalation. - **Opened On**: Select a start and end date from the calendar to only show escalations opened in that range. - **Resolved On**: Select a start and end date from the calendar to only show escalations resolved in that range. - **Issue Type**: Enter the issue type you want to search for. - **Issue Found**: Select _Found_ or _Not Found_. - **Status**: Select _In Progress_, _Closed_, _Released to Demo_, _Resolved_, or _Opened_. - **Session Decision**: Select _Pass_, _Warning_, _Fail_, _Not Applicable_, _Needs Review_, _Pass (Manual)_, _Fail (Manual)_, or _Pending (Manual)_. - **Submitted Reason**: Select _False Approval_, _False Rejection_, _OCR_, _Classification_, _ID Validation Crosscheck_, _Bug_, or _Other_. - **Submitted Issue**: Select from the available issue categories (for example, _ID Verification_, _OCR_, _Liveness_, _Face Recognition_, _Missing Data_, or _Other_). 4. Click **Apply**. The table displays the escalations that fit your criteria. 5. Repeat these steps to add additional filters. *** ## Upload Escalations Add multiple escalations at once via CSV import. 1. In the left menu, click **Escalations**. 2. Click the three-dot menu (**⋮**) in the top right. 3. Select **Upload Escalations**. The Upload Escalation File dialog opens. 4. If needed, click **Download template CSV** to get the correct file format. 5. Drag and drop your CSV file or click to browse and select it. 6. Click **Add to Escalations**. *** ## Configure Escalations View You can show, hide, and reorder columns in the Escalations table. This change only affects your account. Other users still see their own view. 1. In the left menu, click **Escalations**. 2. Click the three-dot menu (**⋮**) in the top right. 3. Select **Table Settings**. The Configure Table View panel slides out from the left. 4. In the Configure Table View panel: - Click the eye icon next to a column to show or hide it. - Drag a column by its handle (**⋮⋮**) to reorder it. 5. Click **Save View** to apply your changes. This view of the page is shown on future visits, even after logging out.
          --- - Path: `dashboard-platform-administration/view-identities` - URL: https://developer.incode.com/dashboard-platform-administration/view-identities/ - Markdown: https://developer.incode.com/dashboard-platform-administration/view-identities.md # View Identities Incode Identities are reusable, verified identity records. Once a user verifies their identity, the Incode Platform references it across other experiences. The user doesn't have to verify again, and their identity stays accurate and secure. Each user has only one Identity; all their documents, Sessions, and Authentications are contained in it. The **Identities** page in Dashboard shows every Identity in your organization, along with details about each one. When you first open the page, the following columns appear. | Column | Description | | ---------------------- | -------------------------------------------------------------------- | | **Name** | The name of the identity holder. | | **Enabled On** | The date and time the identity was created. | | **Identity** | The unique ID for the identity record. | | **Country** | The country associated with the identity, shown by its country code. | | **National Number** | The identity holder's national ID number, if collected. | | **Personal ID Number** | The identity holder's personal ID number, if collected. | | **Birthdate** | The identity holder's date of birth. Shows _NA_ if not available. | On this page, you can: - Filter the Identities that are shown - Configure the view of the page - Click an Identity to enter [single Identity view](/dashboard-platform-administration/single-identity-view/), which provides detailed data for the Identity - Export the Identities list *** ## Filter Identities 1. In the left menu, click **Identities**. 2. Click **Add Filter** in the top left. 3. Select the column you want to filter by: - **Name**: Enter the name you want to search for. - **Enabled On**: Select a date from the calendar. - **Identity**: Enter the unique ID you want to search for. - **Country**: Select a country from the drop-down. - **Birthdate**: Select a date from the calendar. - **National Number**: Enter the national number you want to search for. - **Personal ID Number**: Enter the personal ID number you want to search for. 4. Click **Apply**. The table displays the Identities that fit your criteria. 5. Repeat these steps to add additional filters. *** ## Configure Identities View You can change the view of the Identities table by hiding or reordering columns. Changing the view only affects your own account; it doesn't change how others see this page. 1. In the left menu, click **Identities**. 2. Click the three-dot menu (**⋮**) in the top right. 3. Select **Table Settings**. 4. In the **Configure Table View** panel: - Click the eye icon next to a column to show or hide it. - Drag a column by its handle (**⋮⋮**) to reorder it. 5. Click **Save View** to apply your changes. This view of the page is shown on future visits, even after logging out. *** ## Export Identities 1. In the left menu, click **Identities**. 2. Click the three-dot menu (**⋮**) in the top right. 3. Select **Export to CSV**. Download starts immediately. Find the file in your computer's default Downloads folder.
          --- - Path: `dashboard-platform-administration/watchlist-business-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/watchlist-business-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/watchlist-business-dashboard.md # Watchlist Business This module screens business entities against global sanctions lists, Politically Exposed Persons (PEP) databases, and adverse media. It is a processing node and must be added to a Workflow or Flow after business data has been collected. For an overview of this module and how it works, see [Watchlist Business](/features-and-modules/business-watchlist/). {/ _This module being a processing node makes sense to me, but it isn't listed under the Processes section in the Workflow UI. It's at the end of the Modules section. TODO: Confirm if it's a processing node._ /} ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Watchlist Business to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. From the Modules list, drag and drop the **Watchlist Business** module into the builder. 4. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Watchlist Business to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Watchlist Business** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save Configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode Representative for more information. ![Image of the Watchlist Business module's configuration page. It has six configuration options.](https://developer.incode.com/assets/781d84378e53446bd6d777f0564e406a.png) | Setting | Description | | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **_Business Name_** | The name of the business to search. This field is mandatory. The value is pulled from data collected earlier in the Session or can be supplied directly via API. | | **_Business Country_** | The country or countries of operation used to filter search results. This field is mandatory. Filters apply to PEP entities and entities with at least one matching country value. Entities on sanctions lists appear in results regardless of the country filter. Entities with adverse media mentions only, or with no country assigned, are also not affected by this filter. | | **_Configure Search Profile_** | Uses a search profile defined in your provider's configuration to determine which watchlist types are searched. You can configure either a search profile or watchlist types, not both. | | **_Configure Watchlist Types_** | Allows you to select one or more specific watchlist types to search. Options include _sanction_, _warning_, _fitness-probity_, _pep_, _pep-class-1_ through _pep-class-4_, and FATF-aligned adverse media categories. You can configure either a search profile or watchlist types, not both. | | **_Fuzziness_** | Controls how closely search results must match the supplied business name. Ranges from _0.0_ (strict matching) to _1.0_ (loose matching). Default: 1.0. | | **_Subscribe for updates_** | Subscribes to ongoing updates for this search. When the search results are updated, Incode sends a notification to the webhook URL [configured](/dashboard-platform-administration/configuration-webhooks-tab/#configure-watchlist-update-webhook) in your organization's Dashboard settings. |
          --- - Path: `dashboard-platform-administration/watchlist-dashboard` - URL: https://developer.incode.com/dashboard-platform-administration/watchlist-dashboard/ - Markdown: https://developer.incode.com/dashboard-platform-administration/watchlist-dashboard.md # Watchlist The Watchlist Business module screens business entities against global sanctions lists, Politically Exposed Persons (PEP) databases, and adverse media, returning any matches found across the configured sources. As a processing module, it runs after user data has been collected by a Forms module or by ID Capture followed by ID Validation. Watchlist matches on first name and last name only; middle names are not processed. For an overview of this module and how it works, see [Watchlist](/features-and-modules/watchlist/). ## Supported with: :white_check_mark: Workflows | :white_check_mark: Flows ## Add Watchlist to Workflows 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **New** or select an existing Workflow. 3. Ensure a module that collects the user's name and date of birth (such as ID Capture followed by ID Validation, or a Forms module) is in your Workflow. 4. From the **Processes** list, drag and drop the Watchlist module into the builder after the data-collection module. 5. You can click the three dots > **Edit** on the module node to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Add Watchlist to Flows 1. In the left menu, click **Flow Builder** > **Flows**. 2. Click **New** or select an existing Flow. 3. On the **Select Modules** tab, find the **Watchlist** module and click **Add**. 4. You can click **Details & Configurations** to open the [Configuration Options](#configuration-options) panel and adjust settings as needed. ## Configuration Options This section details all the configuration options available for this module. After changing anything, click **Save configurations** before closing the configuration panel. The options you see in your configuration may differ from those documented below. Contact your Incode representative for more information. ![](https://developer.incode.com/assets/cbe9efdd1c2e457435a6d10d2ce3707c.png) | Setting | Description | | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | **Include customer's birth year** | When enabled, narrows the search by including the customer's birth year as a filter. Use this to reduce false positives on common names. | | **Country of operation** | Filters results by the entity's country of operation or office. Select one or more countries from the drop-down. Country filtering does not apply to entities on sanction lists, entities with adverse media mentions only, or entities with no country assigned—these always appear regardless of the country filter. | | **Configure watchlist types** | When enabled, displays a **_Watchlist Types_** drop-down for selecting which categories the search should cover (such as sanctions, PEP classes, fitness-probity, and FATF-aligned adverse media categories). Configure either watchlist types or a search profile, not both. | | **Configure search profile** | When enabled, displays a **_Search Profile_** input where you can specify a predefined search profile to use for the search. Configure either a search profile or watchlist types, not both. | | **Fuzziness** | Determines how closely returned results must match the supplied name. The slider ranges from 0 to 1. A value of _0_ requires an exact match, and a value of _1_ allows the loosest matching. Default: _1_.

          :warning: **Important**: Dashboard configuration for fuzziness does not automatically carry over to direct API calls. To call the endpoint directly, include `fuzziness` explicitly in the request body. | | **Subscribe for updates** | When enabled, subscribes the search to ongoing updates. When the underlying watchlist data for a search changes, Incode sends a notification to your configured webhook so the updated result can be retrieved. For setup instructions, see [Watchlist Webhook](/general-reference/global-watchlists-webhook/). | ## Add Conditions [Conditions](/dashboard-platform-administration/configure-workflow-conditions/) let you branch the Workflow based on a result. Conditions are optional for Watchlist, but you can add one or more Conditions after the module to route the session based on what the search returned. To add a Condition for Watchlist: 1. Drag a Condition into the builder from the left panel. Place it after the Watchlist module. 2. In the first drop-down, find the **Global Watchlist** section and select one of the conditions listed below. | Condition | Description | | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Watchlist risk level | The search risk level, returned as one of: _LOW_, _MEDIUM_, _HIGH_, _UNKNOWN_. :warning:**Deprecated — do not use. ** | | Watchlist warning match score | | | Watchlist match status | The search match status, returned as one of: _NO MATCH_, _FALSE POSITIVE_, _POTENTIAL MATCH_, _TRUE POSITIVE_, _UNKNOWN_, _TRUE POSITIVE APPROVE_, _TRUE POSITIVE REJECT_. :warning:**Deprecated — do not use. ** | | Watchlist total hits | The total number of hits returned by the search. | | Watchlist sanctions match score | | | Watchlist total matches | The total number of matches returned by the search. | 3. In the second drop-down, select an operator. 4. In the value field, enter or select the value to compare against. 5. Select the **Yes path** or **No path** radio button to route the Workflow when the Condition is met. 6. Click **Save condition**.
          --- - Path: `dashboard-platform-administration/workflows-20` - URL: https://developer.incode.com/dashboard-platform-administration/workflows-20/ - Markdown: https://developer.incode.com/dashboard-platform-administration/workflows-20.md # Configure Workflows Workflows define the onboarding and authentication experiences. Use Dashboard to build and customize your Workflows. Refer to [Workflows Overview](/concepts-and-architecture/workflows/) to understand the core concepts behind Workflows. Workflows are created and configured in Dashboard. In the left menu, click **Flow Builder** > **Workflows**. The Workflows page in Dashboard, displaying a table of configured workflows, their publish dates, and statuses. From this page, users with appropriate permissions can: - [Filter](/dashboard-platform-administration/workflows-20/#filter-workflows) the Workflows that are shown - [Create](/dashboard-platform-administration/workflows-20/#create-workflows) or [import](/dashboard-platform-administration/workflows-20/#import-workflows) new Workflows - Click a Workflow to view or edit it - [Test](/dashboard-platform-administration/workflows-20/#test-a-workflow) a Workflow - [Pause](/dashboard-platform-administration/workflows-20/#other-workflow-actions) a Workflow from use - [Copy](/dashboard-platform-administration/workflows-20/#other-workflow-actions) the Workflow URL or ID - [Export](/dashboard-platform-administration/workflows-20/#other-workflow-actions) the Workflow configuration - [Delete](/dashboard-platform-administration/workflows-20/#other-workflow-actions) a Workflow *** ## Filter Workflows You can filter the list of Workflows by one or more criteria to find the Workflow you need. 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Click **Add Filter**. 3. Select the type of filter you want to add. Add Filter is clicked, and the Workflow name, Created at, Published at, and Number of sessions options appear. 4. Configure the filter. Press _Enter_ or click **Apply** for the filter to take effect. | Filter | Instructions | | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- | | Workflow Name | Enter the **Workflow Name**. | | Created at | Click **Start Date** and use the calendar to select a date. Do the same for **End Date**. This filter does not allow selecting specific times. | | Published at | Click **Start Date** and use the calendar to select a date. Do the same for **End Date**. This filter does not allow selecting specific times. | | Number of Sessions (more than) | Enter a number or use the arrows to set the number of Sessions that used a Workflow. | 5. Repeat these steps to add additional filters. *** ## Create Workflows When you create a new Workflow, you can start with a blank canvas or choose built-in [template](/dashboard-platform-administration/workflows-20/#workflow-templates). 1. In the left menu, click **Flow Builder** >**Workflows**. 2. Click **New**. 3. The system gives a default name to the Workflow. In the top left, click **Edit** to rename it. Click **Save**. 4. In the Modules panel, hover over each module for an overview of what it does and how it appears to the user. The cursor hovers over the ID Capture module, and a short description and image of the module's user experience appear. 5. Drag modules onto the canvas to build your Workflow. You can also click **Select a template** on the canvas or **Templates** in the bottom left corner to start from a [template](#workflow-templates). 6. After adding a module to the canvas, click the three dots > **Edit** to open the configuration panel. Each module has its own settings. You can leave the defaults or customize to meet your needs. Documentation for individual module settings is in progress. 7. Continue dragging modules to the canvas in the order you want the user to experience them. You can also hover over a connecting line and click **Add** to insert a node. The node types are: - **Module**: The parts of the onboarding process completed by the user, such as capturing selfies and documents, giving consent, or providing other information. - **Process**: The parts of the onboarding process that run in the back end, such as validating data, identity, and fraud signals. - **Condition**: Rules that determine the path of the user journey. Learn more about [conditions](/concepts-and-architecture/conditions-for-workflows-20/). A series of module, process, and condition nodes ordered top to bottom, first to last. 8. All Workflows must end with a Result node. By default, this is the final step on the canvas. To update it, click **Actions** and select the decision for the Workflow: Pass (default), Fail, Warn, or Manual Review. Click **Update Decision**. ### Workflow Settings 1. While creating or viewing your Workflow, at the top of the page, click **Settings**. The default settings work for most cases, but you can customize them as needed. Many configurable settings to apply to the Workflow. 1. If your organization is configured with [Deepsight](/features-and-modules/deepsight/), you can enable it for this Workflow. Separate licensing is required. Contact your Incode Representative for more information. 2. You can use the toggles to configure the remaining settings. | Setting | Description | Default | | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | | **Session Result** | | | | Automatically create an identity on successful Workflow execution | Automatically creates an [Incode Identity](#/get-started-with-incode/glossary/#incode-identity) if the Workflow is completed successfully. | Off | | **User Experience** | | | | Skip intro screen | Sends users directly to verification steps, skipping the launch screen. | Off | | Phishing Resistance | Protects against man-in-the-middle phishing attacks using dynamic QR codes and device-session binding. Enabling this automatically enables **Redirect desktop attempts to mobile**. | Off | | OAuth2 Secured (web only) | Strengthens the security of the user journey against replay attacks using [OAuth2 security protocol](/general-reference/oauth2-secured-sessions/). A **Redirect URL** is required when this setting is enabled. The OAuth clientid is saved in the configuration settings for future reference. | Off | | Redirect desktop attempts to mobile | Enables an alternative experience for desktop users. You can select from the following redirect options: **Add continue to desktop** (shows users the option to continue on desktop); **Redirect origin only** (redirects users only on their original device); **Enable SMS** (allows users to input their phone number to receive an SMS with an onboarding link). | Off | | Hide unsupported browser screen | Lets users continue with any browser. Only Chrome and Safari are officially supported. | Off | | Allowed devices | Enable to select the device type that can be used to complete the onboarding process. Select one: **Mini apps** (deliver a native-like onboarding without needing to install the full-sized app); **Web mobile** (User will go through the onboarding on their mobile phone browser. This is the default); **Web desktop** (Allows users to do remote onboarding using a desktop web browser; typically used for in-branch verifications). | Off | | Redirect URL | The URL users are sent to after completing onboarding through this Workflow. This field is required if **OAuth2 Secured (web only)** is enabled. | | | Log session as expired after timeout | Adds an expiration timestamp when a session reaches the configured limit. Enable this to monitor user behavior and completion rates around the expiration window. | After **0** minutes | | **Compliance and Privacy** | | | | Age assurance | Shows privacy-adjusted tutorials. Incode won't save any personally identifiable information (PII) data except date of birth. | Off | | Enable mandatory biometric consent | Presents mandatory biometric consent to users. | Off | | Store video of ID and face capture in session | Stores video of ID and Face Capture in Session. | Off | 2. When your Workflow is complete and all settings are configured, click **Save & Publish**. ### Workflow Templates Templates give you a starting point for the most common verification use cases. You can customize the Workflow or individual modules as needed. You can choose from the built-in template options or [import](#import-workflows) your own. The list of built-in templates includes Blank, Identity verification, Step up age verification, one-to-many authentication step up, and one-to-one authentication step up. The following templates are built in: - **Identity Verification**: Includes the modules and processes needed to complete a standard ID-to-Face verification. - **Step Up Age Verification**: Uses Face Capture to determine the user's age. If the user's age meets the condition set, ID Capture is not required for authentication. The default age threshold is 25 or older. - **1:N Authentication Step Up**: Allows returning users to authenticate using just their face, compared against anyone's previous authentications. If authentication fails, the user is presented with an opportunity to complete ID verification. - **1:1 Authentication Step Up**: Allows returning users to authenticate using just their face, compared against their own previous authentications. If authentication fails, the user is presented with an opportunity to complete ID verification. *** ## Import Workflows 1. In the left menu, click **Flow Builder** >**Workflows**. 2. Click **Import**. The fields in the Import pop-up include Import File and Workflow Name. 3. Click **_Import File_** and browse to the JSON file on your device. 4. Enter a **_Workflow Name_**. 5. Click **Submit**. *** ## Test a Workflow 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Browse or [filter](/dashboard-platform-administration/workflows-20/#filter-workflows) to find the Workflow you want to test. 3. Click **Test Workflow** in the Actions column. The Test Workflow icon is an icon of a QR code. 4. Scan the QR code with your mobile phone or copy and paste the link into a browser. *** ## Other Workflow Actions 1. In the left menu, click **Flow Builder** > **Workflows**. 2. Browse or [filter](/dashboard-platform-administration/workflows-20/#filter-workflows) to find the Workflow you want. 3. Click the three dots in the Actions column. The three dots are clicked, and the following options appear: Pause Workflow, Copy URL, Copy ID, Export Config, and Delete. 4. Select the action you want to perform: - **Pause Workflow**: Prevents the Workflow from being used in Onboarding. Useful if you want to make edits. When a Workflow is paused, the menu shows **Activate Workflow** instead. - **Copy URL**: Copies the URL needed to start the Workflow. - **Copy ID**: Copies the unique identifier for the Workflow. - **Export Config**: Downloads a JSON file of the Workflow configuration. - **Delete**: Permanently deletes the Workflow. **This cannot be undone**. In the confirmation dialog, click **Confirm**.
          --- - Path: `design-and-ux/advanced-signature-design` - URL: https://developer.incode.com/design-and-ux/advanced-signature-design/ - Markdown: https://developer.incode.com/design-and-ux/advanced-signature-design.md # Advanced Signature **Advanced Signature** is a key step in onboarding and agreement workflows. It presents users with a document to review and a set of consent statements to confirm before completing the signing process. The module ensures users have read and agreed to all required terms before their signature is submitted and recorded. *** ## Where it fits in the flow **Advanced Signature** is typically positioned at the end of an onboarding or verification flow, after identity and document checks have been completed, depending on the configured workflow. *** ## User Flow The **Advanced Signature experience** guides users through a document review, a progressive consent checklist, and a final signing confirmation.
          *** ## Full Flow Map
          *** ## Happy Path (Light & Dark) The ideal user journey occurs when the user reviews the document, checks all required consent statements, and completes signing without interruptions. **The happy path** represents the smoothest version of the experience: the user opens and reviews the contract, checks each consent checkbox in sequence, taps "Finish signing," and the system processes and confirms the signature. The user reaches the success screen on the first attempt without encountering any errors or unchecked statements. **Light and dark mode** previews are included to allow teams to validate visual consistency, accessibility, and contrast across themes and platforms.
          *** ## Best Practices Recommended guidelines for designing and implementing the **Advanced Signature experience** ✅ Do * Display the full contract or document with a clear link to open and read it before signing. * Require each consent checkbox to be checked individually before the "Finish signing" button becomes active. * Keep consent statements concise, specific, and easy to understand. * Provide clear visual feedback during processing to prevent duplicate submissions. ❌ Don't * Don't allow the "Finish signing" button to be tapped unless all checkboxes are checked. * Don't allow duplicate submissions by leaving the button active while the signature is being processed. --- - Path: `design-and-ux/button` - URL: https://developer.incode.com/design-and-ux/button/ - Markdown: https://developer.incode.com/design-and-ux/button.md # Button Buttons trigger actions. Prizma has three variants — primary, secondary, and tertiary — each scoped to a different visual weight and use case. All powered by the same token layer. ## Try it live Hover, press, and tab through them — every state comes straight from the button tokens.

          Interactive — hover / press / focus

          Variants
          Primary.btn-primary

          The main call to action. Signals the most important next step — one per screen. Verb-first labels (Verify, Continue, Confirm); full width on mobile flows.

          Secondary.btn-secondary

          Supporting or dismissive action. Sits alongside the primary but never competes with it — go back, cancel, or dismiss a flow.

          Tertiary.btn-tertiary

          Text-link style. Optional steps or navigation that shouldn’t disrupt the flow.

          States
          ## Every state, every variant Hover, pressed, and disabled states are baked into the token layer. They respond automatically — no overrides needed.
          Tokens
          ```dh-comp-tokens --btn-primary-surface-default | Primary background — rest | Component --btn-primary-surface-hover | Primary background — hover | Component --btn-primary-surface-pressed | Primary background — active | Component --btn-primary-surface-disabled | Primary background — disabled | Component --btn-primary-text-default | Primary label — rest | Component --btn-primary-text-disabled | Primary label — disabled | Component --btn-secondary-border-default | Secondary border — rest | Component --btn-secondary-border-hover | Secondary border — hover | Component --btn-secondary-border-pressed | Secondary border — active | Component --btn-secondary-border-disabled | Secondary border — disabled | Component --btn-tertiary-text-default | Tertiary label — rest | Component --btn-tertiary-text-disabled | Tertiary label — disabled | Component --radius-button | Corner radius — all variants | Semantic --font-size-button-m | Label font size — M | Primitive ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/button-group` - URL: https://developer.incode.com/design-and-ux/button-group/ - Markdown: https://developer.incode.com/design-and-ux/button-group.md # Button Group Button groups define how multiple buttons are arranged in a flow. Four orientations — vertical and horizontal, each with a normal and reversed variant — cover every layout pattern in Prizma flows.
          Orientations
          Vertical.btn-group--vertical

          Stacked full-width buttons — the default on mobile verification flows. Primary on top.

          Horizontal.btn-group--horizontal

          Side-by-side pair for dialogs and wide layouts. Primary sits on the right.

          Tokens
          ```dh-comp-tokens --scale-12 | Gap between buttons in a group | Primitive --btn-primary-surface-* | All primary button tokens | Component --btn-secondary-border-* | All secondary button tokens | Component --radius-button | Corner radius on all buttons | Semantic ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/card-list` - URL: https://developer.incode.com/design-and-ux/card-list/ - Markdown: https://developer.incode.com/design-and-ux/card-list.md # Card List Card Lists present a set of selectable verification steps or modules. Each item has an icon, a label, and an optional badge. Used as the main navigation surface at the start of a verification session.
          Anatomy
          ID CaptureFace CaptureFace Match
          States
          ID Capture
          Default.card-item

          A selectable verification step: icon, label, and a chevron affordance.

          Face Capture
          Selected.card-item.is-selected

          Brand border and tinted surface confirm the choice.

          Tokens
          ```dh-comp-tokens --gc-card-surface | Item background | Component --gc-card-border | Item border color | Component --gc-card-text | Item label color | Component --gc-card-icon-surface | Icon container background | Component --gc-card-tag-surface | Badge background | Component --gc-card-tag-text | Badge text color | Component --radius-card | Card corner radius | Semantic ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/certificate-issuance-design` - URL: https://developer.incode.com/design-and-ux/certificate-issuance-design/ - Markdown: https://developer.incode.com/design-and-ux/certificate-issuance-design.md # Certificate Issuance The **Certificate Issuance** module enables organizations to issue digital certificates that support secure, compliant, and legally binding document signing. By establishing trusted digital identities and strong authentication mechanisms, it helps ensure document integrity, signer verification, and regulatory compliance throughout the signing process. *** ## Where it fits in the flow The **Certificate Issuance** module is typically performed after identity verification has been completed, including ID document capture and face capture. Once the user's identity has been successfully verified, a digital certificate can be issued to establish a trusted digital identity for secure, compliant, and legally binding document signing. *** ## User Flow The **Certificate Issuance **experience follows a three-step flow.
          *** ## Full Flow Map
          *** ## Happy Path (Light & Dark) The Certificate Issuance module is typically performed after identity verification is completed through ID document and face capture. Upon successful verification, a digital certificate is issued to enable secure, compliant, and legally binding document signing.


          ## Best Practices Recommended guidelines for designing and implementing the Certificate Issuance experience. **✅ Do** - Clearly communicate that identity verification has been successfully completed before initiating certificate issuance. - Provide clear progress indicators while the certificate is being generated and issued. - Display a confirmation screen once the certificate has been successfully issued so users understand they can proceed to document signing. - Ensure users understand the purpose of the certificate and how it enables secure, legally binding digital signatures. **❌ Don't** - Don't allow certificate issuance until identity verification, including ID capture and face capture, has been successfully completed. - Don't leave users without feedback during certificate generation or issuance processes.
          --- - Path: `design-and-ux/checkbox` - URL: https://developer.incode.com/design-and-ux/checkbox/ - Markdown: https://developer.incode.com/design-and-ux/checkbox.md # Checkbox Checkboxes allow users to select one or more items from a set, or toggle a single option on or off. Prizma checkboxes support unchecked, checked, and disabled states across S, M, and L container sizes. ## Try it live Click them — real checkboxes styled with the checkbox tokens.

          Interactive — click to toggle

          States
          Unchecked.checkbox-wrap

          Default resting state. The checkbox is visible and ready to receive input.

          Checked.checkbox-wrap.is-selected

          Selected state. The checkmark confirms the user’s choice with brand color.

          Disabledopacity: 0.4

          Unavailable state. Full opacity reduction signals the option is not interactive.

          Tokens
          ```dh-comp-tokens --checkbox-surface-default | Unchecked background | Component --checkbox-surface-selected | Checked background | Component --checkbox-surface-disabled | Disabled background | Component --checkbox-border-default | Unchecked border | Component --checkbox-border-selected | Checked border | Component --checkbox-border-disabled | Disabled border | Component --checkbox-check-color | Checkmark icon color | Component --radius-checkbox | Corner radius | Semantic ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/color` - URL: https://developer.incode.com/design-and-ux/color/ - Markdown: https://developer.incode.com/design-and-ux/color.md # Color Prizma's color system is built on semantic tokens: components never reference raw hex values, they reference a role ("surface", "text", "border", "icon") that resolves to the right color for the active mode. Design and code share the same token names, so what's designed in Figma is what ships. ```dh-strip kind: color desc: One brand ramp, one gray ramp, and a status set (positive, warning, negative, focus) cover every surface in the product. | #e5f0ff | #bfdfff | #99ceff | #66a6ff | #3388ff | #006aff | #0055cc | #e4fbf0 | #189f60 | #fff0f0 | #e71111 | #fff7eb | #ff9900 ``` ```dh-principles #006aff | Semantic, not literal | Components reference roles (surface, text, border, icon) — never a hex, never a primitive. If a needed role is missing, request a token instead of inlining a value. #189f60 | Adaptive by design | Every semantic token carries a light and a dark value and inverts automatically. Tokens suffixed Static keep the same value in both modes. #820ad1 | One source of truth | The ramps live in Token Studio and sync to Figma and code. What's designed is what ships — no drift. ```
          Gray
          0#ffffff50#fcfcfd100#ebecef150#d9dae1200#c6c8d2250#b5b8c5300#a3a8b8400#82879a500#60667c600#4d5264700#3a3e4b750#30333e800#262831900#14151a1000#0000000 80%#ffffffcc900 80%#14151acc1000 80%#000000cc
          Brand
          50#e5f0ff100#bfdfff200#99ceff300#66a6ff400#3388ff500#006aff600#0055cc900#21273b
          Status
          Positive 50#e4fbf0Positive 400#45b380Positive 500#189f60Positive 750#0c5030Positive 950#03190eWarning 50#fff7ebWarning 400#ffb647Warning 500#ff9900Warning 750#523100Warning 950#271400Negative 50#fff0f0Negative 400#ff5a5fNegative 500#e71111Negative 950#240001Focus 400#0099ffFocus 500#006aff
          > 📘 Adaptive by design > > Every token below carries a light and a dark value. Adaptive tokens invert between modes automatically; tokens suffixed **Static** keep the same value in both modes (for elements that must not change, like brand fills or overlays on imagery). ```dh-usage Surface roles | surface-* | Background fills for frames, cards, and overlays. The gray scale inverts between modes. | Frames, Cards, Overlays, Status tints Text roles | text-* | Headings, body, labels, links, and status messages. Primary/secondary/tertiary carry the hierarchy. | Headings, Body, Links, Status text Border roles | border-* | Strokes for inputs, cards, dividers, and status rings — including the focus ring. | Inputs, Dividers, Focus ring, Status rings Icon roles | icon-* | Glyph fills. Adaptive tokens invert with mode; static tokens never change. | Glyphs, Status icons, Static marks ``` - Components reference semantic tokens, never primitives or raw hex values. - Never hardcode a hex in product code — if a needed role is missing, request a token instead of inlining a value. - Static tokens are for surfaces that must not adapt (brand fills, overlays on photography); everything else should invert with the mode. ## Semantic tokens ### Surface ```dh-tokens desc: Background fills for frames, cards, and overlays. Gray scale inverts between modes. Neutral 0 | --surface-neutral-0 | #ffffff | #000000 Neutral 50 | --surface-neutral-50 | #fcfcfd | #14151a Neutral 100 | --surface-neutral-100 | #ebecef | #262831 Neutral 150 | --surface-neutral-150 | #d9dae1 | #30333e Neutral 200 | --surface-neutral-200 | #c6c8d2 | #3a3e4b Neutral 250 | --surface-neutral-250 | #b5b8c5 | #4d5264 Neutral 300 | --surface-neutral-300 | #a3a8b8 | #60667c Neutral 800 | --surface-neutral-800 | #262831 | #ebecef Brand 50 | --surface-brand-50 | #e5f0ff | #21273b Brand 500 Static | --surface-brand-500-static | #006aff | #006aff Status Warning 50 | --surface-status-warning-50 | #fff7eb | #271400 Status Warning 500 | --surface-status-warning-500 | #ff9900 | #ffb647 Status Negative 50 | --surface-status-negative-50 | #fff0f0 | #240001 Status Positive 50 | --surface-status-positive-50 | #e4fbf0 | #03190e Status Positive 500 | --surface-status-positive-500 | #189f60 | #45b380 ``` ### Text ```dh-tokens desc: Text fills for headings, body, labels, links, and status messages. Primary | --text-primary | #262831 | #fcfcfd Secondary | --text-secondary | #60667c | #a3a8b8 Tertiary | --text-tertiary | #a3a8b8 | #60667c Body 400 | --text-body-400 | #82879a | #60667c Link Default | --text-link-default | #006aff | #3388ff Link Visited | --text-link-visited | #3a3e4b | #a3a8b8 Accent Brand | --text-accent-brand | #006aff | #006aff Status Negative | --text-status-negative | #e71111 | #ff5a5f Status Warning | --text-status-warning | #ff9900 | #ffb647 Status Positive | --text-status-positive | #189f60 | #189f60 ``` ### Border ```dh-tokens desc: Stroke colors for inputs, cards, dividers, and status rings. Neutral 100 | --border-neutral-100 | #ebecef | #3a3e4b Neutral 200 | --border-neutral-200 | #c6c8d2 | #4d5264 Neutral 250 | --border-neutral-250 | #b5b8c5 | #4d5264 Neutral 300 | --border-neutral-300 | #a3a8b8 | #60667c Neutral 400 | --border-neutral-400 | #82879a | #60667c Neutral 500 | --border-neutral-500 | #60667c | #a3a8b8 Brand 500 | --border-brand-500 | #006aff | #006aff Brand 600 | --border-brand-600 | #0055cc | #3388ff Status Focus | --border-status-focus | #006aff | #0099ff Status Warning | --border-status-warning | #ff9900 | #ffb647 Status Warning Static | --border-status-warning-static | #ff9900 | #ff9900 Status Negative | --border-status-negative | #e71111 | #ff5a5f Status Negative Static | --border-status-negative-static | #e71111 | #e71111 Status Positive Static | --border-status-positive-static | #189f60 | #189f60 Neutral 100 Static | --border-neutral-100-static | #ebecef | #ebecef ``` ### Icon ```dh-tokens desc: Fill colors for icon glyphs. Adaptive tokens invert with mode; static tokens never change. Neutral 0 | --icon-neutral-0 | #ffffff | #262831 Neutral 300 | --icon-neutral-300 | #a3a8b8 | #60667c Neutral 500 | --icon-neutral-500 | #60667c | #a3a8b8 Neutral 800 | --icon-neutral-800 | #262831 | #ebecef Brand 500 | --icon-brand-500 | #006aff | #006aff Neutral 0 Static | --icon-neutral-0-static | #ffffff | #ffffff Neutral 50 Static | --icon-neutral-50-static | #fcfcfd | #fcfcfd Neutral 300 Static | --icon-neutral-300-static | #a3a8b8 | #a3a8b8 Neutral 500 Static | --icon-neutral-500-static | #60667c | #60667c Neutral 800 Static | --icon-neutral-800-static | #262831 | #262831 Brand 500 Static | --icon-brand-500-static | #006aff | #006aff Status Warning | --icon-status-warning | #ff9900 | #ffb647 Status Negative | --icon-status-negative | #e71111 | #ff5a5f Status Positive | --icon-status-positive | #189f60 | #45b380 ``` ## Component tokens ### Button ```dh-tokens desc: Primary, secondary, and tertiary button surface, border, and text tokens. Primary surface — rest | --btn-primary-surface-default | #006aff | #006aff Primary surface — hover | --btn-primary-surface-hover | #3388ff | #3388ff Primary surface — pressed | --btn-primary-surface-pressed | #0055cc | #0055cc Primary surface — disabled | --btn-primary-surface-disabled | #ebecef | #262831 Primary text — rest | --btn-primary-text-default | #ffffff | #ffffff Primary text — disabled | --btn-primary-text-disabled | #60667c | #a3a8b8 Secondary border — rest | --btn-secondary-border-default | #006aff | #006aff Secondary border — hover | --btn-secondary-border-hover | #3388ff | #3388ff Secondary border — pressed | --btn-secondary-border-pressed | #0055cc | #0055cc Secondary border — disabled | --btn-secondary-border-disabled | #ebecef | #262831 Secondary text — rest | --btn-secondary-text-default | #006aff | #006aff Secondary text — disabled | --btn-secondary-text-disabled | #60667c | #a3a8b8 Tertiary text — rest | --btn-tertiary-text-default | #006aff | #006aff Tertiary text — disabled | --btn-tertiary-text-disabled | #60667c | #a3a8b8 ``` ### Input ```dh-tokens desc: Text field surface, border, and label tokens across all states. Surface — rest | --input-surface-default | #fcfcfd | #14151a Surface — focused | --input-surface-focused | #fcfcfd | #14151a Surface — disabled | --input-surface-disabled | #ebecef | #262831 Border — rest | --input-border-default | #82879a | #60667c Border — focused | --input-border-focused | #006aff | #0099ff Border — disabled | --input-border-disabled | #ebecef | #3a3e4b Border — negative | --input-border-negative | #e71111 | #ff5a5f Text — rest | --input-text-default | #262831 | #fcfcfd Text — placeholder | --input-text-placeholder | #82879a | #60667c Text — disabled | --input-text-disabled | #82879a | #60667c ``` ### Checkbox ```dh-tokens desc: Box surface, check icon, border, and label tokens. Surface — rest | --checkbox-surface-default | #fcfcfd | #14151a Surface — selected | --checkbox-surface-selected | #006aff | #006aff Surface — disabled | --checkbox-surface-disabled | #82879a | #60667c Border — rest | --checkbox-border-default | #82879a | #60667c Border — focused | --checkbox-border-focused | #006aff | #0099ff Border — disabled | --checkbox-border-disabled | #82879a | #60667c Icon — check mark | --checkbox-icon-default | #ffffff | #ffffff Text — rest | --checkbox-text-default | #262831 | #fcfcfd Text — disabled | --checkbox-text-disabled | #60667c | #a3a8b8 ``` ### Radio ```dh-tokens desc: Radio button surface, knob, border, and label tokens. Surface — rest | --radio-surface-default | #fcfcfd | #14151a Border — rest | --radio-border-default | #82879a | #60667c Border — selected | --radio-border-selected | #006aff | #006aff Knob — selected | --radio-knob-selected | #006aff | #006aff Surface — disabled | --radio-surface-disabled | #82879a | #60667c Border — disabled | --radio-border-disabled | #82879a | #60667c Text — rest | --radio-text-default | #262831 | #fcfcfd Text — disabled | --radio-text-disabled | #60667c | #a3a8b8 ``` ### Toggle ```dh-tokens desc: Track surface in both states and knob color tokens. Track — on | --toggle-surface-on | #006aff | #006aff Track — off | --toggle-surface-off | #82879a | #60667c Track — disabled | --toggle-surface-disabled | #c6c8d2 | #3a3e4b Knob — on | --toggle-knob-on | #ffffff | #ffffff Knob — off | --toggle-knob-off | #ffffff | #ffffff ``` ### Dropdown ```dh-tokens desc: Field surface, border, label, and selected item highlight tokens. Label color | --dropdown-label-color | #262831 | #fcfcfd Field surface | --dropdown-surface-field | #fcfcfd | #14151a Border — rest | --dropdown-border-default | #82879a | #60667c Item — selected fill | --dropdown-item-surface-selected | #ebecef | #262831 ``` ### Snackbar ```dh-tokens desc: Surface and border tokens for neutral, warning, negative, and positive variants. Surface — neutral | --snackbar-surface-neutral | #e5f0ff | #21273b Surface — warning | --snackbar-surface-warning | #fff7eb | #271400 Surface — negative | --snackbar-surface-negative | #fff0f0 | #240001 Surface — positive | --snackbar-surface-positive | #e4fbf0 | #03190e Border — neutral | --snackbar-border-neutral | #006aff | #006aff Border — warning | --snackbar-border-warning | #ff9900 | #ffb647 Border — negative | --snackbar-border-negative | #e71111 | #ff5a5f Border — positive | --snackbar-border-positive | #189f60 | #189f60 ``` ### Card ```dh-tokens desc: Module card surface and text tokens. Surface primary | --card-surface-primary | #262831 | #ebecef Text — title | --card-text-title | #ebecef | #262831 Text — subtitle | --card-text-subtitle | #60667c | #a3a8b8 ``` ### Countdown ```dh-tokens desc: Timer component uses static dark tokens so it is always dark-on-dark regardless of page mode. Surface (static) | --timer-surface | #14151a | #14151a Border (static) | --timer-border | #ebecef | #ebecef Text (static) | --timer-text | #ffffff | #ffffff ``` ### Tooltip ```dh-tokens desc: Tooltip always renders on a dark background regardless of page mode. Surface (static) | --tooltip-surface | #14151a | #14151a Text (static) | --tooltip-text | #ffffff | #ffffff ``` ### Stepper ```dh-tokens desc: Progress stepper track colors. Active track is always brand blue; inactive is always a light gray. Track — active (static) | --stepper-track-active | #006aff | #006aff Track — inactive (static) | --stepper-track-inactive | #c6c8d2 | #c6c8d2 ```
          --- - Path: `design-and-ux/curp-customization` - URL: https://developer.incode.com/design-and-ux/curp-customization/ - Markdown: https://developer.incode.com/design-and-ux/curp-customization.md # Customization This section outlines the elements you can customize within the **CURP** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms. ## Enter your CURP default This screen appears when the CURP module is first presented to the user. It represents the initial state of the flow, shown before any input is entered. The input field is empty and the primary action is disabled until a valid CURP is provided. An alternative path is available for users who do not have a CURP.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :---------------------------------- | :-------------------------------------- | | **Text** | Title, subtitle, button label | Fully localizable; tone can be adapted | | **Brand Colors** | Illustration accent, button, header | Uses brand tokens | | **Buttons** | Label, color | Must follow platform and WCAG standards |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :-------------------------------------------- | | Layout structure | Ensures consistency across onboarding modules | | Spacing & safe areas | Required for device compatibility | | Text hierarchy | Optimized for readability | | Close icon position | Standardized for user familiarity | | WCAG minimum contrast | Mandatory for accessibility compliance |
          ### Token Reference
          | UI Element | Token | Raw Value | | ----------------------------------------------- | --------------------------------- | --------- | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Title text (“Enter your CURP”) | `text-body-primary` | `#262831` | | Input background | `input-surface-default` | `#FFFFFF` | | Input border (default) | `input-border-default` | `#E5E7EB` | | Input placeholder text | `input-text-field-placeholder` | `#9CA3AF` | | Input text (entered value) | `text-body-primary` | `#262831` | | Primary button background (disabled) | `button-primary-surface-disabled` | `#E5E7EB` | | Primary button text (disabled) | `button-primary-text-disabled` | `#9CA3AF` | | Secondary button border (“I don’t have a CURP”) | `button-secondary-border-default` | `#006AFF` | | Secondary button text | `button-secondary-text-default` | `#006AFF` | ### Design Notes * Keep copy short to minimize cognitive load. * Display the “verified by Incode” footer as a subtle trust signal while maintaining sufficient contrast for accessibility. *** ## Enter your CURP filled This state appears once the user has entered a complete and valid CURP. The input is confirmed visually, and the primary action is enabled, allowing the user to continue to the verification step.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :--------------------------------- | :-------------------------------------- | | **Text** | Title, subtitle, button labels | Fully localizable | | **Brand Colors** | Buttons, links, highlight elements | Uses brand tokens | | **Buttons** | Label, color | Must follow platform and WCAG standards |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :------------------------- | :--------------------------------------------- | | Layout structure | Maintains visual continuity with other modules | | Button spacing & placement | Optimized for tap targets | | Text hierarchy | Follows global UX standards | | Close icon position | Consistent across modules | | WCAG minimum contrast | Required for readability and compliance |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ----------------------------------------------- | ----------------------------------------------------- | ------------- | | Title text (“Enter your CURP”) | `text-body-primary` | `#262831` | | Input text (entered CURP) | `input-text-field-default` | `#262831` | | Input surface (focused) | `input-surface-focused` | `#FCFCFD` | | Input border (focused) | `input-border-focused` / `border-status-focus` | `#006AFF` | | Background | `surface-neutral-0` | `#FFFFFF` | | Primary button background (“Continue”) | `button-primary-surface-default` | `#006AFF` | | Primary button text | `button-primary-text-default` | `#FFFFFF` | | Secondary button border (“I don’t have a CURP”) | `button-secondary-border-default` | `#006AFF` | | Secondary button text | `button-secondary-text-default` / `text-accent-brand` | `#006AFF` | ### Design Notes * Maintain a clear visual hierarchy between primary and secondary actions to guide user attention and decision-making. *** ## Enter your CURP - Loading This screen appears after the user submits their CURP and validation is in progress. The entered value is locked and the primary action displays a loading indicator to communicate ongoing processing. Once verification completes, the flow automatically transitions to the success or error state.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :--------------------------------- | :-------------------------------------- | | **Text** | Title, subtitle, button labels | Fully localizable | | **Brand Colors** | Buttons, links, highlight elements | Uses brand tokens | | **Buttons** | Label, color | Must follow platform and WCAG standards |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :---------------------------------------- | | Layout structure | Keeps parity between web and native flows | | Text hierarchy | Ensures clarity of instructions | | Button placement | Optimized for quick completion | | WCAG minimum contrast | Required for web accessibility standards |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ----------------------------------------------- | ----------------------------------------------------- | ------------- | | Title text (“Enter your CURP”) | `text-body-primary` | `#262831` | | Input text (disabled) | `input-text-field-disabled` | `#82879A` | | Input surface (disabled) | `input-surface-disabled` | `#EBECEF` | | Input border (disabled) | `input-border-disabled` / `border-neutral-100` | `#EBECEF` | | Background | `surface-neutral-0` | `#FFFFFF` | | Primary button background (disabled) | `button-primary-surface-default` | `#006AFF` | | Primary button text | `button-primary-text-default` | `#FFFFFF` | | Primary button loading indicator | `surface-brand-400-static` | `#3388FF` | | Secondary button border (“I don’t have a CURP”) | `button-secondary-border-default` | `#006AFF` | | Secondary button text | `button-secondary-text-default` / `text-accent-brand` | `#006AFF` | ### Design Notes * The loading indicator uses brand tokens to signal progress without breaking visual consistency. * Primary and secondary actions maintain hierarchy through consistent button tokens. ***
          ## Error State This state appears when the entered CURP does not meet the required format or validation rules. The input field is highlighted to indicate an error, and a clear message explains what needs to be corrected. The primary action remains disabled until a valid CURP is provided, allowing the user to fix the input or choose an alternative path if available.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :------------------------------------------------- | :-------------------------------------- | | **Text** | Title, button label | Fully localizable | | **Brand Colors** | Illustration accent, button background, highlights | Uses brand tokens | | **Buttons** | Label and color | Must follow platform and WCAG standards |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :---------------------------------------------------- | | Layout structure | Maintains consistency with other verification modules | | Spacing & alignment | Optimized for layout consistency | | Text hierarchy | Required for readability and hierarchy | | Close icon position | Standardized for familiarity | | WCAG minimum contrast | Required for web accessibility standards |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | :---------------------------------------------- | :---------------------------------------------------- | :------------ | | Title text (“Enter your CURP”) | `text-body-primary` | `#262831` | | Input text (error) | `input-text-field-default` | `#262831` | | Input border (error) | `input-border-negative` / `border-status-negative` | `#EF4444` | | Input surface (error) | `input-surface-negative` / `surface-neutral-100` | `#EBECEF` | | Error icon | `icon-status-negative` | `#EF4444` | | Error message text (“Invalid CURP”) | `text-status-negative` | `#EF4444` | | Background | `surface-neutral-0` | `#FFFFFF` | | Primary button background (disabled) | `button-primary-surface-disabled` | `#EBECEF` | | Primary button text (disabled) | `button-primary-text-disabled` | `#9CA3AF` | | Secondary button border (“I don’t have a CURP”) | `button-secondary-border-default` | `#006AFF` | | Secondary button text | `button-secondary-text-default` / `text-accent-brand` | `#006AFF` |
          ### Design Notes * Error states uses semantic error tokens (border, text, icon) to communicate validation clearly and consistenly. *** ## Verifying your CURP Shown after the user submits their CURP. The system validates the identifier and displays a processing state while verification is in progress. Once validation completes, the flow automatically proceeds to the success or error state.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :------------------------------------------------- | :------------------------------------------- | | **Text** | Title, button label | Fully localizable | | **Illustration** | Colors or full replacement | Must clearly represent location confirmation | | **Brand Colors** | Illustration accent, button background, highlights | Uses brand tokens |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :---------------------------------------------------- | | Layout structure | Maintains consistency with other verification modules | | Spacing & alignment | Optimized for layout consistency | | Text hierarchy | Required for readability and hierarchy | | Close icon position | Standardized for familiarity | | WCAG minimum contrast | Required for web accessibility standards |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ------------------------------------- | ------------------------------------------------------ | ------------- | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Close icon | `icon-neutral-500` | `#60667C` | | Loading spinner (primary surface) | `spinner-surface-primary` / `surface-brand-500-static` | `#006AFF` | | Loading spinner (secondary surface) | `spinner-surface-secondary` / `surface-brand-50` | `#E6F0FF` | | Spinner text (“Verifying your CURP…”) | `spinner-text-title` / `text-body-primary` | `#262831` | | Status bar icons | `icon-neutral-500` | `#60667C` | ### Design Notes * The loading state removes interactive elements to prevent user interruption during verification. * A centered circular progress indicator communicates system activity using brand tokens. ***
          ## CURP Not Verified Shown when verification fails due to incomplete or invalid data, or due to a mismatch with the official database. The user can review and edit their input, or retry the process.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :------------------------------------------------- | :-------------------------------------- | | **Text** | Title, button label | Fully localizable | | **Brand Colors** | Illustration accent, button background, highlights | Uses brand tokens | | **Buttons** | Label and color | Must follow platform and WCAG standards |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :---------------------------------------------------- | | Layout structure | Maintains consistency with other verification modules | | Spacing & alignment | Optimized for layout consistency | | Text hierarchy | Required for readability and hierarchy | | Close icon position | Standardized for familiarity | | WCAG minimum contrast | Required for web accessibility standards |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | --------------------------------------- | -------------------------------- | ------------- | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Status icon (error) | `icon-status-negative` | `#EF4444` | | Status text (“CURP not verified”) | `text-body-primary` | `#262831` | | Primary button background (“Try again”) | `button-primary-surface-default` | `#006AFF` | | Primary button text | `button-primary-text-default` | `#FFFFFF` | | Status bar icons | `icon-neutral-500` | `#60667C` |
          ### Design Notes * A semantic error token is used for the icon to ensure immediate recognition of failure. ***
          ## CURP Verified Displayed when the CURP is successfully verified. The user can proceed to the next step in the onboarding or identity flow.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :------------------------------------------------- | :-------------------------------------- | | **Text** | Title, button label | Fully localizable | | **Brand Colors** | Illustration accent, button background, highlights | Uses brand tokens | | **Buttons** | Label and color | Must follow platform and WCAG standards |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :---------------------------------------------------- | | Layout structure | Maintains consistency with other verification modules | | Spacing & alignment | Optimized for layout consistency | | Text hierarchy | Required for readability and hierarchy | | Close icon position | Standardized for familiarity | | WCAG minimum contrast | Required for web accessibility standards | ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ------------------------------ | ---------------------- | ------------- | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Status icon (success) | `icon-status-positive` | `#22C55E` | | Status text (“CURP verified!”) | `text-body-primary` | `#262831` | | Status bar icons | `icon-neutral-500` | `#60667C` |
          *** ## Generate CURP - Empty form Allows the user to generate a CURP if they don't have one, by manually entering personal details. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :------------------------------------------------- | :-------------------------------------- | | **Text** | Title, button label | Fully localizable | | **Brand Colors** | Illustration accent, button background, highlights | Uses brand tokens | | **Buttons** | Label and color | Must follow platform and WCAG standards | ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :---------------------------------------------------- | | Layout structure | Maintains consistency with other verification modules | | Spacing & alignment | Optimized for layout consistency | | Text hierarchy | Required for readability and hierarchy | | Close icon position | Standardized for familiarity | | WCAG minimum contrast | Required for web accessibility standards | ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :------------------------------------------- | :----------------------------------------------- | :------------ | | Screen title (“Generate your CURP”) | `text-body-primary` | `#262831` | | Close / Back icons | `icon-neutral-500` | `#60667C` | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Text field label | `text-body-secondary` | `#60667C` | | Text field placeholder | `input-text-field-placeholder` | `#82879A` | | Text field input text | `text-body-primary` | `#262831` | | Input surface (default) | `input-surface-default` | `#FCFCFD` | | Input border (default) | `input-border-default` / `border-neutral-100` | `#E5E7EB` | | Dropdown surface (default) | `dropdown-surface-default` | `#FFFFFF` | | Dropdown border (default) | `dropdown-border-default` / `border-neutral-400` | `#D1D5DB` | | Dropdown placeholder text | `dropdown-text-input-placeholder` | `#82879A` | | Dropdown selected text | `dropdown-text-input-default` | `#262831` | | Dropdown icon | `icon-neutral-500` | `#60667C` | | Primary button background (“Call to action”) | `button-primary-surface-default` | `#006AFF` | | Primary button text | `button-primary-text-default` | `#FFFFFF` | | Primary button (disabled state) | `button-primary-surface-disabled` | `#EBECEF` | | Primary button text (disabled) | `button-primary-text-disabled` | `#9CA3AF` | ### Design Notes * The screen follows a structured single-column form layout to support step-by-step data entry. * Input fields use consistent input tokens to reinfoce visual uniformity. *** ## Generating CURP - Filled form Shows the form with all required fields completed and ready to generate the CURP. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :------------------------------------------------- | :-------------------------------------- | | **Text** | Title, button label | Fully localizable | | **Brand Colors** | Illustration accent, button background, highlights | Uses brand tokens | | **Buttons** | Label and color | Must follow platform and WCAG standards | ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :---------------------------------------------------- | | Layout structure | Maintains consistency with other verification modules | | Spacing & alignment | Optimized for layout consistency | | Text hierarchy | Required for readability and hierarchy | | Close icon position | Standardized for familiarity | | WCAG minimum contrast | Required for web accessibility standards | ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | -------------------------------------- | ------------------------------------------------ | ------------- | | Screen title (“Generate your CURP”) | `text-body-primary` | `#262831` | | Close / Back icons | `icon-neutral-500` | `#60667C` | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Input label text | `text-body-primary` | `#262831` | | Input text (filled) | `input-text-field-default` / `text-body-primary` | `#262831` | | Input surface (default) | `input-surface-default` | `#FCFCFD` | | Input border (default) | `input-border-default` / `border-neutral-400` | `#D1D5DB` | | Dropdown surface (default) | `dropdown-surface-default` | `#FFFFFF` | | Dropdown border (default) | `dropdown-border-default` / `border-neutral-400` | `#D1D5DB` | | Dropdown selected text | `dropdown-text-input-default` | `#262831` | | Dropdown icon | `icon-neutral-500` | `#60667C` | | Primary button background (“Generate”) | `button-primary-surface-default` | `#006AFF` | | Primary button text | `button-primary-text-default` | `#FFFFFF` | | Status bar icons | `icon-neutral-500` | `#60667C` |
          *** ## Generating CURP - Error state Shown when verification fails due to incomplete or invalid data, or due to a mismatch with the official database. The user can review and edit their input, or retry the process.. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :------------------------- | :-------------------------------------- | | **Text** | Title, button label | Fully localizable | | **Brand Colors** | button background | Uses brand tokens | | **Buttons** | Label and color | Must follow platform and WCAG standards | ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :---------------------------------------------------- | | Layout structure | Maintains consistency with other verification modules | | Spacing & alignment | Optimized for layout consistency | | Text hierarchy | Required for readability and hierarchy | | Close icon position | Standardized for familiarity | | WCAG minimum contrast | Required for web accessibility standards | ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ---------------------------------------------------- | -------------------------------- | ------------- | | Status icon (error) | `icon-status-negative` | `#EF4444` | | Title text (“Couldn’t generate CURP”) | `text-body-primary` | `#262831` | | Supporting text (“Please check entered information”) | `text-body-secondary` | `#60667C` | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Primary button background (“Edit information”) | `button-primary-surface-default` | `#006AFF` | | Primary button text | `button-primary-text-default` | `#FFFFFF` |
          ### Design Notes * The result state uses a centered status layout to clearly communicate system feedback. * A semantic error token (red) is applied to the icon to ensure immediate visual recognition. *** ## Generating CURP - Confirmation Displays the generated CURP for review before submission. The user can confirm or go back to edit details. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :------------------------- | :-------------------------------------- | | **Text** | Title, button label | Fully localizable | | **Brand Colors** | button background | Uses brand tokens | | **Buttons** | Label and color | Must follow platform and WCAG standards |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :---------------------------------------------------- | | Layout structure | Maintains consistency with other verification modules | | Spacing & alignment | Optimized for layout consistency | | Text hierarchy | Required for readability and hierarchy | | Close icon position | Standardized for familiarity | | WCAG minimum contrast | Required for web accessibility standards | ### Token Reference
          | **UI Element** | **Raw Value** | **Token** | | -------------------------------------- | ------------- | -------------------------------- | | Title text (“Confirm your CURP”) | `#262831` | `text-body-primary` | | CURP input text | `#262831` | `input-text-field-default` | | Input border (disabled) | `#EBECEF` | `input-border-disabled` | | Input surface (disabled) | `#EBECEF` | `input-surface-disabled` | | Screen background | `#FFFFFF` | `surface-neutral-0` | | Primary button background (“Continue”) | `#006AFF` | `button-primary-surface-default` | | Primary button text | `#FFFFFF` | `button-primary-text-default` | --- - Path: `design-and-ux/curp-design` - URL: https://developer.incode.com/design-and-ux/curp-design/ - Markdown: https://developer.incode.com/design-and-ux/curp-design.md # CURP The CURP module captures and validates the user's Clave Única de Registro de Población (CURP). It is used to verify the user's identity as part of identity validation or compliance workflows. It is used as a country-specific identity verification step for Mexico, typically after basic personal information input and before final verification or document capture. *** ## Where it fits in the flow **CURP** appears as a country-specific step in the verification flow for users in Mexico. It typically occurs after the user provides basic personal information and before document capture or final verification, ensuring the CURP is validated early in the process. *** ## User Flow The **CURP** experience guides the user from data entry to validation. The flow begins with an input screen where the user is prompted to enter their CURP. As the user types, the system validates the input format and enables progression once the value is complete. After submission, the system verifies the CURP and displays a processing state. Once validation is successful, a confirmation screen is shown and the user continues to the next module in the verification flow. It validation fails, the user receives feedback and can correct the input or choose an alternative path if available.
          *** ## Full Flow Map This diagram presents the full sequence of screens involved in the CURP module, from initial screen and real-time validation to processing states, error handling and successful information. It visually represents both the ideal and alternative user journeys, helping teams understand all possible user interactions and system states within the module.
          *** ## Happy Path (Light & Dark) The ideal user journey when the CURP is entered and validates successfully with no interruptions. The happy path represents the smoothest version of the experience, where the user enters a valid CURP, the system verifies it successfully and the flow proceeds automatically without requiring corrections or retries. Both light and dark mode previews are included so design, product, and engineering teams can validate visual consistency and accessibility across themes. Geolocation module - Happy Path in Light mode Geolocation module - Happy Path in Dark mode
          *** ## Best Practices Recommended guidelines for designing and implementing the **CURP** experience. **✅ Do** * Clearly explain why the CURP is requested — transparency builds trust. * Validate input progressively and provide immediate, clear feedback. * Use localized copy and terminology appropriate for users in Mexico. * Provide a visible alternative path (for example, “I don’t have a CURP”) when applicable. **❌ Don’t** * Don’t block the flow indefinitely due to formatting or validation errors. * Avoid unclear error messages or silent failures. --- - Path: `design-and-ux/curp-screens-states` - URL: https://developer.incode.com/design-and-ux/curp-screens-states/ - Markdown: https://developer.incode.com/design-and-ux/curp-screens-states.md # Screens & States A complete view of all screens the user may encounter during the CURP experience. Each state includes a brief description. *** ## Enter CURP This screen prompts the user to enter their Clave Única de Registro de Población (CURP). As the user types, the system validates the input format and enables progression once a complete CURP is provided. Alternative paths, are available when applicable.
          ## Generate CURP This screen allows users who do not have their CURP to generate it by providing the required personal information, such as name, date of birth, gender and place of birth. Once the required details are submitted, the system generates the CURP and presents it for confirmation before the user continues in the verification flow.
          ## Verify CURP This screen appears after the user submits their CURP. The system validates the provided identifier and displays processing state while verification is in progress. Once validation is compete, the flow continues automatically to the success or error state, depending on the result.
          ## Success Displayed when the CURP is successfully verified. The user can proceed to the next step in the onboarding or identity flow.
          ## Error State Shown when verification fails due to incomplete or invalid data, or due to a mismatch with the official database. The user can review and edit their input or retry the process.
          ## Form error Displayed when the entered CURP is invalid or doesn't match the expected format. The user receives immediate feedback and can correct the input. --- - Path: `design-and-ux/curp-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/curp-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/curp-specs-guidelines.md # Specs & Guidelines The **CURP** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.
          *** ## Responsiveness & Viewport Adaptation The **CURP** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet. This ensures that key interactive areas, such as CTAs, remain visible, accessible, and consistently aligned across platforms.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | :--------------------------------- | :---------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | Reduce vertical spacing; full-width input and buttons; | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing adapts to maintain balance | | **Foldables (e.g., Pixel Fold)** | Centered form with max-width constrains | | **Tablets** | Consistent input and button sizing; Fixed-width container centered on screen. | | **Desktop web** | Centered content with max-width constraint and safe-area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | :----------------------- | :-------------------------------------------- | :-------------------------- | | Form container | Maintains centered max-width on large screens | Fully localizable | | Instruction / title text | Width adapts to container | Placeholder and helper text | | Buttons | Width adjusts to container, spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Adjusts padding to safe-area insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | :----------------------- | :--------------------------------------------------------- | | Location detection logic | Must remain consistent for accuracy | | Single column layout | Preserves clarity and reduces cognitive load in form entry | | Validation placement | Must remain inline for usability and accessibility | | Minimum text size | Ensures readability & WCAG compliance | | Minimum tap target sizes | Accessibility requirement on mobile | | Layout hierarchy | Keeps experience consistent across devices |
          ### Design Notes * The form remains the visual focal point across all devices. * The layout stays single-column to preserve clarity and reduce cognitive load. * Vertical spacing follows fixed, safe thresholds; horizontal layout adapts fluidly within a max-width container. * Avoid adding custom elements above or below the module to maintain structural alignment. * Accessibility standards (minimum tap targets, readable type scale, contrast ratios) must be preserved across breakpoints.
          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.
          *** ## Prototype & Transitions CURP includes predefined transition rules and micro-interactions that ensure a smooth user experience. Animation guidelines are documented directly in Figma prototypes.

          *** ## Localization The **CURP** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          ### Key considerations * Incode supports a variety of languages. * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Buttons and CTAs automatically expand to fit translated labels. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable.
          --- - Path: `design-and-ux/curp-v1-vs-v2-comparison` - URL: https://developer.incode.com/design-and-ux/curp-v1-vs-v2-comparison/ - Markdown: https://developer.incode.com/design-and-ux/curp-v1-vs-v2-comparison.md # CURP V1 vs V2 Comparison V1 provides a basic CURP input and validation experience. While it supports correct data entry and basic validation logic, the flow offers limited flexibility for customization and is not fully aligned with the token-based design system. V2 builds on the same functional foundation but rethinks the experience to be clearer, more structured, and easier to customize. It introduces standardized components, improved UX writing, better defined validations states and full alignment with the token-based design system. The V2 experience is designed to improve predictability, reduce friction during validation and ensure consistent behavior.

          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | -------------------------- | ------- | -------- | ------------------------------------------------------------------ | | CURP Validation | ✅ | ✅ | Core validation logic present in both versions | | Inline validation | ✅ | ✅ | Both support validation during input. | | Error states coverage | ✅ | ✅ | Both handle errors, V2 structures them better and improves clarity | | Customization options | Limited | Advanced | V2 supports token-based customization | | Documentation completeness | Basic | Enhanced | V2 provides enhanced, standardized documentation coverage | *** ## Behavior Differences How the module behaves during runtime. | Behavior | V1 | V2 | Notes | | --------------------- | -------------------------------------- | --------------------------------------------------------- | ---------------------------------------------------------------------------- | | Error handling | Separate error states, less contextual | Clear, actionable error messages with improved UX writing | V2 reduces cognitive load. | | State transitions | Default transitions | Defined transitions between states | V2 includes transition smoothness and consistency as part of the experience. | | Flow and UI structure | Functional but less standardized | Structured and consistent | V2 follows standardized layout and spacing rules. | *** ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules. Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify. --- - Path: `design-and-ux/customization-adsign` - URL: https://developer.incode.com/design-and-ux/customization-adsign/ - Markdown: https://developer.incode.com/design-and-ux/customization-adsign.md # Customization AES This section outlines the elements you can customize within the **Advanced Signature** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms. ## Signature empty Entry point of the Advanced Signature module. This screen presents the user with a consent form titled "Accept and sign," accompanied by a brief instruction to accept the terms before completing the signature.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------- | --------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | **Text** | Title ("Accept and sign"), instruction text, button text | Fully localizable; tone and terminology can be adapted to match brand voice. | | **Background Color** | Screen background | Must maintain strong contrast with inputs, text, and CTAs for accessibility compliance. | | **Buttons (CTA)** | Button label (“Finish signing”), background color, text color | Uses brand tokens | | **Brand Colors** | Header text, accent color, input focus state, status indicators | Applied via design tokens; avoid reducing clarity in critical validation states. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | -------------------------------------------------------------------------------------------------- | | **CTA state behavior** | "Done" button remains disabled until a signature stroke is detected, preventing empty submissions. | | **Processing flow behavior** | Prevents duplicate submissions and manages loading states during signature capture. | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | :-------------------------------------- | :-------------------------------- | :------------ | | Title text (Accept and sign) | `text-body-primary` | `#262831` | | Instruction text | `text-body-secondary` | `#60667C` | | Document row surface | `surface-neutral-50` | `#F5F6F7` | | Document row border | `border-neutral-100` | `#E6E8EF` | | Document name text | `text-body-primary` | `#262831` | | “View” link | `button-tertiary-text-default` | `#0046FF` | | Background | `surface-neutral-0` | `#FFFFFF` | | Checkbox border (default) | `checkbox-border-default` | `#CFCFDF` | | Checkbox surface (default) | `checkbox-surface-default` | `#FCFCFD` | | Checkbox text | `checkbox-text-default` | `#262831` | | Checkbox group surface (selected state) | `surface-brand-50` | `#EAF0FF` | | Secondary container border | `border-neutral-400` | `#82879A` | | Secondary container surface | `surface-neutral-100` | `#F5F6F7` | | Primary button (disabled) background | `button-primary-surface-disabled` | `#EBECEF` | | Primary button (disabled) text | `button-primary-text-disabled` | `#60667C` | ### Design Notes * Keep field labels and helper text concise to reduce cognitive load. * Use brand colors sparingly for focus states and primary CTAs to maintain clarity. * Preserve sufficient color contrast across all states (idle, focus, error, disabled).
          ## Signature Filled This screen reflects the state after the user has checked all three consent checkboxes. Each checkbox is now marked and highlighted in blue, confirming the user's agreement to the terms.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, instruction text, button text, badge text | Fully localizable. Tone and terminology can align with brand and regulatory requirements. | | **Color Styling** | Background, input surfaces, text color, focus state, CTA background and text color | Applied via design tokens. Must maintain accessibility contrast standards. | | **CTA Label** | Primary button text (e.g., “Finish signing”) | Editable; action meaning must remain consistent with flow behavior. | | **Localization** | All textual content | Supports full localization. Layout should accommodate text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------------------- | ------------------------------------------------------------------------------ | | **CTA enabled behavior** | "Done" button is enabled only when a valid signature is present on the canvas. | | **Component spacing & safe areas** | Ensures cross-device consistency and accessibility. | | **Text hierarchy** | Maintains clear task communication and visual structure. | | **WCAG contrast requirements** | Mandatory for accessibility compliance. | ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | :------------------------------------------ | :------------------------------- | :------------ | | Title text (Accept and sign) | `text-body-primary` | `#262831` | | Instruction text | `text-body-secondary` | `#60667C` | | Screen background | `surface-neutral-100` | `#EBECEF` | | Modal/card surface | `surface-neutral-0` | `#FFFFFF` | | Document row surface | `surface-neutral-50` | `#F5F6F7` | | Document name text | `text-body-primary` | `#262831` | | “View” link | `button-tertiary-text-default` | `#0046FF` | | Checkbox surface (default) | `checkbox-surface-default` | `#FCFCFD` | | Checkbox icon (checkmark) | `checkbox-icon-default` | `#FFFFFF` | | Checkbox surface (selected) | `checkbox-surface-selected` | `#0046FF` | | Checkbox container surface (group selected) | `surface-brand-50` | `#EAF0FF` | | Checkbox text | `checkbox-text-default` | `#262831` | | Primary button background (default) | `button-primary-surface-default` | `#0046FF` | | Primary button text (default) | `button-primary-text-default` | `#FFFFFF` | ## Design notes * Keep the layout clear and vertically structured to reduce cognitive load. * The enabled "Finish signing" button signals readiness to submit, using a distinct color shift from its disabled state to reinforce interactivity. ***
          ## Signature loading Transitional state shown after the user taps "Finish signing." The screen retains the consent form layout while a loading spinner appears on the "Finish signing" button, providing visual feedback that the system is processing the request.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, success message, footer text | Fully localizable. Wording can align with brand tone and regulatory language. | | **Color Styling** | Background, text color, success icon color, CTA color | Applied via design tokens. Must maintain accessibility contrast, even in disabled states. | | **Localization** | All text content | Supports full translation. Layout should account for text expansion. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------- | | **Processing flow logic** | Controlled by backend verification services; cannot be modified at UI level. | | **Form structure hierarchy** | Field order and grouping remain standardized for consistency. | | **WCAG contrast requirements** | Accessibility compliance is mandatory, including disabled and loading states. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | :------------------------------------------ | :------------------------------- | :------------ | | Title text (Accept and sign) | `text-body-primary` | `#262831` | | Instruction text | `text-body-secondary` | `#60667C` | | Background | `surface-neutral-0` | `#FFFFFF` | | Document row surface | `surface-neutral-50` | `#FCFCFD` | | Document row border | `border-neutral-100` | `#EBECEF` | | Document name text | `text-body-primary` | `#262831` | | Main content surface | `surface-neutral-0` | `#FFFFFF` | | Checkbox surface (disabled) | `checkbox-surface-disabled` | `#82879A` | | Checkbox icon (checkmark) | `checkbox-icon-default` | `#FFFFFF` | | Checkbox container surface (disabled group) | `surface-neutral-400` | `#82879A` | | Checkbox text (disabled) | `checkbox-text-disabled` | `#60667C` | | Primary button background (loading/default) | `button-primary-surface-default` | `#006AFF` | | Primary button text | `button-primary-text-default` | `#FFFFFF` | | Loading spinner (on button) | `icon-inverse` | `#FFFFFF` |
          ## Design notes * Preserve layout stability when switching to loading state. * Maintain accessible contrast for spinner and disabled elements. ***
          ## Processing screen Intermediate screen displayed while the system processes the signature submission. The screen shows a spinning progress indicator alongside the text "Processing…", communicating to the user that their action is being handled and they should wait.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, success message, footer text | Fully localizable. Wording can align with brand tone and regulatory language. | | **Color Styling** | Background, text color, success icon color, CTA color | Applied via design tokens. Must maintain accessibility contrast, even in disabled states. | | **Localization** | All text content | Supports full translation. Layout should account for text expansion. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------- | | **Processing flow logic** | Controlled by backend verification services; cannot be modified at UI level. | | **Form structure hierarchy** | Field order and grouping remain standardized for consistency. | | **WCAG contrast requirements** | Accessibility compliance is mandatory, including disabled and loading states. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | :------------------------------ | :------------------------- | :------------ | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Spinner (active stroke) | `surface-brand-500-static` | `#006AFF` | | Spinner (track/background) | `surface-brand-50` | `#EAF0FF` | | Processing text (“Processing…”) | `text-body-primary` | `#262831` | ## Success Final confirmation screen of the Advanced Signature module. After processing completes, the screen displays a green checkmark icon along with the message "Signed successfully!" confirming that the signature has been captured and the process is complete. No further user action is required.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, success message, footer text | Fully localizable. Wording can align with brand tone and regulatory language. | | **Color Styling** | Background, text color, success icon color, CTA color | Applied via design tokens. Must maintain accessibility contrast, even in disabled states. | | **Localization** | All text content | Supports full translation. Layout should account for text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------- | | **Processing flow logic** | Controlled by backend verification services; cannot be modified at UI level. | | **Form structure hierarchy** | Field order and grouping remain standardized for consistency. | | **WCAG contrast requirements** | Accessibility compliance is mandatory, including disabled and loading states. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | :---------------------------------- | :--------------------- | :------------ | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Success icon background | `icon-status-positive` | `#1E7F11` | | Success icon (check) | `icon-neutral-0` | `#FFFFFF` | | Title text (“Signed successfully!”) | `text-body-primary` | `#262831` |
          --- - Path: `design-and-ux/customization-certificate-issuance` - URL: https://developer.incode.com/design-and-ux/customization-certificate-issuance/ - Markdown: https://developer.incode.com/design-and-ux/customization-certificate-issuance.md # Customization This section outlines the elements you can customize within the **Certificate Issuance** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms. *** ## Create your password - Empty Entry point of the Certificate Issuance module. This screen allows users to create and confirm their password before proceeding with the certificate issuance process. Clear validation states and password requirements help ensure a secure and successful account setup.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | | **Text** | Screen title, field labels, placeholders, helper text, validation messages, button text, processing and success messages | Fully localizable; tone and terminology can be adapted to align with brand voice and compliance requirements. | | **Input States** | Helper text, inline validation messaging, disabled and focus states | Validation logic remains fixed to preserve consistency and usability standards. | | **Background Color** | Screen background color | Must maintain sufficient contrast with text, inputs, and CTAs to support accessibility compliance. | | **Buttons (CTA)** | Button labels, background color, text color, disabled state styling | Uses brand tokens while preserving visibility and accessibility across states. | | **Brand Colors** | Accent colors, input focus state, loading indicator, success state colors | Applied via design tokens; avoid reducing clarity in validation, processing, or success states. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ---------------------------------------------------------------------- | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference | UI Element | Token | Raw Value | | --------------------------------- | ------------------------------- | --------- | | Screen background | surface-neutral-0 | #FFFFFF | | Header title text | text-body-primary | #262831 | | Password label text | input-text-label-default | #262831 | | Password placeholder text | input-text-input-placeholder | #B2879A | | Password input border | input-border-default | #B2879A | | Password input background | input-surface-default | #FCFCDD | | Confirm password label text | input-text-label-default | #262831 | | Confirm password placeholder text | input-text-input-placeholder | #B2879A | | Confirm password input border | input-border-default | #B2879A | | Confirm password input background | input-surface-default | #FCFCDD | | Continue button background | button-primary-surface-disabled | #EBECEF | | Continue button text | button-primary-text-disabled | #60667C | | Primary body text | text-body-800-primary | #262831 | | Secondary body text | text-body-400 | #B2879A |
          ## Create a password - Filled State displayed after the user has successfully entered their password. All required fields have been completed, validation requirements have been met, and the user can proceed to the Certificate Issuance process.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | | **Text** | Screen title, field labels, placeholders, helper text, validation messages, button text, processing and success messages | Fully localizable; tone and terminology can be adapted to align with brand voice and compliance requirements. | | **Input States** | Helper text, inline validation messaging, disabled and focus states | Validation logic remains fixed to preserve consistency and usability standards. | | **Background Color** | Screen background color | Must maintain sufficient contrast with text, inputs, and CTAs to support accessibility compliance. | | **Buttons (CTA)** | Button labels, background color, text color. | Uses brand tokens while preserving visibility and accessibility across states. | | **Brand Colors** | Accent colors, input focus state, loading indicator, success state colors | Applied via design tokens; avoid reducing clarity in validation, processing, or success states. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ---------------------------------------------------------------------- | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference
          | UI Element | Token | Raw Value | | --------------------------- | ------------------------------ | --------- | | Screen background | surface-neutral-0 | #FFFFFF | | Header title text | text-body-primary | #262831 | | Password label text | input-text-label-default | #262831 | | Password input text | input-text-input-default | #262831 | | Password input border | input-border-default | #B2879A | | Password input background | input-surface-default | #FCFCDD | | Confirm password label text | input-text-label-default | #262831 | | Confirm password input text | input-text-input-default | #262831 | | Confirm password border | input-border-default | #B2879A | | Confirm password background | input-surface-default | #FCFCDD | | Continue button background | button-primary-surface-default | #006AFF | | Continue button text | button-primary-text-default | #FFFFFF | | Primary body text | text-body-800-primary | #262831 | | Brand primary surface | surface-brand-500-static | #006AFF | ## Create a password - Loading Processing state of the Certificate Issuance module. This screen informs the user that the certificate issuance request is being processed. A loading indicator communicates that the operation is currently in progress while temporarily preventing duplicate submissions or interruptions to ensure a secure and successful issuance experience.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | --------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- | | **Text Elements** | Processing title, status message, helper text | Fully localizable. Tone and terminology can align with brand and compliance requirements. | | **Color Styling** | Background color, text color, loading indicator color, status icon color | Applied via design tokens. Must preserve accessibility contrast across all states. | | **Branding** | Logo placement, typography styles, accent colors | Branding updates should maintain readability and consistency throughout the verification flow. | | **Localization** | All textual content and regional formatting | Supports localization and translation. Layout should account for text expansion across languages. | | **Loading Indicator** | Spinner style and animation behavior | Customizable within approved motion and accessibility guidelines. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ---------------------------------------------------------------------- | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference
          | UI Element | Token | Raw Value | | ---------------------------- | ------------------- | --------- | | Screen background | surface-neutral-0 | #FFFFFF | | Processing spinner | surface-brand-400 | #3388FF | | Processing title text | text-body-primary | #262831 | | Processing helper text | text-body-secondary | #60667C | | Loading indicator background | surface-brand-100 | #D6E7FF | | Primary status icon | icon-status-info | #3388FF | | Primary body text | text-body-primary | #262831 | ### # Design Notes - Keep processing and success messaging concise to reduce cognitive load during the certificate issuance process. - Preserve sufficient color contrast across all states, including processing, success, disabled, and error states. - Maintain consistent spacing, typography, and iconography across all Certificate Issuance states to reinforce flow continuity.
          ## Processing The screen displays a loading indicator and processing message, communicating that the certificate issuance request is currently being processed. During this stage, the user is informed that the operation is in progress while duplicate submissions and interruptions are temporarily prevented to ensure a secure and successful issuance experience.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | | **Color Styling** | Background color, text color, success icon color, accent colors | Applied via design tokens. Must preserve accessibility contrast across all states. | | **Localization** | All textual content and regional formatting | Supports localization and translation. Layout should account for text expansion across languages. | ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------------------- | -------------------------------------------------------- | | **Component spacing & safe areas** | Ensures cross-device consistency and accessibility. | | **Text hierarchy** | Maintains clear task communication and visual structure. | | **WCAG contrast requirements** | Mandatory for accessibility compliance. | ### Token Reference | UI Element | Token | Raw Value | | ---------------------------- | ------------------- | --------- | | Screen background | surface-neutral-0 | #FFFFFF | | Processing spinner | surface-brand-400 | #3388FF | | Processing title text | text-body-primary | #262831 | | Processing helper text | text-body-secondary | #60667C | | Loading indicator background | surface-brand-100 | #D6E7FF | | Primary status icon | icon-status-info | #3388FF | | Primary body text | text-body-primary | #262831 | ## Design notes - Keep the layout clear, vertically structured, and easy to scan to reduce cognitive load. *** ## ## Create a password - Download certificate The screen indicates that the certificate has been successfully generated and is ready for download. A confirmation message is displayed along with a clear call-to-action allowing the user to download their certificate and complete the Certificate Issuance process. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | | **Color Styling** | Background color, text color, success icon color, accent colors | Applied via design tokens. Must preserve accessibility contrast across all states. | | **Localization** | All textual content and regional formatting | Supports localization and translation. Layout should account for text expansion across languages. | ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------------------- | -------------------------------------------------------- | | **Component spacing & safe areas** | Ensures cross-device consistency and accessibility. | | **Text hierarchy** | Maintains clear task communication and visual structure. | | **WCAG contrast requirements** | Mandatory for accessibility compliance. | ### Token Reference | UI Element | Token | Raw Value | | ----------------------------- | ------------------------------ | --------- | | Screen background | surface-neutral-0 | #FFFFFF | | Success title text | text-body-primary | #262831 | | Success helper text | text-body-secondary | #60667C | | Primary CTA button background | button-primary-surface-default | #006AFF | | Primary CTA button text | button-primary-text-default | #FFFFFF | ## Design notes - Keep the layout clear, vertically structured, and easy to scan to reduce cognitive load. ## Create a password - Done The screen confirms that the certificate has been successfully generated and downloaded. A success message is displayed to indicate completion of the Certificate Issuance process, along with a final confirmation that the user can exit the flow or proceed with the downloaded certificate. ###
          Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | | **Color Styling** | Background color, text color, success icon color, accent colors | Applied via design tokens. Must preserve accessibility contrast across all states. | | **Localization** | All textual content and regional formatting | Supports localization and translation. Layout should account for text expansion across languages. | ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------------------- | -------------------------------------------------------- | | **Component spacing & safe areas** | Ensures cross-device consistency and accessibility. | | **Text hierarchy** | Maintains clear task communication and visual structure. | | **WCAG contrast requirements** | Mandatory for accessibility compliance. | ### Token Reference | UI Element | Token | Raw Value | | ----------------------------- | ------------------------------ | --------- | | Screen background | surface-neutral-0 | #FFFFFF | | Success icon background | surface-brand-100 | #D6E7FF | | Success icon | icon-status-positive | #1E7F11 | | Success title text | text-body-primary | #262831 | | Success helper text | text-body-secondary | #60667C | | Primary CTA button background | button-primary-surface-default | #006AFF | | Primary CTA button text | button-primary-text-default | #FFFFFF |

          --- - Path: `design-and-ux/customization-ekyb` - URL: https://developer.incode.com/design-and-ux/customization-ekyb/ - Markdown: https://developer.incode.com/design-and-ux/customization-ekyb.md # Customization This section outlines the elements you can customize within the **eKYB** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms. ## Empty form The Empty Form screen introduces the eKYB Verification step and clearly communicates that the user must provide personal and document information for identity validation.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------- | ----------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | | **Text** | Title (“eKYB Verification”), field labels, placeholders, helper messages, error messages, button text | Fully localizable; tone and terminology can be adapted to match brand voice and regulatory requirements. | | **Field Set** | Displayed fields (e.g., Driver’s License, Credit Bureau, Registry source) | Defined by selected verification source in dashboard configuration; structure remains consistent. | | **Input States** | Helper text, inline validation messaging | Validation logic is fixed; messaging style can be customized. | | **Background Color** | Screen background | Must maintain strong contrast with inputs, text, and CTAs for accessibility compliance. | | **Buttons (CTA)** | Button label (“Continue”), background color, text color | Uses brand tokens | | **Brand Colors** | Header text, accent color, input focus state, status indicators | Applied via design tokens; avoid reducing clarity in critical validation states. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | --------------------------------------- | --------------------------------------------------------------------------------------------------- | | **Verification logic & decision rules** | Defined by backend services and compliance requirements; cannot be modified at the UI level. | | **Required field validation rules** | Ensures data accuracy, fraud prevention, and regulatory compliance. | | **Form structure hierarchy** | Designed for clarity, usability, and completion consistency across markets and platforms. | | **Processing flow behavior** | Prevents duplicate submissions, race conditions, and system instability. | | **CTA state behavior** | Controls when submission is allowed and manages loading/disabled states to prevent invalid actions. | | **Error handling logic** | System-defined to protect data integrity and ensure consistent feedback. | | **Component spacing & safe areas** | Guarantees cross-device consistency and accessibility across screen sizes. | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | :------------------------------------- | :-------------------------------- | :------------ | | Title text (eKYB Verification) | `text-body-primary` | `#262831` | | dropdown label text | `dropdown-text-label-default` | `#262831` | | dropdown input text | `dropdown-text-input-default` | `#262831` | | Dropdown border | `dropdown-border-default` | `#82879A` | | Dropdown surface | `dropdown-surface-default` | `#FCFCFD` | | Dropdown chevron icon | `icon-neutral-500` | `#60667C` | | Input label text | `input-text-label-default` | `#262831` | | Input border | `input-border-default` | `#82879A` | | Input surface | `input-surface-default` | `#FCFCFD` | | Section heading (Address details) | `text-body-primary` | `#262831A` | | Tertiary button text (Add another UBO) | `button-tertiary-text-default` | `#006AFF` | | Background surface | `surface-neutral-0` | `#FFFFFF` | | Button background (disabled) | `button-primary-surface-disabled` | `#EBECEF` | | Button text (disabled) | `button-primary-text-disabled` | `#60667C` | ### Design Notes * Keep field labels and helper text concise to reduce cognitive load. * Use brand colors sparingly for focus states and primary CTAs to maintain clarity. * Preserve sufficient color contrast across all states (idle, focus, error, disabled).
          ## Form Filled This state appears while the user is actively entering business or UBO information. It provides visual feedback for focused fields and ongoing input. The currently active fields is visually highlighted with a blue border indicating focus. The continue button is fully enabled, allowing the user to submit the form for backend verification.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, input labels, placeholders, section headers, button text, helper messages | Fully localizable. Tone and terminology can align with brand and regulatory requirements. | | **Color Styling** | Background, input surfaces, text color, focus state, CTA background and text color | Applied via design tokens. Must maintain accessibility contrast standards. | | **CTA Label** | Primary button text (e.g., “Continue”) | Editable; action meaning must remain consistent with flow behavior. | | **Icons & Logo** | Brand logo and informational/status icons | Visual style may follow brand guidelines; placement remains consistent. | | **Localization** | All textual content | Supports full localization. Layout should accommodate text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------------------- | ----------------------------------------------------------------------------------------- | | **Validation logic** | All required fields must pass system-defined validation rules before enabling submission. | | **CTA enabled behavior** | The primary button activates only when all mandatory inputs are valid. | | **Form structure hierarchy** | Field grouping and order are standardized for clarity and completion consistency. | | **Processing transition behavior** | Submission triggers a controlled transition to the processing state. | | **Error handling logic** | Defined by backend validation and compliance rules. | | **Component spacing & safe areas** | Ensures cross-device consistency and accessibility. | | **Text hierarchy** | Maintains clear task communication and visual structure. | | **WCAG contrast requirements** | Mandatory for accessibility compliance. | ### Token Reference
          | UI Element | Token | Raw Value | | -------------------------------- | ---------------------------------------------- | --------- | | Title text (eKYB Verification) | `text-body-800-primary` | `#262831` | | Input label text (Business name) | `text-body-800-primary` | `#262831` | | Input border (focused) | `input-border-focused` / `border-status-focus` | `#006AFF` | | Input surface (focused) | `input-surface-focused` / `surface-neutral-50` | `#FCFCFD` | ## Design notes * Keep the layout clear and vertically structured to reduce cognitive load. * The “focused” token reference indicates an actively selected input field (user tap/click), providing visual feedback during data entry. ***
          ## Form Processing This state appears after form submission and indicates that identity verification is in progress. Inputs and the primary CTA are disabled while the system processes and validates the submitted data.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ------------------------------ | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, input labels, helper messages, footer text | Fully localizable. Wording can align with brand tone and regulatory language. | | **Color Styling** | Background, input surfaces (disabled state), text color, CTA color | Applied via design tokens. Must maintain accessibility contrast, even in disabled states. | | **Processing Indicator Style** | Spinner style and accent color | Animation behavior remains fixed; color must meet accessibility standards. | | **Icons & Logo** | Brand logo and footer trust indicator | Visual style may follow brand guidelines; placement remains consistent. | | **Localization** | All text content | Supports full translation. Layout should account for text expansion. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | --------------------------------- | ----------------------------------------------------------------------------- | | **Submission lock behavior** | Prevents duplicate submissions while verification is in progress. | | **Disabled input state** | Inputs are non-editable during processing to ensure data consistency. | | **Processing flow logic** | Controlled by backend verification services; cannot be modified at UI level. | | **Minimum processing duration** | Prevents abrupt transitions and ensures proper system response handling. | | **CTA loading state behavior** | Displays a loading indicator and blocks further interaction until resolution. | | **Error & success routing logic** | System-defined transition to next state based on verification outcome. | | **Form structure hierarchy** | Field order and grouping remain standardized for consistency. | | **WCAG contrast requirements** | Accessibility compliance is mandatory, including disabled and loading states. |

          ### Token Reference
          | UI Element | Token | Raw Value | | -------------------------------------- | ------------------------------------------------------------- | --------- | | Title text (eKYB Verification) | `text-body-800-primary` | `#262831` | | Dropdown label text (Country) | `dropdown-text-label-default` / `text-body-800-primary` | `#262831` | | Dropdown field text (disabled) | `dropdown-text-field-disabled` / `text-body-400` | `#82879A` | | Dropdown chevron icon (disabled) | `icon-neutral-300` | `#A3A8B8` | | Input label text (Business name) | `input-text-label-default` / `text-body-800-primary` | `#262831` | | Input field text (disabled) | `input-text-field-disabled` / `text-body-400` | `#82879A` | | Input border (disabled) | `input-border-disabled` / `border-neutral-100` | `#EBECEF` | | Input surface (disabled) | `input-surface-disabled` / `surface-neutral-100` | `#EBECEF` | | Section heading (Address details) | `text-body-800-primary` | `#262831` | | Tertiary button text (Add another UBO) | `button-tertiary-text-default` / `text-accent-brand` | `#006AFF` | | Background surface | `surface-neutral-0` | `#FFFFFF` | | Button surface (loading/default) | `button-primary-surface-default` / `surface-brand-500-static` | `#006AFF` |
          ## Design notes * Disable inputs and CTA interaction during processing. * Preserve layout stability when switching to loading state. * Maintain accessible contrast for spinner and disabled elements. ***
          ## Form Error The Form Error state appears when one or more fields contain invalid or non-compliant data. The system provides inline validation feedback, clearly highlighting the affected field and displaying an error message to guide correction. The primary CTA remains disabled until all validation errors are resolved.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | --------------------------- | ------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | | **Text Elements** | Title, field labels, error messages, helper text, button text | Fully localizable. Error tone can align with brand voice while remaining clear and compliant. | | **Color Styling** | Background, input surfaces, text color, CTA color | Applied via design tokens. Error colors must preserve accessibility contrast. | | **Error Messaging Content** | Inline validation copy | Messaging style may vary; validation logic cannot. | | **Icons** | Error icon (if displayed) | Visual style may follow brand guidelines; semantic meaning must remain consistent. | | **Localization** | All textual content | Supports translation; layout must accommodate text expansion. | ### Fixed Elements
          | **Element** | **Why it is fixed** | | ------------------------------ | ------------------------------------------------------------------------- | | **Validation logic** | Defined by backend rules and compliance requirements. | | **Error state behavior** | Field border, helper text, and status color change are system-controlled. | | **CTA disabled behavior** | Prevents submission while invalid data exists. | | **Error placement (inline)** | Ensures clear association between field and message. | | **Form hierarchy & layout** | Maintains usability and scanning consistency. | | **WCAG contrast requirements** | Error states must meet accessibility standards. | | **Status color semantics** | Negative color usage is standardized across the system. | ### Token Reference
          | UI Element | Token | Raw Value | | ------------------------------ | ----------------------------------------------------- | --------- | | Input field text (default) | `input-text-field-default` / `text-body-800-primary` | `#262831` | | Input border (negative/error) | `input-border-negative` / `border-status-negative` | `#E71111` | | Input surface (negative/error) | `input-surface-negative` / `surface-neutral-100` | `#EBECEF` | | Error icon | `input-icon-negative` / `surface-status-negative-600` | `#E71111` | | Error helper text | `input-text-helper-negative` / `text-status-negative` | `#E71111` |
          ## Design notes * Use negative status color only for validation failures to preserve semantic clarity. * Maintain layout stability when helper text appears. * Ensure error color contrast meets accessibility requirements. ***
          ## Processing Screen The Processing Screen appears after form submission when eKYC verification is being completed by backend services. It communicates that validation is in progress and temporarily restricts user interaction until a result is returned. ### Customizable Elements
          | **Area** | **What can be customized** | **Notes** | | ----------------- | ---------------------------------- | -------------------------------------------------------------------- | | **Heading Text** | “Processing…” message | Fully localizable. Wording can align with brand tone. | | **Color Styling** | Background, logo color, text color | Applied via design tokens. Must maintain accessibility contrast. | | **Spinner Style** | Spinner design and accent color | Animation behavior remains fixed; visual style may align with brand. | | **Brand Logo** | Logo appearance | Must follow brand guidelines; placement remains consistent. | | **Localization** | All textual content | Supports translation; layout must account for text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | --------------------------------------------------------- | | **Processing behavior logic** | Controlled by backend verification services. | | **Interaction lock** | Prevents navigation or modification during verification. | | **Minimum display duration** | Avoids flicker and ensures perceived stability. | | **Spinner animation behavior** | Standardized motion timing for consistency. | | **Screen layout hierarchy** | Maintains vertical alignment and focus on status message. | | **WCAG contrast compliance** | Required for accessibility across themes. | | **Result routing logic** | Determines transition to Success or Error states. | ### Token Reference
          | UI Element | Token | Raw Value | | -------------------------------- | ------------------------------------------------------ | --------- | | Spinner primary (arc) | `spinner-surface-primary` / `surface-brand-500-static` | `#006AFF` | | Spinner secondary (track) | `spinner-surface-secondary` / `surface-brand-50` | `#E5F0FF` | | Spinner title text (Processing…) | `spinner-text-title` / `text-body-800-primary` | `#262831` | | Background surface | `surface-neutral-0` | `#FFFFFF` | ## Design notes * The spinner must provide immediate feedback after submission. * Maintain layout simplicity to reduce cognitive load during waiting states. * Keep messaging concise to avoid uncertainty. ***
          ## Failure Screen The Failure Screen appears when eKYC verification cannot be completed due to validation conflicts, backend errors, or system issues. It clearly communicates that the process was unsuccessful and provides the user with an option to retry. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | | **Heading / Message Text** | Title and supporting message (e.g., “Something went wrong”) | Fully localizable. Messaging tone may align with brand voice while remaining clear and neutral. | | **CTA Label** | Button text (e.g., “Try again”) | Editable; action must preserve retry behavior. | | **Color Styling** | Background, text color, CTA color | Applied via design tokens. Must maintain accessibility contrast. | | **Error Icon Style** | Icon visual style | Must preserve negative semantic meaning. | | **Localization** | All textual elements | Layout should support text expansion across languages. | ### Fixed Elements
          | **Element** | **Why it is fixed** | | ------------------------------------ | ----------------------------------------------------------- | | **Failure routing logic** | Determined by backend verification result. | | **Retry behavior** | CTA triggers a controlled restart of the verification flow. | | **Negative status color usage** | Standardized to maintain consistent semantic meaning. | | **Screen layout hierarchy** | Centered status layout ensures clarity and focus. | | **WCAG contrast requirements** | Error state must meet accessibility standards. | | **Navigation controls (close icon)** | Placement standardized across modules. | ### Token Reference
          | UI Element | Token | Raw Value | | --------------------------------------- | ------------------------------------------------------------- | --------- | | Error icon (X symbol) | `icon-status-negative` | `#E71111` | | Error icon (inner X mark) | `icon-neutral-0` | `#FFFFFF` | | Error title text (Something went wrong) | `spinner-text-title` / `text-body-800-primary` | `#262831` | | Background surface | `surface-neutral-0` | `#FFFFFF` | | Button surface (Try again) | `button-primary-surface-default` / `surface-brand-500-static` | `#006AFF` | | Button text (Try again) | `button-primary-text-default` / `text-body-0-static` | `#FFFFFF` | ## Design notes * The spinner must provide immediate feedback after submission. * Maintain layout simplicity to reduce cognitive load during waiting states. * Keep messaging concise to avoid uncertainty. ***
          ## Success Screen The Success Screen appears when eKYB verification has been successfully completed. It confirms that the user’s identity has been validated and indicates that the flow will proceed to the next step or module. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ---------------------- | --------------------------------------------- | ---------------------------------------------------------------- | | **Heading Text** | Confirmation message (e.g., “eKYC verified!”) | Fully localizable. Messaging tone may align with brand voice. | | **Color Styling** | Background, text color, logo color | Applied via design tokens. Must maintain accessibility contrast. | | **Success Icon Style** | Icon visual design | Must preserve positive semantic meaning. | | **Localization** | All textual content | Layout should support text expansion across languages. | | **Text Alignment** | Center alignment behavior | May be adjusted within layout guidelines. | ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------------ | -------------------------------------------------------- | | **Success routing logic** | Determined by backend verification result. | | **Positive status color usage** | Standardized semantic mapping for success states. | | **Screen layout hierarchy** | Centered status layout ensures clarity and focus. | | **Transition behavior** | Automatically proceeds or triggers next configured step. | | **Navigation controls (close icon)** | Placement standardized across modules. | | **WCAG contrast requirements** | Mandatory for accessibility compliance. | ### Token Reference
          | UI Element | Token | Raw Value | | ----------------------------------- | ---------------------------------------------- | --------- | | Success icon (checkmark circle) | `icon-status-positive` | `#E71111` | | Success icon (inner checkmark) | `icon-neutral-0` | `#FFFFFF` | | Success title text (eKYB verified!) | `spinner-text-title` / `text-body-800-primary` | `#262831` | | Background surface | `surface-neutral-0` | `#FFFFFF` | ## Design notes * Keep confirmation messaging short and clear. * Use positive status color exclusively for successful outcomes. ***
          --- - Path: `design-and-ux/customization-ekyc` - URL: https://developer.incode.com/design-and-ux/customization-ekyc/ - Markdown: https://developer.incode.com/design-and-ux/customization-ekyc.md # Customization This section outlines the elements you can customize within the eKYC module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms. *** ## Enter your details The image below shows the Enter your details form in its empty state. **_First name_**, **_Last name_**, and **_Date of Birth_** are required fields marked with an asterisk. **_Middle name_** is optional. **Continue** submits the step. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | --- | --- | --- | | **Text Elements** | Title, subtitle, field labels, button text, footer copy | Fully localizable. Wording can align with brand tone and regulatory language. | | **Color Styling** | Background, input surfaces, text color, focus and CTA colors | Applied via design tokens. Must maintain accessibility contrast. | | **CTA Label** | Continue button label | Editable; action meaning must remain consistent with flow behavior. | | **Icons & Logo** | Date picker icon, brand logo, and footer “verified by” lockup | Visual style may follow brand guidelines; placement remains consistent. | | **Date of Birth control** | Calendar icon and date-entry presentation | Visual style may follow brand; date format and picker behavior stay consistent. | | **Localization** | All on-screen text | Supports full translation. Layout should account for text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | --- | --- | | **Required field rules** | **_First name_**, **_Last name_**, and **_Date of Birth_** are mandatory; required markers cannot be removed. | | **Optional middle name** | **_Middle name_** stays optional; it cannot be marked required. | | **Empty-state input behavior** | Fields start empty and remain editable in this state. | | **Field order** | **_First name_**, **_Middle name_**, **_Last name_**, and **_Date of Birth_** stays standardized. | | **Form structure hierarchy** | Title, subtitle, fields, **Continue**, and footer remain in a fixed vertical order. | | **CTA role** | **Continue** submits the step and advances to Driver’s License details. | | **Date of Birth input type** | Date entry stays a date control; it cannot be replaced with a free-text field. | | **Footer placement** | The “verified by” lockup stays at the bottom. | | **Component spacing & safe areas** | Guarantees cross-device consistency and accessibility across screen sizes. | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. | ### Token Reference | **UI Element** | **Token** | **Raw Value** | | --- | --- | --- | | **Title text (Enter your details)** | text-body-800-primary | #262831 | | **Subtitle text** | text-body-500-secondary | #60667C | | **Input label text** | input-text-label-default | #262831 | | **Input border (default)** | input-border-default / border-neutral-300 | #A3A8B8 | | **Input surface (default)** | input-surface-default / surface-neutral-50 | #FCFCFD | | **Input placeholder** | input-text-field-placeholder | #A3A8B8 | | **Date picker icon** | icon-neutral-500 | #60667C | | **Progress track (inactive)** | surface-neutral-250 | #B5B8C5 | | **Primary button surface (Continue)** | button-primary-surface-default / surface-brand-500-static | #0054FF | | **Primary button text (Continue)** | button-primary-text-default / text-body-0-static | #FFFFFF | | **Background surface** | surface-neutral-0 | #FFFFFF | | **Screen background** | surface-neutral-0 | #FFFFFF | ### Design notes - Keep field labels and helper text concise to reduce cognitive load. - Use brand colors sparingly for focus states and primary CTAs to maintain clarity. - Preserve sufficient color contrast across all states (idle, focus, error, disabled). *** ## Enter your details - Filled The image below shows the Enter your details form with **_First name_**, **_Last name_**, and **_Date of Birth_** filled in. **Continue** advances to Driver’s License details. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | --- | --- | --- | | **Text Elements** | Title, subtitle, field labels, filled values, button text, footer copy | Fully localizable. Wording can align with brand tone and regulatory language. | | **Color Styling** | Background, filled input surfaces, text color, focus and CTA colors | Applied via design tokens. Must maintain accessibility contrast standards. | | **CTA Label** | Continue button label | Editable; action meaning must remain consistent with flow behavior. | | **Icons & Logo** | Date picker icon, brand logo, and footer “verified by” lockup | Visual style may follow brand guidelines; placement remains consistent. | | **Localization** | All on-screen text | Supports full localization. Layout should accommodate text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | --- | --- | | **Filled-state input behavior** | Fields show entered values and remain editable; they are not locked in this state. | | **Required field rules** | **_First name_**, **_Last name_**, and **_Date of Birth_** remain mandatory; required markers cannot be removed. | | **Optional middle name** | **_Middle name_** stays optional even when filled. | | **Field order** | **_First name_**, **_Middle name_**, **_Last name_**, and **_Date of Birth_** stays standardized. | | **Form structure hierarchy** | Title, subtitle, fields, **Continue**, and footer remain in a fixed vertical order. | | **CTA role** | **Continue** submits the details and advances to Driver’s License details. | | **Date of Birth input type** | Date entry stays a date control; format is system-defined. | | **WCAG contrast requirements** | Mandatory for accessibility compliance. | ### Token Reference | **UI Element** | **Token** | **Raw Value** | | --- | --- | --- | | **Title text (Enter your details)** | text-body-800-primary | #262831 | | **Subtitle text** | text-body-500-secondary | #60667C | | **Input label text** | input-text-label-default | #262831 | | **Input field text (filled)** | input-text-field-default / text-body-800-primary | #262831 | | **Input border (default)** | input-border-default / border-neutral-300 | #A3A8B8 | | **Input surface (default)** | input-surface-default / surface-neutral-50 | #FCFCFD | | **Date picker icon** | icon-neutral-500 | #60667C | | **Progress track (inactive)** | surface-neutral-250 | #B5B8C5 | | **Primary button surface (Continue)** | button-primary-surface-default / surface-brand-500-static | #0054FF | | **Primary button text (Continue)** | button-primary-text-default / text-body-0-static | #FFFFFF | | **Background surface** | surface-neutral-0 | #FFFFFF | | **Input field text (date of birth)** | input-text-field-default / text-body-800-primary | #262831 | | **Date picker icon (DOB)** | icon-neutral-500 | #60667C | | **Screen background** | surface-neutral-0 | #FFFFFF | ### Design notes - Keep the layout clear and vertically structured to reduce cognitive load. - The “focused” token reference indicates an actively selected input field (user tap/click), providing visual feedback during data entry. *** ## Driver’s License Details The image below shows the Driver’s License details form in its empty state. **_Driver's License number_**, **_Driver's License state_**, and **_Driver's License expiration date_** are all required. **Continue** submits the step. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | --- | --- | --- | | **Text Elements** | Title, field labels, placeholders, Continue, footer copy | Fully localizable. Wording can align with brand tone and regulatory language. | | **Color Styling** | Background, input surfaces, text color, focus and CTA colors | Applied via design tokens. Must maintain accessibility contrast. | | **CTA Label** | Continue button label | Editable; action meaning must remain consistent with flow behavior. | | **Icons & Logo** | Dropdown chevron, date picker icon, brand logo, and footer “verified by” lockup | Visual style may follow brand guidelines; placement remains consistent. | | **Localization** | All on-screen text | Supports full translation. Layout should account for text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | --- | --- | | **Required field rules** | **_Driver's License number_**, **_Driver's License state_**, and **_Driver's License expiration date_** are mandatory; this screen has no required asterisks. | | **Empty-state input behavior** | Fields start empty and remain editable in this state. | | **Field order** | **_Driver's License number_**, **_Driver's License state_**, then **_Driver's License expiration date_** stays standardized. | | **Form structure hierarchy** | Title, fields, **Continue**, and footer remain in a fixed vertical order. | | **CTA role** | **Continue** submits the license details and advances to processing. | | **Issuing state control** | **_Driver's License state_** stays a dropdown; it cannot be replaced with a free-text field. | | **Expiration date input type** | **_Driver's License expiration date_** stays a date control; it cannot be replaced with a free-text field. | | **Footer placement** | The “verified by” lockup stays at the bottom. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. | ### Token Reference | **UI Element** | **Token** | **Raw Value** | | --- | --- | --- | | **Title text (Driver’s License details)** | text-body-800-primary | #262831 | | **Input label (Driver’s License number)** | input-text-label-default / text-body-800-primary | #262831 | | **Dropdown label (State)** | dropdown-text-label-default / text-body-800-primary | #262831 | | **Input label (expiration date)** | input-text-label-default / text-body-800-primary | #262831 | | **Input surface (default)** | input-surface-default / surface-neutral-50 | #FCFCFD | | **Input border (default)** | input-border-default / border-neutral-300 | #A3A8B8 | | **Dropdown surface (State)** | dropdown-surface-default / surface-neutral-50 | #FCFCFD | | **Dropdown border (State)** | dropdown-border-default / border-neutral-300 | #A3A8B8 | | **Dropdown chevron** | icon-neutral-500 | #60667C | | **Date picker icon** | icon-neutral-500 | #60667C | | **Progress track (active)** | surface-brand-500 | #0054FF | | **Screen background** | surface-neutral-0 | #FFFFFF | | **Primary button surface (Continue)** | button-primary-surface-default / surface-brand-500-static | #0054FF | | **Primary button text (Continue)** | button-primary-text-default / text-body-0-static | #FFFFFF | | **Input surface (expiration date)** | input-surface-default / surface-neutral-50 | #FCFCFD | ### Design notes - Disable inputs and CTA interaction during processing. - Preserve layout stability when switching to loading state. - Maintain accessible contrast for spinner and disabled elements. *** ## Driver’s License Details- Filled The image below shows the Driver's License details form with **_Driver's License number_**, **_Driver's License state_**, and **_Driver's License expiration date_** filled in. **Continue** submits the step. The primary CTA remains disabled until all validation errors are resolved. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | --- | --- | --- | | **Text Elements** | Title, field labels, filled values, Continue, footer copy | Fully localizable. Wording can align with brand tone and regulatory language. | | **Color Styling** | Background, filled input surfaces, text color, focus and CTA colors | Applied via design tokens. Must maintain accessibility contrast standards. | | **CTA Label** | Continue button label | Editable; action meaning must remain consistent with flow behavior. | | **Icons & Logo** | Dropdown chevron, date picker icon, brand logo, and footer “verified by” lockup | Visual style may follow brand guidelines; placement remains consistent. | | **Localization** | All on-screen text | Supports full localization. Layout should accommodate text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | --- | --- | | **Filled-state input behavior** | Fields show entered values and remain editable; they are not locked in this state. | | **Required field rules** | **_Driver's License number_**, **_Driver's License state_**, and **_Driver's License expiration date_** remain mandatory; this screen has no required asterisks. | | **Field order** | **_Driver's License number_**, **_Driver's License state_**, then **_Driver's License expiration date_** stays standardized. | | **Form structure hierarchy** | Title, fields, **Continue**, and footer remain in a fixed vertical order. | | **CTA role** | **Continue** submits the license details and advances to processing. | | **Issuing state control** | **_Driver's License state_** stays a dropdown; the selected value remains editable until submit. | | **Expiration date input type** | **_Driver's License expiration date_** stays a date control; format is system-defined. | ### Token Reference | **UI Element** | **Token** | **Raw Value** | | --- | --- | --- | | **Title text (Driver’s License details)** | text-body-800-primary | #262831 | | **Input label text** | input-text-label-default | #262831 | | **Input field text (filled)** | input-text-field-default / text-body-800-primary | #262831 | | **Input border (default)** | input-border-default / border-neutral-300 | #A3A8B8 | | **Input surface (default)** | input-surface-default / surface-neutral-50 | #FCFCFD | | **Dropdown text (filled)** | dropdown-text-input-default / text-body-800-primary | #262831 | | **Dropdown chevron / date icon** | icon-neutral-500 | #60667C | | **Primary button surface (Continue)** | button-primary-surface-default / surface-brand-500-static | #0054FF | | **Primary button text (Continue)** | button-primary-text-default / text-body-0-static | #FFFFFF | *** ## Processing Screen A full-screen processing state shown right after submission. The screen reads “Processing…” while the request is in flight. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | --- | --- | --- | | **Heading Text** | “Processing…” message | Fully localizable. Wording can align with brand tone. | | **Color Styling** | Background, logo color, text color | Applied via design tokens. Must maintain accessibility contrast. | | **Spinner Style** | Spinner design and accent color | Animation behavior remains fixed; visual style may align with brand. | | **Brand Logo** | Logo appearance | Must follow brand guidelines; placement remains consistent. | | **Localization** | All textual content | Supports translation; layout must account for text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | --- | --- | | **Processing behavior logic** | Controlled by backend verification services. | | **Interaction lock** | Prevents navigation or modification during verification. | | **Minimum display duration** | Avoids flicker and ensures perceived stability. | | **Spinner animation behavior** | Standardized motion timing for consistency. | | **Screen layout hierarchy** | Maintains vertical alignment and focus on status message. | | **WCAG contrast compliance** | Required for accessibility across themes. | ### Token Reference | **UI Element** | **Token** | **Raw Value** | | --- | --- | --- | | **Spinner primary accent** | spinner-surface-primary | #0054FF | | **Spinner secondary surface** | spinner-surface-secondary | #E5F0FF | | **Processing text** | spinner-text-title | #262831 | | **Screen background** | surface-neutral-0 | #FFFFFF | ### Design notes - The spinner must provide immediate feedback after submission. - Maintain layout simplicity to reduce cognitive load during waiting states. - Keep messaging concise to avoid uncertainty. *** ## Success The success state that closes the flow. Shows an “Information submitted!” message confirming the eKYC verification was successful. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | --- | --- | --- | | **Text Elements** | Success title (e.g., “Information submitted!”) | Fully localizable. Wording can align with brand tone while remaining a success confirmation. | | **Color Styling** | Background, success icon color, title color | Applied via design tokens. Success color must remain clearly positive. | | **Success icon** | Checkmark or equivalent success icon | Visual style may follow brand guidelines; meaning must remain success. | | **Icons & Logo** | Close icon, brand logo, and footer “verified by” lockup | Visual style may follow brand guidelines; placement remains consistent. | | **Localization** | All on-screen text | Supports full translation. Layout should account for text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | --- | --- | | **Success messaging** | Screen must communicate successful submission (“Information submitted!”). It cannot be framed as an error. | | **No retry CTA** | This state has no Try again action; recovery belongs on the error screen. | | **Positive status color usage** | Standardized semantic mapping for success states. | | **Screen layout hierarchy** | Close control, success icon, title, and footer remain in a fixed vertical order. | | **WCAG contrast requirements** | Success state must meet accessibility standards. | ### Token Reference | **UI Element** | **Token** | **Raw Value** | | --- | --- | --- | | **Success icon** | icon-status-positive | #189F60 | | **Success icon inner** | icon-neutral-0 | #FFFFFF | | **Success title (Information submitted!)** | text-body-800-primary | #262831 | | **Close icon** | icon-neutral-500 | #60667C | | **Screen background** | surface-neutral-0 | #FFFFFF | | **Background surface** | surface-neutral-0 | #FFFFFF | ### Design notes - Keep confirmation messaging short and clear. - Use positive status color exclusively for successful outcomes. - Do not offer a retry action; this state confirms completion. *** ## Error Shown when eKYC verification fails due to backend validation or service errors. Shows a “Something went wrong” message and a **Try again** button to let the user restart the attempt. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | --- | --- | --- | | **Text Elements** | Error title, Try again label, and footer copy | Fully localizable. Wording can align with brand tone while remaining an error recovery state. | | **Color Styling** | Background, error icon color, title color, CTA colors | Applied via design tokens. Error color must remain clearly negative. | | **CTA Label** | Try again button label | Editable; action meaning must remain a retry of the failed submission. | | **Error icon** | Warning or equivalent error icon | Visual style may follow brand guidelines; meaning must remain failure. | | **Localization** | All on-screen text | Supports full translation. Layout should account for text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | --- | --- | | **Failure messaging** | Screen must communicate that something went wrong. It cannot be framed as success. | | **Retry CTA role** | **Try again** retries the submission. This action cannot be removed from the error state. | | **Negative status color usage** | Standardized to maintain consistent semantic meaning. | | **Screen layout hierarchy** | Error icon, title, **Try again**, close control, and footer remain in a fixed vertical order. | | **Footer placement** | The “verified by” lockup stays at the bottom. | | **WCAG contrast requirements** | Error state must meet accessibility standards. | ### Token Reference | **UI Element** | **Token** | **Raw Value** | | --- | --- | --- | | **Error icon** | icon-status-negative | #E71111 | | **Error icon inner** | icon-neutral-0 | #FFFFFF | | **Failure title (Something went wrong)** | text-body-800-primary | #262831 | | **Primary button surface (Try again)** | button-primary-surface-default / surface-brand-500-static | #0054FF | | **Primary button text (Try again)** | button-primary-text-default / text-body-0-static | #FFFFFF | | **Screen background** | surface-neutral-0 | #FFFFFF | ### Design notes - Communicate the failure clearly and concisely, without blame. - Use negative status color consistently to signal the error state. - Make Try again the clear, primary recovery action. --- - Path: `design-and-ux/customization-esign` - URL: https://developer.incode.com/design-and-ux/customization-esign/ - Markdown: https://developer.incode.com/design-and-ux/customization-esign.md # Customization This section outlines the elements you can customize within the **Electronic Signature** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms. ## Signature canva The Signature Canvas screen is the entry point of the Electronic Signature module. It presents the user with a blank drawing area and clearly communicates that they must draw their signature using a finger or mouse to proceed.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------- | ---------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | **Text** | Title ("Draw your signature"), instruction text, placeholder ("Sign here"), button text, badge textt | Fully localizable; tone and terminology can be adapted to match brand voice. | | **Canvas** | Border style, background color, placeholder text and color | Canvas dimensions remain consistent; styling can be adapted to match brand design. | | **Background Color** | Screen background | Must maintain strong contrast with inputs, text, and CTAs for accessibility compliance. | | **Buttons (CTA)** | Button label (“Done”), background color, text color | Uses brand tokens | | **Brand Colors** | Header text, accent color, input focus state, status indicators | Applied via design tokens; avoid reducing clarity in critical validation states. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | -------------------------------------------------------------------------------------------------- | | **Canva input detection** | Stroke detection logic ensures a valid signature is captured before submission is allowed. | | **CTA state behavior** | "Done" button remains disabled until a signature stroke is detected, preventing empty submissions. | | **Processing flow behavior** | Prevents duplicate submissions and manages loading states during signature capture. | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | :------------------------------------------ | :-------------------------------- | :------------ | | Title text (Draw your signature) | `text-body-primary` | `#262831` | | Instruction text (Use your finger or mouse) | `text-body-secondary` | `#60667C` | | Canvas border | `input-border-default` | `#82879A` | | Canvas surface | `input-surface-default` | `#FCFCFD` | | Placeholder text (Sign here) | `input-text-field-placeholder` | `#82879A` | | Clear canvas text (disabled) | `button-tertiary-text-disabled` | `#60667C` | | Background surface | `surface-neutral-0` | `#FFFFFF` | | Button background (disabled) | `button-primary-surface-disabled` | `#EBECEF` | | Button text (disabled) | `button-primary-text-disabled` | `#60667C` | ### Design Notes * Keep field labels and helper text concise to reduce cognitive load. * Use brand colors sparingly for focus states and primary CTAs to maintain clarity. * Preserve sufficient color contrast across all states (idle, focus, error, disabled).
          ## Signature Filled This state appears after the user has drawn their signature on the canvas. It provides visual feedback for the captured input and confirms the signature is ready to submit. The canvas displays the drawn signature, replacing the placeholder text. The "Clear canvas" link is now active and visually highlighted, allowing the user to erase and redraw. The "Done" button is fully enabled, allowing the user to submit the signature for processing.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, instruction text, "Clear canvas" label, button text, badge text | Fully localizable. Tone and terminology can align with brand and regulatory requirements. | | **Color Styling** | Background, input surfaces, text color, focus state, CTA background and text color | Applied via design tokens. Must maintain accessibility contrast standards. | | **CTA Label** | Primary button text (e.g., “Done”) | Editable; action meaning must remain consistent with flow behavior. | | **Icons & Logo** | Brand logo and informational/status icons | Visual style may follow brand guidelines; placement remains consistent. | | **Localization** | All textual content | Supports full localization. Layout should accommodate text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------------------- | ----------------------------------------------------------------------------------- | | **Signature rendering** | The drawn signature is displayed as captured to ensure accuracy and legal validity. | | **CTA enabled behavior** | "Done" button is enabled only when a valid signature is present on the canvas. | | **Component spacing & safe areas** | Ensures cross-device consistency and accessibility. | | **Text hierarchy** | Maintains clear task communication and visual structure. | | **WCAG contrast requirements** | Mandatory for accessibility compliance. | ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | :------------------------------------------ | :------------------------------- | :------------ | | Title text (Draw your signature) | `text-body-primary` | `#262831` | | Instruction text (Use your finger or mouse) | `text-body-secondary` | `#60667C` | | Canvas border | `input-border-default` | `#82879A` | | Canvas surface | `input-surface-focused` | `#FCFCFD` | | Clear canvas text | `button-tertiary-text-default` | `#006AFF` | | Background surface | `surface-neutral-0` | `#FFFFFF` | | Button background (Done) | `button-primary-surface-default` | `#006AFF` | | Button text (Done) | `button-primary-text-default` | `#FFFFFF` | ## Design notes * Keep the layout clear and vertically structured to reduce cognitive load. * The active "Clear canvas" link provides visual feedback that the canvas contains a valid signature and can be reset. * The enabled "Done" button signals readiness to submit, using a distinct color shift from its disabled state to reinforce interactivity. ***
          ## Success Final confirmation screen of the Electronic Signature module. After the user taps "Done," the system processes the signature and displays a green checkmark icon along with a "Signed successfully!" message. This screen confirms that the signature has been captured and the process is complete.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, success message, footer text | Fully localizable. Wording can align with brand tone and regulatory language. | | **Color Styling** | Background, text color, success icon color, CTA color | Applied via design tokens. Must maintain accessibility contrast, even in disabled states. | | **Localization** | All text content | Supports full translation. Layout should account for text expansion. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------- | | **Processing flow logic** | Controlled by backend verification services; cannot be modified at UI level. | | **Form structure hierarchy** | Field order and grouping remain standardized for consistency. | | **WCAG contrast requirements** | Accessibility compliance is mandatory, including disabled and loading states. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | :-------------------------------- | :--------------------- | :------------ | | Success icon (check - fill) | `icon-status-positive` | `#17B26A` | | Success icon (check - mark) | `icon-neutral-0` | `#FFFFFF` | | Title text (Signed successfully!) | `text-body-primary` | `#262831` | | Background surface | `surface-neutral-0` | `#FFFFFF` |
          ## Design notes * Preserve layout stability when switching to loading state. * Maintain accessible contrast for spinner and disabled elements. ***
          --- - Path: `design-and-ux/customization-forms` - URL: https://developer.incode.com/design-and-ux/customization-forms/ - Markdown: https://developer.incode.com/design-and-ux/customization-forms.md # Customization This section outlines the elements you can customize within the **Forms and data entry** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms. ***
          ## Forms empty Entry point of the data entry module. This screen presents the user with a form titled "Enter your information," containing four customizable required fields: ID number, Email, Country of residence, and Date of Birth. All fields are empty and the "Continue" button is disabled until the user provides valid input..
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | **Text** | Title ("Enter your information"), button text | Fully localizable; tone and terminology can be adapted to match brand voice. | | **Input fields** | Field order, optional vs required fields, input types, validation messaging | Configurable depending on workflow requirements and supported data collection rules. | | **Background Color** | Screen background | Must maintain strong contrast with inputs, text, and CTAs for accessibility compliance. | | **Buttons (CTA)** | Button label (“Continue”), background color, text color | Uses brand tokens | | **Brand Colors** | Header text, accent color, input focus state, status indicators | Applied via design tokens; avoid reducing clarity in critical validation states. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------------- | | **Processing flow behavior** | Prevents duplicate submissions and manages loading states during signature capture. | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ------------------------------------ | --------------------------------- | ------------- | | Title text (Enter your information) | `text-body-primary` | `#262831` | | Field label text | `input-text-label-default` | `#262831` | | Field placeholder text | `input-text-field-placeholder` | `#82879A` | | Input field surface | `input-surface-default` | `#FCFCFD` | | Input field border | `input-border-default` | `#82879A` | | Dropdown label text | `dropdown-text-label-default` | `#262831` | | Dropdown placeholder text | `dropdown-text-input-placeholder` | `#82879A` | | Dropdown surface | `dropdown-surface-default` | `#FCFCFD` | | Dropdown border | `dropdown-border-default` | `#82879A` | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Primary button (disabled) background | `button-primary-surface-disabled` | `#EBECEF` | | Primary button (disabled) text | `button-primary-text-disabled` | `#60667C` | ### Design Notes * Keep field labels and helper text concise to reduce cognitive load. * Use brand colors sparingly for focus states and primary CTAs to maintain clarity. * Preserve sufficient color contrast across all states (idle, focus, error, disabled).
          ## Forms Filled This state confirms that the user has completed all required fields in the form. All four customizable fields — ID number, Email, Country of residence, and Date of Birth — contain valid input, and the "Continue" button is now enabled, allowing the user to proceed to the next step.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, button text, badge text | Fully localizable. Tone and terminology can align with brand and regulatory requirements. | | **Color Styling** | Background, input surfaces, text color, focus state, CTA background and text color | Applied via design tokens. Must maintain accessibility contrast standards. | | **CTA Label** | Primary button text (e.g., “Continue”) | Editable; action meaning must remain consistent with flow behavior. | | **Localization** | All textual content | Supports full localization. Layout should accommodate text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------------------- | ------------------------------------------------------------------------------- | | **CTA enabled behavior** | "Continue" button is enabled only when all required fields contain valid input. | | **Component spacing & safe areas** | Ensures cross-device consistency and accessibility. | | **Text hierarchy** | Maintains clear task communication and visual structure. | | **WCAG contrast requirements** | Mandatory for accessibility compliance. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ----------------------------------- | -------------------------------- | ------------- | | Title text (Enter your information) | `text-body-primary` | `#262831` | | Field label text | `input-text-label-default` | `#262831` | | Field input text | `input-text-field-default` | `#262831` | | Input field surface | `input-surface-default` | `#FCFCFD` | | Input field border | `input-border-default` | `#82879A` | | Dropdown label text | `dropdown-text-label-default` | `#262831` | | Dropdown input text | `dropdown-text-input-default` | `#262831` | | Dropdown surface | `dropdown-surface-default` | `#FCFCFD` | | Dropdown border | `dropdown-border-default` | `#82879A` | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Primary button (enabled) background | `button-primary-surface-default` | `#006AFF` | | Primary button (enabled) text | `button-primary-text-default` | `#FFFFFF` | ## Design notes * Keep the layout clear and vertically structured to reduce cognitive load. * The enabled "Continue" button signals readiness to submit, using a distinct color shift from its disabled state to reinforce interactivity. ***
          ## Forms loading Transitional state shown after the user taps "Continue." The screen retains the form layout with all filled fields visible, while a loading spinner appears on the primary button, providing visual feedback that the system is processing the request.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Color Styling** | Background, text color, success icon color, CTA color | Applied via design tokens. Must maintain accessibility contrast, even in disabled states. | | **Localization** | All text content | Supports full translation. Layout should account for text expansion. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------- | | **Processing flow logic** | Controlled by backend verification services; cannot be modified at UI level. | | **Form structure hierarchy** | Field order and grouping remain standardized for consistency. | | **WCAG contrast requirements** | Accessibility compliance is mandatory, including disabled and loading states. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ----------------------------------- | -------------------------------- | ------------- | | Title text (Enter your information) | `text-body-primary` | `#262831` | | Field label text | `input-text-label-default` | `#262831` | | Field input text (disabled) | `input-text-field-disabled` | `#82879A` | | Input field surface (disabled) | `input-surface-disabled` | `#EBECEF` | | Input field border (disabled) | `input-border-disabled` | `#EBECEF` | | Dropdown label text | `dropdown-text-label-default` | `#262831` | | Dropdown input text (disabled) | `dropdown-text-input-disabled` | `#82879A` | | Dropdown surface (disabled) | `dropdown-surface-disabled` | `#FCFCFD` | | Dropdown border (disabled) | `dropdown-border-disabled` | `#EBECEF` | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Primary button (loading) background | `button-primary-surface-default` | `#006AFF` | | Primary button (loading) text | `button-primary-text-default` | `#FFFFFF` | | Primary button (loading) spinner | `surface-brand-400` | `#3388FF` | ## Design notes * Preserve layout stability when switching to loading state. * Maintain accessible contrast for spinner and disabled elements.
          ## Success Final confirmation screen of the data entry module. After processing completes, the screen displays a green checkmark icon along with the message "Success!" confirming that the information has been submitted and the process is complete. No further user action is required.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, success message | Fully localizable. Wording can align with brand tone and regulatory language. | | **Color Styling** | Background, text color, success icon color, CTA color | Applied via design tokens. Must maintain accessibility contrast, even in disabled states. | | **Localization** | All text content | Supports full translation. Layout should account for text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------- | | **Processing flow logic** | Controlled by backend verification services; cannot be modified at UI level. | | **Form structure hierarchy** | Field order and grouping remain standardized for consistency. | | **WCAG contrast requirements** | Accessibility compliance is mandatory, including disabled and loading states. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | :---------------------- | :--------------------- | :------------ | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Success icon background | `icon-status-positive` | `#1E7F11` | | Success icon (check) | `icon-neutral-0` | `#FFFFFF` | | Title text (“Success!”) | `text-body-primary` | `#262831` |
          --- - Path: `design-and-ux/customization-ocr` - URL: https://developer.incode.com/design-and-ux/customization-ocr/ - Markdown: https://developer.incode.com/design-and-ux/customization-ocr.md # Customization This section outlines the elements you can customize within the **OCR Review** module to match your brand while preserving Incode's core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors, and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms. *** ## OCR Review This screen allows users to review and edit the information extracted from the identity document before continuing the verification process. In the editable state, users can update inaccurate or incomplete fields such as full name, date of birth, gender, document number, and expiration date to ensure the captured data is correct.
          ### Customizable Elements | Area | What can be customized | Notes | | -------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | | **Text** | Screen title, field labels, placeholders, validation messages, button text | Fully localizable; tone and terminology can be adapted to align with brand voice and compliance requirements. | | **Editable fields** | Fields such as full name, date of birth, gender, document number, and expiration date | Field availability and edit permissions can vary depending on onboarding and compliance requirements. | | **Input States** | Helper text, inline validation messaging, focus states | Validation logic remains fixed to preserve consistency and usability standards. | | **Radio buttons** | Selected and unselected surface colors, icon and text colors | Applied through design tokens; selected state must remain clearly distinguishable. | | **Background Color** | Screen background color | Must maintain sufficient contrast with text, inputs, and CTAs to support accessibility compliance. | | **Buttons (CTA)** | Button labels, background color, text color | Applied through design tokens to maintain a consistent user experience. | | **Brand Colors** | Accent colors, input focus state, radio button selected state | Applied via design tokens; avoid reducing clarity in validation or selection states. | | **Footer** | "Verified by Incode" line | Optional but recommended. |
          ### Fixed Elements | Element | Why it is fixed | | ------------------------------ | ---------------------------------------------------------------------------------------------- | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **User photo** | Automatically pulled from the document capture; cannot be replaced. | | **Field structure** | Required fields are defined by onboarding configuration and cannot be removed from the layout. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference | UI Element | Token | Value | | -------------------------------------- | --------------------------------------------------------------------------- | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Input label text** | Input/Text/Label/Default → Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Input background** | Input/Surface/Default → Surface/Neutral/50 → Color/Gray/50 | #FCFCFD | | **Input field text** | Input/Text/Field/Default → Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Date picker icon** | Icon/Neutral/500 → Color/Gray/500 | #60667C | | **Radio button selected surface** | Radio button/Surface/Selected → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Radio button unselected surface** | Radio button/Surface/Default → Surface/Neutral/50 → Color/Gray/50 | #FCFCFD | | **Radio button icon (default)** | Radio button/Icon/Default → Surface/Neutral/0 Static → Color/Gray/0 | #FFFFFF | | **Radio button label text** | Radio button/Text/Default → Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Radio button label text (selected)** | Radio button/Text/Default → Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Continue button background** | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Continue button text** | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Footer text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | Design Notes - Required fields are marked with an asterisk (\*) and must remain clearly distinguishable from optional fields. - The radio button selected state must use a color with sufficient contrast against the unselected state to remain accessible. - Ensure tap targets for radio buttons and date pickers meet accessibility minimum sizes.
          ***

          ## OCR Review - Non Editable This screen shows the same OCR Review layout in a read-only or non-editable state, where fields are pre-populated but not editable by the user. This state is used when the data has already been confirmed or when edit permissions are restricted based on onboarding configuration.
          ### Customizable Elements | Area | What can be customized | Notes | | -------------------- | ------------------------------------------- | ------------------------------------------------------- | | **Text** | Screen title, field labels, button text | Fully localizable. | | **Background Color** | Screen background color | Must maintain sufficient contrast with text and fields. | | **Buttons (CTA)** | Button labels, background color, text color | Applied through design tokens. | | **Brand Colors** | Accent colors | Applied via design tokens. | | **Footer** | "Verified by Incode" line | Optional but recommended. |
          ### Fixed Elements | Element | Why it is fixed | | ------------------------------ | ------------------------------------------------------------------------------- | | **Disabled field appearance** | Must remain visually consistent to communicate non-editable state clearly. | | **Field values** | Pre-populated from OCR extraction; cannot be overridden when in read-only mode. | | **User photo** | Automatically pulled from the document capture; cannot be replaced. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference | UI Element | Token | Value | | -------------------------------------- | ------------------------------------------------------------------------------ | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Input label text** | Input/Text/Label/Default → Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Input background (disabled)** | Input/Surface/Disabled → Surface/Neutral/100 → Color/Gray/100 | #EBECEF | | **Input field text (disabled)** | Input/Text/Field/Disabled → Text/Body/400 → Color/Gray/400 | #82879A | | **Date picker icon** | Icon/Neutral/500 → Color/Gray/500 | #60667C | | **Radio button disabled surface** | Radio button/Surface/Disabled → Surface/Neutral/400 → Color/Gray/400 | #82879A | | **Radio button unselected surface** | Radio button/Surface/Default → Surface/Neutral/50 → Color/Gray/50 | #FCFCFD | | **Radio button icon (default)** | Radio button/Icon/Default → Surface/Neutral/0 Static → Color/Gray/0 | #FFFFFF | | **Radio button label text (disabled)** | Radio button/Text/Disabled → Text/Body/500 Static (Secondary) → Color/Gray/500 | #60667C | | **Radio button label text** | Radio button/Text/Default → Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Continue button background** | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Continue button text** | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Footer text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C |
          Design Notes - The disabled state must be visually distinct from the active/editable state to prevent user confusion. - Disabled fields should not use the same background as active fields — the lighter gray surface communicates non-interactivity clearly. - The Continue button remains active in the read-only state, allowing the user to proceed without making edits.
          --- - Path: `design-and-ux/customization-qsign` - URL: https://developer.incode.com/design-and-ux/customization-qsign/ - Markdown: https://developer.incode.com/design-and-ux/customization-qsign.md # Customization This section outlines the elements you can customize within the **Qualified Signature** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms. ## Signature empty Entry point of the Qualified Signature module. This screen presents the user with a consent form titled "Accept and sign," accompanied by a brief instruction to accept the terms before completing the signature.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------- | --------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | **Text** | Title ("Accept and sign"), instruction text, button text | Fully localizable; tone and terminology can be adapted to match brand voice. | | **Background Color** | Screen background | Must maintain strong contrast with inputs, text, and CTAs for accessibility compliance. | | **Buttons (CTA)** | Button label (“Finish signing”), background color, text color | Uses brand tokens | | **Brand Colors** | Header text, accent color, input focus state, status indicators | Applied via design tokens; avoid reducing clarity in critical validation states. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | -------------------------------------------------------------------------------------------------- | | **CTA state behavior** | "Done" button remains disabled until a signature stroke is detected, preventing empty submissions. | | **Processing flow behavior** | Prevents duplicate submissions and manages loading states during signature capture. | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ------------------------------------ | --------------------------------- | ------------- | | Title text (Accept and sign) | `text-body-primary` | `#26283B` | | Instruction text | `text-body-secondary` | `#60657C` | | Document row surface | `surface-neutral-50` | `#F5F6F7` | | Document row border | `border-neutral-100` | `#E6E8EF` | | Document name text | `text-body-primary` | `#26283B` | | “View” link | `button-tertiary-text-default` | `#0046FF` | | Checkbox border | `checkbox-border-default` | `#82879A` | | Checkbox background | `checkbox-surface-default` | `#FFFFFF` | | Checkbox label text | `text-body-primary` | `#26283B` | | Info box surface | `surface-brand-50` | `#E5F0FF` | | Info box text | `text-body-primary` | `#26283B` | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Primary button (disabled) background | `button-primary-surface-disabled` | `#E9ECEF` | | Primary button (disabled) text | `button-primary-text-disabled` | `#60657C` | ### Design Notes * Keep field labels and helper text concise to reduce cognitive load. * Use brand colors sparingly for focus states and primary CTAs to maintain clarity. * Preserve sufficient color contrast across all states (idle, focus, error, disabled).
          ## Signature Filled This screen reflects the state after the user has checked all three consent checkboxes. Each checkbox is now marked and highlighted in blue, confirming the user's agreement to the terms.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, instruction text, button text, badge text | Fully localizable. Tone and terminology can align with brand and regulatory requirements. | | **Color Styling** | Background, input surfaces, text color, focus state, CTA background and text color | Applied via design tokens. Must maintain accessibility contrast standards. | | **CTA Label** | Primary button text (e.g., “Finish signing”) | Editable; action meaning must remain consistent with flow behavior. | | **Localization** | All textual content | Supports full localization. Layout should accommodate text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------------------- | ------------------------------------------------------------------------------ | | **CTA enabled behavior** | "Done" button is enabled only when a valid signature is present on the canvas. | | **Component spacing & safe areas** | Ensures cross-device consistency and accessibility. | | **Text hierarchy** | Maintains clear task communication and visual structure. | | **WCAG contrast requirements** | Mandatory for accessibility compliance. | ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ------------------------------ | -------------------------------- | ------------- | | Title text (Accept and sign) | `text-body-primary` | `#262831` | | Instruction text | `text-body-secondary` | `#60667C` | | Document row surface | `surface-neutral-50` | `#FCFCFD` | | Document row border | `border-neutral-100` | `#EBECEF` | | Document name text | `text-body-primary` | `#262831` | | “View” link | `button-tertiary-text-default` | `#006AFF` | | Checkbox (default) background | `surface-neutral-0` | `#FFFFFF` | | Checkbox (default) border | `border-neutral-100` | `#EBECEF` | | Checkbox (selected) background | `surface-brand-500` | `#006AFF` | | Info container background | `surface-brand-50` | `#E5F0FF` | | Checkbox text | `text-body-primary` | `#262831` | | Primary button background | `button-primary-surface-default` | `#006AFF` | | Primary button text | `button-primary-text-default` | `#FFFFFF` | ## Design notes * Keep the layout clear and vertically structured to reduce cognitive load. * The enabled "Finish signing" button signals readiness to submit, using a distinct color shift from its disabled state to reinforce interactivity. ***
          ## Signature loading Transitional state shown after the user taps "Finish signing." The screen retains the consent form layout while a loading spinner appears on the "Finish signing" button, providing visual feedback that the system is processing the request.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, success message, footer text | Fully localizable. Wording can align with brand tone and regulatory language. | | **Color Styling** | Background, text color, success icon color, CTA color | Applied via design tokens. Must maintain accessibility contrast, even in disabled states. | | **Localization** | All text content | Supports full translation. Layout should account for text expansion. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------- | | **Processing flow logic** | Controlled by backend verification services; cannot be modified at UI level. | | **Form structure hierarchy** | Field order and grouping remain standardized for consistency. | | **WCAG contrast requirements** | Accessibility compliance is mandatory, including disabled and loading states. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ------------------------------------ | -------------------------------- | ------------- | | Title text (Accept and sign) | `text-body-primary` | `#262831` | | Instruction text | `text-body-secondary` | `#60667C` | | Document row surface | `surface-neutral-50` | `#FCFCFD` | | Document row border | `border-neutral-100` | `#EBECEF` | | Document name text | `text-body-primary` | `#262831` | | Checkbox (disabled) background | `checkbox-surface-disabled` | `#82879A` | | Checkbox (disabled container) | `surface-neutral-400` | `#82879A` | | Checkbox text (disabled) | `checkbox-text-disabled` | `#60667C` | | Checkbox text (alias) | `text-body-secondary` | `#60667C` | | Checkbox icon | `checkbox-icon-default` | `#FFFFFF` | | Card background (checkbox container) | `surface-neutral-0` | `#FFFFFF` | | Inner card surface | `surface-neutral-50` | `#FCFCFD` | | Primary button background | `button-primary-surface-default` | `#006AFF` | | Primary button text | `button-primary-text-default` | `#FFFFFF` | ## Design notes * Preserve layout stability when switching to loading state. * Maintain accessible contrast for spinner and disabled elements. ***
          ## Processing screen Intermediate screen displayed while the system processes the signature submission. The screen shows a spinning progress indicator alongside the text "Processing…", communicating to the user that their action is being handled and they should wait.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, success message, footer text | Fully localizable. Wording can align with brand tone and regulatory language. | | **Color Styling** | Background, text color, success icon color, CTA color | Applied via design tokens. Must maintain accessibility contrast, even in disabled states. | | **Localization** | All text content | Supports full translation. Layout should account for text expansion. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------- | | **Processing flow logic** | Controlled by backend verification services; cannot be modified at UI level. | | **Form structure hierarchy** | Field order and grouping remain standardized for consistency. | | **WCAG contrast requirements** | Accessibility compliance is mandatory, including disabled and loading states. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | :------------------------------ | :------------------------- | :------------ | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Spinner (active stroke) | `surface-brand-500-static` | `#006AFF` | | Spinner (track/background) | `surface-brand-50` | `#EAF0FF` | | Processing text (“Processing…”) | `text-body-primary` | `#262831` | ## Success Final confirmation screen of the Qualified Signature module. After processing completes, the screen displays a green checkmark icon along with the message "Signed successfully!" confirming that the signature has been captured and the process is complete. No further user action is required.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ----------------- | ----------------------------------------------------- | ----------------------------------------------------------------------------------------- | | **Text Elements** | Title, success message, footer text | Fully localizable. Wording can align with brand tone and regulatory language. | | **Color Styling** | Background, text color, success icon color, CTA color | Applied via design tokens. Must maintain accessibility contrast, even in disabled states. | | **Localization** | All text content | Supports full translation. Layout should account for text expansion. | ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------- | | **Processing flow logic** | Controlled by backend verification services; cannot be modified at UI level. | | **Form structure hierarchy** | Field order and grouping remain standardized for consistency. | | **WCAG contrast requirements** | Accessibility compliance is mandatory, including disabled and loading states. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | :---------------------------------- | :--------------------- | :------------ | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Success icon background | `icon-status-positive` | `#1E7F11` | | Success icon (check) | `icon-neutral-0` | `#FFFFFF` | | Title text (“Signed successfully!”) | `text-body-primary` | `#262831` |
          --- - Path: `design-and-ux/customization-watchlist` - URL: https://developer.incode.com/design-and-ux/customization-watchlist/ - Markdown: https://developer.incode.com/design-and-ux/customization-watchlist.md # Customization This section outlines the elements you can customize within the **Watchlist** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms. ## Watchlist Processing Entry point of the Watchlist module. This screen informs the user that their information is being processed and screened against sanctions lists, Politically Exposed Persons (PEPs), and compliance watchlists. A loading indicator communicates that the verification is currently in progress while temporarily preventing duplicate submissions or interruptions..
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | --------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- | | **Text Elements** | Processing title, status message, helper text | Fully localizable. Tone and terminology can align with brand and compliance requirements. | | **Color Styling** | Background color, text color, loading indicator color, status icon color | Applied via design tokens. Must preserve accessibility contrast across all states. | | **Branding** | Logo placement, typography styles, accent colors | Branding updates should maintain readability and consistency throughout the verification flow. | | **Localization** | All textual content and regional formatting | Supports localization and translation. Layout should account for text expansion across languages. | | **Loading Indicator** | Spinner style and animation behavior | Customizable within approved motion and accessibility guidelines. | | **Status Messaging** | Processing and success confirmation copy | Messaging should remain concise, clear, and compliant with regulatory communication standards. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------------- | | **Processing flow behavior** | Prevents duplicate submissions and manages loading states during signature capture. | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ----------------------- | ---------------------- | ------------- | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Processing spinner | `surface-brand-400` | `#3388FF` | | Processing title text | `text-body-primary` | `#262831` | | Processing helper text | `text-body-secondary` | `#60667C` | | Success icon background | `icon-status-positive` | `#1E7F11` | | Success icon (check) | `icon-neutral-0` | `#FFFFFF` | | Success title text | `text-body-primary` | `#262831` | ### Design Notes * Keep processing and success messaging concise to reduce cognitive load during verification. * Preserve sufficient color contrast across all states, including processing, success, disabled, and error states. * Maintain consistent spacing, typography, and iconography across all watchlist states to reinforce flow continuity.
          ## Watchlist Success The screen displays a success indicator and confirmation message, communicating that the user’s information has been successfully screened against sanctions lists, Politically Exposed Persons (PEPs), and compliance watchlists, allowing the user to proceed to the next step of the onboarding flow..
          ### Customizable Elements
          | **Area** | **What can be customized** | **Notes** | | --------------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | | **Text Elements** | Success title, confirmation message, helper text | Fully localizable. Messaging can align with brand tone and compliance communication standards. | | **Color Styling** | Background color, text color, success icon color, accent colors | Applied via design tokens. Must preserve accessibility contrast across all states. | | **Localization** | All textual content and regional formatting | Supports localization and translation. Layout should account for text expansion across languages. | | **Success Indicator** | Success icon style and animation behavior | Customizable within approved accessibility and motion guidelines. | | **Status Messaging** | Success confirmation copy | Messaging should remain concise, clear, and compliant with regulatory communication requirements. | ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------------------- | -------------------------------------------------------- | | **Component spacing & safe areas** | Ensures cross-device consistency and accessibility. | | **Text hierarchy** | Maintains clear task communication and visual structure. | | **WCAG contrast requirements** | Mandatory for accessibility compliance. | ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ----------------------- | ---------------------- | ------------- | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Success title text | `text-body-primary` | `#262831` | | Success icon background | `icon-status-positive` | `#1E7F11` | | Success icon (check) | `icon-neutral-0` | `#FFFFFF` | ## Design notes * Keep the layout clear, vertically structured, and easy to scan to reduce cognitive load. ***

          --- - Path: `design-and-ux/customization-watchlist-business` - URL: https://developer.incode.com/design-and-ux/customization-watchlist-business/ - Markdown: https://developer.incode.com/design-and-ux/customization-watchlist-business.md # Customization This section outlines the elements you can customize within the **Watchlist for business** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms. *** ## Watchlist Empty Entry point of the **Watchlist for Business** module. This screen allows users to enter the business name and select the country before starting the screening process against sanctions lists, Politically Exposed Persons (PEPs), and compliance watchlists.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | | **Text** | Screen title, field labels, placeholders, helper text, validation messages, button text, processing and success messages | Fully localizable; tone and terminology can be adapted to align with brand voice and compliance requirements. | | **Field Set** | Business name field, country selector, optional business identifiers | Configurable depending on onboarding and compliance requirements; core flow structure remains consistent. | | **Input States** | Helper text, inline validation messaging, disabled and focus states | Validation logic remains fixed to preserve consistency and usability standards. | | **Background Color** | Screen background color | Must maintain sufficient contrast with text, inputs, and CTAs to support accessibility compliance. | | **Buttons (CTA)** | Button labels, background color, text color, disabled state styling | Uses brand tokens while preserving visibility and accessibility across states. | | **Brand Colors** | Accent colors, input focus state, loading indicator, success state colors | Applied via design tokens; avoid reducing clarity in validation, processing, or success states. | | **Loading State** | Processing message, spinner style, loading animation behavior | Customizable within approved accessibility and motion guidelines. | | **Success State** | Confirmation message, success icon styling | Messaging should remain concise, clear, and compliant with regulatory communication standards. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------------- | | **Processing flow behavior** | Prevents duplicate submissions and manages loading states during signature capture. | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | -------------------------- | --------------------------------- | ------------- | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Header title text | `text-body-primary` | `#262831` | | Country label text | `dropdown-text-label-default` | `#262831` | | Country placeholder text | `dropdown-text-input-placeholder` | `#B2879A` | | Dropdown border | `dropdown-border-default` | `#B2879A` | | Dropdown background | `dropdown-surface-default` | `#FCFCDD` | | Business name label text | `input-text-label-default` | `#262831` | | Input border | `input-border-default` | `#B2879A` | | Input background | `input-surface-default` | `#FCFCDD` | | Continue button background | `button-primary-surface-disabled` | `#EBECEF` | | Continue button text | `button-primary-text-disabled` | `#60667C` | | Primary body text | `text-body-800-primary` | `#262831` | | Secondary body text | `text-body-400` | `#B2879A` |
          ## Watchlist Filled State displayed after the user has entered the required business information, including the business name and country, and before the watchlist screening process begins.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------- | | **Text** | Screen title, field labels, placeholders, helper text, validation messages, button text, processing and success messages | Fully localizable; tone and terminology can be adapted to align with brand voice and compliance requirements. | | **Field Set** | Business name field, country selector, optional business identifiers | Configurable depending on onboarding and compliance requirements; core flow structure remains consistent. | | **Input States** | Helper text, inline validation messaging, disabled and focus states | Validation logic remains fixed to preserve consistency and usability standards. | | **Background Color** | Screen background color | Must maintain sufficient contrast with text, inputs, and CTAs to support accessibility compliance. | | **Buttons (CTA)** | Button labels, background color, text color. | Uses brand tokens while preserving visibility and accessibility across states. | | **Brand Colors** | Accent colors, input focus state, loading indicator, success state colors | Applied via design tokens; avoid reducing clarity in validation, processing, or success states. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------------- | | **Processing flow behavior** | Prevents duplicate submissions and manages loading states during signature capture. | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | -------------------------- | -------------------------------- | ------------- | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Header title text | `text-body-primary` | `#262831` | | Country label text | `dropdown-text-label-default` | `#262831` | | Country filled text | `dropdown-text-input-default` | `#262831` | | Dropdown border | `dropdown-border-default` | `#B2879A` | | Dropdown background | `dropdown-surface-focused` | `#FCFCDD` | | Business name label text | `input-text-label-default` | `#262831` | | Business name input text | `input-text-input-default` | `#262831` | | Input border | `input-border-default` | `#B2879A` | | Input background | `input-surface-default` | `#FCFCDD` | | Continue button background | `button-primary-surface-default` | `#006AFF` | | Continue button text | `button-primary-text-default` | `#FFFFFF` | | Primary body text | `text-body-800-primary` | `#262831` | | Brand primary surface | `surface-brand-500-static` | `#006AFF` | ## Watchlist Processing Processing state of the **Watchlist for Business** module. This screen informs the user that the submitted business information is being processed and screened against sanctions lists, Politically Exposed Persons (PEPs), and compliance watchlists. A loading indicator communicates that the verification is currently in progress while temporarily preventing duplicate submissions or interruptions.
          ### Customizable Elements
          | **Area** | **What can be customized** | **Notes** | | --------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- | | **Text Elements** | Processing title, status message, helper text | Fully localizable. Tone and terminology can align with brand and compliance requirements. | | **Color Styling** | Background color, text color, loading indicator color, status icon color | Applied via design tokens. Must preserve accessibility contrast across all states. | | **Branding** | Logo placement, typography styles, accent colors | Branding updates should maintain readability and consistency throughout the verification flow. | | **Localization** | All textual content and regional formatting | Supports localization and translation. Layout should account for text expansion across languages. | | **Loading Indicator** | Spinner style and animation behavior | Customizable within approved motion and accessibility guidelines. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------------------------------------- | | **Processing flow behavior** | Prevents duplicate submissions and manages loading states during signature capture. | | **Text hierarchy** | Maintains clear task communication and visual clarity within the flow. | | **WCAG contrast requirements** | Mandatory for accessibility compliance and inclusive user experience. |
          ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ----------------------- | ---------------------- | ------------- | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Processing spinner | `surface-brand-400` | `#3388FF` | | Processing title text | `text-body-primary` | `#262831` | | Processing helper text | `text-body-secondary` | `#60667C` | | Success icon background | `icon-status-positive` | `#1E7F11` | | Success icon (check) | `icon-neutral-0` | `#FFFFFF` | | Success title text | `text-body-primary` | `#262831` | ### Design Notes * Keep processing and success messaging concise to reduce cognitive load during verification. * Preserve sufficient color contrast across all states, including processing, success, disabled, and error states. * Maintain consistent spacing, typography, and iconography across all watchlist states to reinforce flow continuity.
          ## Watchlist Success The screen displays a success indicator and confirmation message, communicating that the business information has been successfully screened against sanctions lists, Politically Exposed Persons (PEPs), and compliance watchlists, allowing the user to proceed to the next step of the onboarding flow..
          ### Customizable Elements
          | **Area** | **What can be customized** | **Notes** | | --------------------- | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | | **Text Elements** | Success title, confirmation message, helper text | Fully localizable. Messaging can align with brand tone and compliance communication standards. | | **Color Styling** | Background color, text color, success icon color, accent colors | Applied via design tokens. Must preserve accessibility contrast across all states. | | **Localization** | All textual content and regional formatting | Supports localization and translation. Layout should account for text expansion across languages. | | **Success Indicator** | Success icon style and animation behavior | Customizable within approved accessibility and motion guidelines. | | **Status Messaging** | Success confirmation copy | Messaging should remain concise, clear, and compliant with regulatory communication requirements. | ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------------------- | -------------------------------------------------------- | | **Component spacing & safe areas** | Ensures cross-device consistency and accessibility. | | **Text hierarchy** | Maintains clear task communication and visual structure. | | **WCAG contrast requirements** | Mandatory for accessibility compliance. | ### Token Reference
          | **UI Element** | **Token** | **Raw Value** | | ----------------------- | ---------------------- | ------------- | | Screen background | `surface-neutral-0` | `#FFFFFF` | | Success title text | `text-body-primary` | `#262831` | | Success icon background | `icon-status-positive` | `#1E7F11` | | Success icon (check) | `icon-neutral-0` | `#FFFFFF` | ## Design notes * Keep the layout clear, vertically structured, and easy to scan to reduce cognitive load. ***

          --- - Path: `design-and-ux/data-sharing-consent-customization` - URL: https://developer.incode.com/design-and-ux/data-sharing-consent-customization/ - Markdown: https://developer.incode.com/design-and-ux/data-sharing-consent-customization.md # Customization This section outlines the elements you can customize within the **Data Sharing Consent** module to align with your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as consent copy, illustrations, and brand colors, and which elements remain fixed to ensure transparency, compliance, accessibility, and a consistent user experience across platforms.
          ## Consent Screen The Consent Screen presents the data sharing request and helps users understand what information will be shared, why it is needed, and how it will be used. It promotes transparency, supports informed decision-making, and ensures users can provide consent with confidence before continuing the verification process.
          ### Customizable Elements | Area | What can be customized | Notes | | ---------------- | ---------------------------------------------------- | --------------------------------------------------------------------------- | | Text | Title, subtitle, consent description, checkbox label | Fully localizable; tone can be adapted to compliance and brand requirements | | Brand Colors | Logo, links, checkbox, button, accent elements | Uses brand tokens | | Buttons | Label, color, radius | Must follow platform guidelines and maintain primary/secondary hierarchy | | Consent Checkbox | Label text, selected state color | Checkbox is required; must remain clearly visible and accessible | | Card Surface | Background color, corner radius, elevation | Must maintain readability and WCAG contrast requirements | | Footer | "Verified by Incode" line | Optional but recommended |
          ### Fixed Elements | Element | Why it is fixed | | ---------------------------- | -------------------------------------------------------------------------- | | Consent flow structure | Ensures users review and acknowledge consent information before proceeding | | Consent checkbox requirement | Required to capture explicit user consent and meet compliance requirements | | Layout structure | Ensures consistency across modules and platforms | | Text hierarchy | Optimized for readability and comprehension of consent information | | Spacing & safe areas | Required for device compatibility and accessibility | | WCAG minimum contrast | Mandatory to ensure accessibility compliance |
          ### Token Reference | # | UI Element | Token | Value | | - | -------------------------- | ------------------------------------------------------------------------- | ------- | | 1 | Title | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | 2 | Consent summary text | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | 3 | Screen background | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | 5 | Checkbox surface | Checkbox/Surface/Default → Surface/Neutral/50 → Color/Gray/50 | #FCFCFD | | 6 | Consent card background | Surface/Brand/50 → Color/Brand/50 | #E5F0FF | | 7 | Checkbox label text | Checkbox/Text/Default → Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | 8 | Disabled button text | Button/Primary/Text/Disabled → Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | 9 | Disabled button background | Button/Primary/Surface/Disabled → Surface/Neutral/100 → Color/Gray/100 | #EBECEF | ### Design Notes - Keep consent messaging concise and easy to scan. - Consent copy, title, description, and checkbox label can be customized to meet branding and compliance requirements. - Ensure the consent checkbox remains clearly visible and accessible across all states. - Maintain sufficient color contrast and tap target sizes to meet accessibility guidelines. - Provide clear focus indicators and screen reader support for interactive elements (Web).
          *** ## Consented Screen The Consented Screen is displayed after the user has successfully granted consent to share their data. It confirms that consent has been recorded, reassures the user that their authorization was successfully received, and clearly indicates that the verification process can continue. This step provides confirmation, reinforces transparency, and helps users proceed with confidence.
          ### Customizable Elements | Area | What can be customized | Notes | | ---------------- | ---------------------------------------------------- | --------------------------------------------------------------------------- | | Text | Title, subtitle, consent description, checkbox label | Fully localizable; tone can be adapted to compliance and brand requirements | | Brand Colors | Logo, links, checkbox, button, accent elements | Uses brand tokens | | Buttons | Label, color, radius | Must follow platform guidelines and maintain primary/secondary hierarchy | | Consent Checkbox | Label text, selected state color | Checkbox is required; must remain clearly visible and accessible | | Card Surface | Background color, corner radius, elevation | Must maintain readability and WCAG contrast requirements | | Footer | "Verified by Incode" line | Optional but recommended |
          ### Fixed Elements | Element | Why it is fixed | | ---------------------------- | -------------------------------------------------------------------------- | | Consent flow structure | Ensures users review and acknowledge consent information before proceeding | | Consent checkbox requirement | Required to capture explicit user consent and meet compliance requirements | | Layout structure | Ensures consistency across modules and platforms | | Text hierarchy | Optimized for readability and comprehension of consent information | | Spacing & safe areas | Required for device compatibility and accessibility | | WCAG minimum contrast | Mandatory to ensure accessibility compliance |
          ### Token Reference | # | UI Element | Token | Value | | -- | ------------------------- | --------------------------------------------------------------------------- | ------- | | 1 | Title | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | 2 | Consent summary text | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | 3 | Screen background | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | 5 | Selected checkbox surface | Checkbox/Surface/Selected → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | 6 | Checkbox icon | Checkbox/Icon/Default → Surface/Neutral/0 Static → Color/Gray/0 | #FFFFFF | | 7 | Consent card background | Surface/Brand/50 → Color/Brand/50 | #E5F0FF | | 8 | Checkbox label text | Checkbox/Text/Default → Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | 9 | Primary button text | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | 10 | Primary button background | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | ### Design Notes - Keep consent messaging concise and easy to scan. - Consent copy, title, description, and checkbox label can be customized to meet branding and compliance requirements. - Ensure the consent checkbox remains clearly visible and accessible across all states. - Maintain sufficient color contrast and tap target sizes to meet accessibility guidelines. - Provide clear focus indicators and screen reader support for interactive elements (Web).
          --- - Path: `design-and-ux/data-sharing-consent-design` - URL: https://developer.incode.com/design-and-ux/data-sharing-consent-design/ - Markdown: https://developer.incode.com/design-and-ux/data-sharing-consent-design.md # Data Sharing Consent The Data Sharing Consent module allows organizations to request and record the user's consent before collecting, processing, or sharing personal information as part of the verification process. This module typically appears before identity verification begins or whenever explicit user authorization is required to comply with privacy, regulatory, or business requirements. It helps ensure users understand how their data will be used and provides a clear opportunity to accept consent. *** ## Where it fits in the flow Data Sharing Consent typically appears before identity verification begins or whenever explicit user authorization is required. Once the user reviews and accepts the consent terms, the flow continues to the next verification step, such as document capture, face capture, or another configured verification process. *** ## User Flow The Data Sharing Consent experience presents users with the information required to understand and authorize how their personal data will be collected, processed, shared, and protected throughout the verification process. Users must review the consent terms and actively acknowledge them by selecting the consent checkbox. The Continue button remains disabled until consent is provided, ensuring explicit authorization before proceeding. Once consent is granted, the system records the user's agreement and advances to the next configured verification step, such as document capture, face capture, or another verification process.

          *** ## Full Flow Map This diagram presents the full sequence of screens involved in **Face Capture**, from tutorial and permission handling, to auto/manual capture, uploading, and final feedback.
          *** ## Happy Path (Light & Dark) The ideal user journey when consent is provided successfully with no interruptions. The happy path represents the smoothest version of the experience, where the user reviews the consent information, understands how their data will be collected and used, provides explicit authorization by selecting the consent checkbox, and continues to the next verification step without encountering errors or additional prompts. Both light and dark mode previews are included so teams can validate visual consistency across themes.

          *** ## Best Practices Recommended guidelines for designing and implementing the Data Sharing Consent experience. ✅ Do - Clearly explain what data will be collected, processed, or shared. - Use concise, easy-to-understand language that avoids legal jargon whenever possible. - Make consent actions explicit and intentional. - Ensure users can review the full consent information before making a decision. - Clearly indicate when consent is required to continue the verification process. - Provide accessible links to privacy policies or additional information when applicable. - Ensure consent records are captured and stored accurately. ❌ Don’t - Don’t pre-select consent checkboxes or assume user agreement. - Don’t hide important information behind unclear links or expandable sections. - Don’t use confusing, ambiguous, or overly technical language. - Don’t make acceptance appear mandatory unless required by the verification flow. - Don’t rely solely on color to communicate consent status or validation. - Don’t allow users to continue before providing the required authorization. - Don’t omit information about how user data will be used, shared, or protected.
          --- - Path: `design-and-ux/data-sharing-screens-states` - URL: https://developer.incode.com/design-and-ux/data-sharing-screens-states/ - Markdown: https://developer.incode.com/design-and-ux/data-sharing-screens-states.md # Screens & States A complete view of all screens the user may encounter throughout the Data Sharing Consent experience. Each state includes a brief description and serves as the source of truth for layouts, visual specifications, interactions, and platform-specific variations. *** ## Consent Screen Presented to the user to review and acknowledge the data sharing consent terms before continuing with the verification process. Includes required disclosures about data collection, processing, and usage, a mandatory consent checkbox, and access to the privacy notice. The Continue button remains disabled until consent is provided.
          ## **Consented Screen** Shown after the user has reviewed the data sharing consent information and actively agreed to the terms. The consent checkbox is selected, enabling the **Continue** button and allowing the user to proceed to the next step of the verification flow. Includes consent confirmation, required disclosures, and access to the privacy notice.
          --- - Path: `design-and-ux/data-sharing-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/data-sharing-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/data-sharing-specs-guidelines.md # Specs & Guidelines The Data Sharing Consent module includes complete Figma specifications documenting spacing, layout behavior, typography tokens, consent content variations, and localization requirements. These specifications ensure a consistent experience across platforms while allowing organizations to customize consent messaging, branding elements, and data-sharing disclosures without impacting usability, accessibility, or layout integrity.
          *** ## Responsiveness & Viewport Adaptation The **Data Sharing Consent** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain readable and accessible whether users are completing the consent flow on a small phone, large phone, foldable device, tablet, or desktop browser. This ensures that consent information, disclosure text, checkboxes, and action buttons remain visible, accessible, and properly aligned across platforms.
          ### How the layout adapts across devices | Breakpoint | Behavior | | ------------------------------ | ------------------------------------------------------------------------------------------------ | | Small phones (e.g., iPhone SE) | Consent content scrolls vertically while maintaining readable spacing and accessible tap targets | | Standard phones (iPhone 12–16) | Full layout displayed with consistent hierarchy, spacing, and content organization | | Tall/narrow Android devices | Vertical spacing adapts to preserve readability and keep consent actions visible | | Foldables (e.g., Pixel Fold) | Additional whitespace improves readability while keeping consent content centered | | Tablets | Increased margins and content width while maintaining comfortable reading lengths | | Desktop web | Centered layout with controlled max-width and additional safe area spacing |
          ### What is responsive (and customizable) | Element | Responsive Behavior | Customizable | | ----------------------- | ------------------------------------------------------ | -------------------- | | Consent content | Reflows based on viewport width and available space | Yes | | Consent disclosure text | Supports multiline expansion and scrolling when needed | Yes | | Checkbox area | Expands vertically to accommodate localized content | Checkbox text only | | Buttons | Width adjusts to available container space | Color, label, radius | | Footer / watermark | Remains aligned within the bottom safe area | Optional | | Header / branding area | Adjusts spacing based on safe areas and viewport size | Limited |
          ### What remains fixed across breakpoints | Element | Reason | | ----------------------------- | ------------------------------------------------------ | | Consent flow structure | Ensures a predictable and compliant consent experience | | Checkbox interaction behavior | Required for explicit consent capture | | Minimum text size | Required for readability and accessibility compliance | | Minimum tap target sizes | Ensures accessibility across devices | | Content hierarchy | Preserves comprehension of consent information | | Required consent actions | Prevents bypassing mandatory consent requirements |
          ### Design Notes - Consent content should remain easy to scan and understand regardless of screen size. - Avoid introducing custom layouts that disrupt the reading flow or consent hierarchy. - Long localized text is supported, but content should remain concise whenever possible. - Maintain clear separation between disclosure content, consent actions, and primary CTAs.
          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions The Data Sharing Consent module includes predefined interaction patterns and transitions covering consent review, consent confirmation, and progression to the next verification step.

          *** ## Localization The **Data Sharing Consent** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** - All user-facing text is fully localizable. - UI adjusts to prevent truncation and maintain readability. - Spacing and vertical rhythm adapt to accommodate longer languages. - Buttons and CTAs automatically expand to fit translated labels. - Ensure localized strings preserve clarity and follow regulatory requirements when applicable. - Incode supports a variety of languages
          --- - Path: `design-and-ux/data-sharing-v1-vs-v2-comparison` - URL: https://developer.incode.com/design-and-ux/data-sharing-v1-vs-v2-comparison/ - Markdown: https://developer.incode.com/design-and-ux/data-sharing-v1-vs-v2-comparison.md # Data Sharing Consent V1 vs V2 Comparison
          In V1, Data Sharing Consent provides a basic consent experience focused on collecting user authorization before continuing. The screen presents essential legal links, a consent checkbox, and a primary action, with limited context about how personal and biometric information will be used. In V2, Data Sharing Consent introduces a more transparent and informative experience. Users are provided with detailed information about the data being collected, how it will be used, and why consent is required before proceeding. The updated design improves readability, strengthens trust, and provides a clearer path to informed consent through better content hierarchy, branding, and interaction states.


          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences).
          | Capabilities | V1 | V2 | Notes | | --------------------------- | -- | -- | ------------------------------------------------------------------------------------ | | Consent collection | ✅ | ✅ | Both versions allow users to provide explicit consent before continuing. | | Consent checkbox validation | ✅ | ✅ | Users must acknowledge consent requirements before proceeding. | | Legal links | ✅ | ✅ | Both versions provide access to Privacy Policy and Terms of Use. | | Customization options | ❌ | ✅ | V2 provides extensive customization for text, colors, buttons, and consent surfaces. | | Documentation completeness | ❌ | ✅ | V2 includes complete specifications, guidelines, and customization documentation. |
          ***
          ## Behavior Differences How the module behaves during runtime.
          | Behavior | V1 | V2 | Notes | | ------------------------ | -------------------------- | --------------------------------- | ---------------------------------------------------------------------- | | Consent presentation | Minimal legal agreement | Detailed consent disclosure | V2 provides additional context before consent is granted. | | Information hierarchy | Basic | Structured content hierarchy | V2 improves readability and comprehension. | | Consent state visibility | Limited visual distinction | Clear enabled and disabled states | V2 makes completion requirements easier to understand. | | Branding integration | Limited | Fully tokenized | V2 follows the standardized design system. | | Content transparency | Basic | Expanded disclosure content | V2 provides greater visibility into data collection and usage. | | State transitions | Default transitions | Designed transitions | V2 includes documented transition behavior and interaction guidelines. |
          ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: - Less engineering work to override UI elements - Consistent branding across modules - Predictable behavior when changing settings - Reduced risk of breaking flows - Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.

          --- - Path: `design-and-ux/design-and-experience` - URL: https://developer.incode.com/design-and-ux/design-and-experience/ - Markdown: https://developer.incode.com/design-and-ux/design-and-experience.md

          Design

          Design and UX.

          This section is for frontend engineers, designers, and product teams integrating [Incode modules](/features-and-modules/modules-overview-and-availability/) into an onboarding or verification flow. It covers what users see, how modules behave, and what you can customize to match your brand.

          Accessibility

          Accessibility is built into every module.

          Each module’s Specs & Guidelines page covers accessibility notes specific to that module, including contrast, screen reader behavior, keyboard navigation, and motion guidelines. For the cross-cutting principles that apply across all modules, see the Accessibility Overview.

          How to use this section
          When you’re integrating a module: Find it in one of the category grids or in the sidebar. Understand what the user will see at every step of the flow. Understand your branding options for colors, typography, copy, logos. Design constraints and accessibility notes for the module. If the module has both experiences, decide which to integrate. If you need help locating a module or want to confirm something about a flow, contact your Incode representative. --- - Path: `design-and-ux/document-capture-customization` - URL: https://developer.incode.com/design-and-ux/document-capture-customization/ - Markdown: https://developer.incode.com/design-and-ux/document-capture-customization.md # Customization This section outlines the elements you can customize within the **Document Capture** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms.
          ## Document Capture Tutorial The Document Capture Tutorial Screen introduces users to the document verification process before capture begins. It explains the available upload methods and prepares users for the next steps in the flow.
          ### Customizable Elements
          | **Area** | **What can be customized** | **Notes** | | -------------------- | --------------------------------- | ---------------------------------------- | | **Title text** | “Verify your document” | Fully localizable. | | **Subtitle text** | Supporting instructional copy | Can reference supported upload formats. | | **Illustration** | Document placeholder illustration | Can be adapted to match brand style. | | **Primary button** | Label, color, radius | Used for the main capture/upload action. | | **Secondary action** | “Skip this step” | Optional depending on flow requirements. | | **Footer** | “verified by incode” | Optional but recommended. | | **Brand colors** | Accent and CTA colors | Uses brand tokens. |
          ### Fixed Elements
          | **Element** | **Why it is fixed** | | --------------------------------------- | ----------------------------------------------------- | | **Tutorial structure** | Standardized onboarding step before document capture. | | **Illustration placement** | Maintains visual consistency across modules. | | **Action hierarchy** | Primary action remains visually prioritized. | | **Spacing & safe areas** | Required for responsive compatibility. | | **Accessibility contrast requirements** | Mandatory for compliance. |
          ### Token Reference
          | **UI Element** | **Token** | **Value** | | ---------------------------------- | --------------------------------------------------------------------------- | --------- | | Title text | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | Subtitle text | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | Screen background | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | Primary button text | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | Primary button background | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | Secondary action text | Button/Tertiary/Text/default → Text/Brand/Accent → Color/Brand/500 | #006AFF | | Footer text (“verified by incode”) | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | Footer brand icon | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | Footer icon | Icon/Neutral/0 Static → Color/Gray/0 | #FFFFFF |
          ### Design Notes * Keep instructional messaging concise and action-oriented. * Ensure upload methods are easy to understand before starting capture. * The illustration should support comprehension without distracting from the CTA. * Preserve strong visual emphasis on the primary action. * Secondary actions should remain accessible but visually less prominent.
          *** ## Document Verification Method The document verification method selection allows users to choose how they want to provide their document for verification, including taking a photo, selecting an image from the camera roll, or uploading a file..
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------- | --------------------------- | ---------------------------------------------------- | | **Sheet background** | Bottom sheet styling | Must preserve readability and elevation. | | **Option labels** | Upload method labels | Fully localizable. | | **Icons** | Upload method icons | Can be customized while preserving semantic meaning. | | **Brand colors** | Accent colors if applicable | Must remain accessible. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------- | -------------------------------------------------------- | | **Bottom sheet behavior** | Native interaction pattern consistency. | | **Action layout** | Standardized spacing and touch target sizing. | | **Safe area spacing** | Required for device compatibility. | | **Overlay interaction** | Prevents accidental interaction with background content. | | **Accessibility touch targets** | Required for usability compliance. |
          ### Token Reference
          | **UI Element** | **Token** | **Value** | | ----------------------- | ----------------------------------------------------- | --------- | | Overlay background | Surface/Neutral/1000 80% Static → Color/Gray/1000 80% | #000000 | | Bottom sheet background | Sheet/Item/Default → Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | Drag handle | Surface/Neutral/200 → Color/Gray/200 | #C6C8D2 | | Option text | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | Option icons | Icon/Neutral/800 → Color/Gray/800 | #262831 |
          ### Design Notes * Keep option labels short and scannable. * Maintain familiar mobile bottom sheet interaction patterns. * Ensure icons clearly represent each upload method. * Preserve sufficient contrast between overlay and sheet. * Touch targets should remain large enough for accessibility.
          *** ## Capture Screen The Capture Screen enables users to capture a clear image of their document using the device camera.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------------- | -------------------------- | ---------------------------------------------- | | **Title text** | “Show your full document” | Fully localizable. | | **Subtitle text** | Capture guidance copy | Should remain short and instructional. | | **Capture frame styling** | Border radius and color | Must preserve visibility and guidance clarity. | | **Capture button styling** | Shape, border, color | Must remain recognizable as capture action. | | **Help icon** | Help/support trigger icon | Optional depending on flow requirements. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | --------------------------------------- | -------------------------------------- | | **Camera preview behavior** | Controlled by native device. | | **Capture interaction** | Standardized camera experience. | | **Frame positioning** | Ensures optimal document detection. | | **Safe area handling** | Required for responsive compatibility. | | **Accessibility contrast requirements** | Mandatory for compliance. |
          ### Token Reference
          | **UI Element** | **Token** | **Value** | | ------------------------------------- | ----------------------------------------- | --------- | | Title text | Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | Subtitle text | Text/Body/300 (Tertiary) → Color/Gray/300 | #A3A8B8 | | Footer text (“All data is encrypted”) | Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | Footer lock icon | Icon/Neutral/0 Static → Color/Gray/0 | #FFFFFF | | Capture button inner fill | Icon/Neutral/50 Static → Color/Gray/50 | #FCFCFD | | Capture button outer ring | Icon/Neutral/0 Static → Color/Gray/0 | #FFFFFF | | Help icon background | Icon/Neutral/0 Static → Color/Gray/0 | #FFFFFF | | Help icon symbol | Icon/Neutral/800 Static → Color/Gray/800 | #262831 |
          ### Design Notes * Keep instructions visible but lightweight over the camera feed. * Ensure the capture frame clearly communicates required positioning. * Footer reassurance messaging should not obstruct capture interactions. * Maintain high contrast for all overlay UI elements. * Camera controls should remain large and easy to tap.
          *** ## Common Issues The Common Issues Screen provides guidance when users tap the help icon during document capture. It explains common document capture problems and helps users understand how to achieve a successful capture.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ---------------------- | -------------------------------- | --------------------------------------- | | **Title text** | “Common issues” | Fully localizable. | | **Issue titles** | Problem descriptions | Should remain concise and easy to scan. | | **Issue descriptions** | Supporting guidance copy | Can be adapted to client tone of voice. | | **Issue icons** | Visual indicators for each issue | Must preserve semantic meaning. | | **Primary button** | Retry action styling | Used for recapture flow. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ---------------------------------------------- | | **Issue list structure** | Optimized for readability and troubleshooting. | | **Retry flow behavior** | Required for verification continuity. | | **Button hierarchy** | Maintains consistency across modules. | | **Spacing & alignment** | Required for responsive behavior. | | **Accessibility requirements** | Mandatory for compliance. |
          ### Token Reference
          | **UI Element** | **Token** | **Value** | | ------------------------- | --------------------------------------------------------------------------- | --------- | | Title text | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | Issue icons | Icon/Neutral/800 → Color/Gray/800 | #262831 | | Issue title text | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | Issue description text | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | Screen background | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | Primary button text | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | Primary button background | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF |
          ### Design Notes * Keep troubleshooting content actionable and easy to skim. * Avoid technical or overly complex explanations. * Icons should support fast visual recognition of problems. * Ensure enough spacing between issue rows for readability. * Maintain clear emphasis on the retry action.
          *** ## Capture Review Screen The Capture Review Screen allows users to review the captured document image before submitting it for verification. Users can confirm that the document is fully visible and readable or retake the photo if needed. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ------------------------------ | ----------------------------- | --------------------------------------------- | | **Title text** | “Review your document” | Fully localizable. | | **Subtitle text** | Supporting instructional copy | Should remain concise and easy to understand. | | **Primary button** | Label, color, radius | Used to continue the verification flow. | | **Secondary button** | Label, color, radius | Used to retake the document image. | | **Document container styling** | Border radius, shadows | Must preserve document visibility. | | **Footer** | “All data is encrypted” | Optional but recommended. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | --------------------------------------- | ------------------------------------------------------- | | **Document preview behavior** | Ensures users can properly validate the captured image. | | **Action hierarchy** | Continue action remains visually prioritized. | | **Button placement** | Standardized across modules for consistency. | | **Spacing & safe areas** | Required for responsive compatibility. | | **Accessibility contrast requirements** | Mandatory for compliance. |
          ### Token Reference | **UI Element** | **Token** | **Value** | | ------------------------------------- | --------------------------------------------------------------------------- | --------- | | Title text | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | Subtitle text | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | Background | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | Primary button background | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | Primary button text | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | Secondary button text | Button/Secondary/Text/Default → Text/Brand/Accent → Color/Brand/500 | #006AFF | | Secondary button border | Border/Brand/500 → Color/Brand/500 | #006AFF | | Footer text (“All data is encrypted”) | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | Footer lock icon | Icon/Neutral/500 → Color/Gray/500 | #60667C |
          ### Design Notes * Ensure the document preview remains large and readable. * Keep instructions concise and action-oriented. * Maintain clear visual distinction between primary and secondary actions. * Avoid obstructing the document image with overlays or excessive UI. * Footer reassurance messaging should remain subtle and non-disruptive. *** ## Image Upload Screens These screens guide users through the upload flow after capturing a document image. These states provide clear feedback while the document is being processed and confirm when the upload is successful. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ---------------------- | ------------------------------------- | ------------------------------------- | | **Title text** | “Uploading your document” | Fully localizable. | | **Subtitle text** | Processing guidance copy | Should remain short and reassuring. | | **Loading indicator** | Spinner or progress animation styling | Must remain clearly visible. | | **Background styling** | Background colors and surfaces | Must preserve accessibility contrast. | | **Brand colors** | Accent and loader colors | Uses brand tokens. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ---------------------------------------------------- | | **Processing behavior** | Reflects real-time upload and verification progress. | | **Loading state interaction** | Prevents accidental interruption during upload. | | **Content hierarchy** | Keeps focus on upload progress feedback. | | **Spacing & safe areas** | Required for responsive compatibility. | | **Accessibility requirements** | Mandatory for compliance. |
          ### Token Reference | **UI Element** | **Token** | **Value** | | ------------------------- | --------------------------------------------------------------------------- | --------- | | Title text | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | Subtitle text | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | Success icon | Icon/Status/Positive → Color/Green/500 | #17B26A | | Background | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | Primary button background | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | Primary button text | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF |
          | **UI Element** | **Token** | **Value** | | ------------------------------------- | ------------------------------------------ | --------- | | Title text | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | Subtitle text | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | Background | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | Loading indicator | Surface/Brand/500 → Color/Brand/500 | #006AFF | | Footer text (“All data is encrypted”) | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | Footer lock icon | Icon/Neutral/500 → Color/Gray/500 | #60667C |
          ### Design Notes * Success messaging should feel clear and reassuring. * Avoid overly celebratory language or animations. * Ensure the next action is immediately visible. * Keep the layout lightweight and easy to scan. * Maintain accessible contrast and readable typography.
          *** ## Upload Review Screen The Upload Review Screen allows users to confirm that they selected the correct document before uploading it for verification. The screen displays the document file name alongside a small preview of the selected file. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ------------------------------ | ------------------------------ | ----------------------------------------- | | **Title text** | “Review your upload” | Fully localizable. | | **Subtitle text** | Supporting review instructions | Should remain concise and instructional. | | **Document preview container** | Border radius, background | Must preserve readability and visibility. | | **Document filename styling** | Typography and color | Must remain legible. | | **Primary button** | Label, color, radius | Used to confirm and upload the document. | | **Secondary button** | Label, color, radius | Used to replace or select another file. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | -------------------------------- | ---------------------------------------------------------- | | **Preview behavior** | Ensures users can validate selected content before upload. | | **Document filename visibility** | Required for upload confirmation clarity. | | **Action hierarchy** | Upload action remains visually prioritized. | | **Spacing & safe areas** | Required for responsive compatibility. | | **Accessibility requirements** | Mandatory for compliance. |
          ### Token Reference
          | **UI Element** | **Token** | **Value** | | ------------------------------------- | --------------------------------------------------------------------------- | --------- | | Title text | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | Subtitle text | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | Document filename | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | Preview container background | Surface/Neutral/50 → Color/Gray/50 | #F7F8FA | | Preview container border | Border/Neutral/200 → Color/Gray/200 | #C6C8D2 | | Background | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | Primary button background | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | Primary button text | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | Secondary button text | Button/Secondary/Text/Default → Text/Brand/Accent → Color/Brand/500 | #006AFF | | Footer text (“All data is encrypted”) | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C |
          ### Design Notes * Ensure the document filename is easy to read and truncate gracefully if needed. * Keep the document preview visible but secondary to the confirmation action. * Maintain strong visual emphasis on the upload action. * Avoid cluttering the screen with unnecessary metadata. * Ensure secondary actions remain accessible but visually less prominent.
          *** ## Consecutive Pages Tutorial The Consecutive Pages Tutorial informs users that additional pages are required for verification. This step can be optional or mandatory depending on the document type and workflow configuration. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------- | --------------------------- | ---------------------------------------------- | | **Title text** | Tutorial title | Fully localizable. | | **Subtitle text** | Instructional guidance | Can explain why additional pages are required. | | **Illustrations** | Multi-page guidance visuals | Can be adapted to match brand style. | | **Primary button** | Label, color, radius | Used to continue the capture flow. | | **Secondary action** | Optional skip action | Available only in optional flows. | | **Brand colors** | Accent and CTA colors | Uses brand tokens. | | **Footer** | “verified by incode” | Optional but recommended. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ----------------------------------------------------- | | **Tutorial structure** | Standardized onboarding for multi-page capture flows. | | **Illustration placement** | Preserves visual consistency. | | **Action hierarchy** | Primary action remains visually prioritized. | | **Spacing & safe areas** | Required for responsive compatibility. | | **Accessibility requirements** | Mandatory for compliance. |
          ### Token Reference
          | **UI Element** | **Token** | **Value** | | ---------------------------------- | --------------------------------------------------------------------------- | --------- | | Title text | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | Subtitle text | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | Illustration accents | Surface/Brand/500 → Color/Brand/500 | #006AFF | | Background | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | Primary button background | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | Primary button text | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | Secondary action text | Button/Tertiary/Text/default → Text/Brand/Accent → Color/Brand/500 | #006AFF | | Footer text (“verified by incode”) | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C |
          ### Design Notes * Clearly communicate whether additional pages are required or optional. * Keep instructional copy concise and easy to scan. * Illustrations should reinforce sequential page capture behavior. * Maintain strong emphasis on the primary CTA. * Avoid excessive explanations or technical terminology.
          *** ## Error Screen The Error Screen appears when the uploaded document cannot be processed successfully. By default, users have 3 attempts available to retry the document upload. ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ------------------------ | ------------------------------ | -------------------------------------------------------- | | **Title text** | Error title | Fully localizable; should remain neutral and actionable. | | **Description text** | Supporting explanation | Can be adapted to client tone of voice. | | **Status icon** | Error indicator | Can be customized while preserving semantic meaning. | | **Primary button** | Label, color, radius | Used for retry action. | | **Attempt counter text** | “2 attempts remaining” | Fully localizable. | | **Background styling** | Background colors and surfaces | Must preserve accessibility contrast. | | **Footer** | “verified by incode” | Optional but recommended. |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ------------------------------ | ---------------------------------------------------- | | **Error logic** | Must accurately reflect backend validation failures. | | **Attempt counter behavior** | Controlled by backend retry configuration. | | **Action hierarchy** | Retry action remains visually prioritized. | | **Button placement** | Standardized across modules. | | **Spacing & safe areas** | Required for responsive compatibility. | | **Accessibility requirements** | Mandatory for compliance. |
          ### Token Reference | **UI Element** | **Token** | **Value** | | ---------------------------------- | --------------------------------------------------------------------------- | --------- | | Title text | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | Description text | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | Error icon | Icon/Status/Negative → Color/Red/500 | #E71111 | | Attempt counter text | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | Background | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | Primary button background | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | Primary button text | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | Close icon | Icon/Neutral/500 → Color/Gray/500 | #60667C | | Footer text (“verified by incode”) | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C |
          ### Design Notes * Error messaging should remain clear, concise, and actionable. * Avoid technical or overly alarming language. * Clearly communicate the remaining retry attempts. * Maintain strong emphasis on the retry action. * Ensure error states remain visually distinct and accessible.
          --- - Path: `design-and-ux/document-capture-design` - URL: https://developer.incode.com/design-and-ux/document-capture-design/ - Markdown: https://developer.incode.com/design-and-ux/document-capture-design.md # Document Capture Document Capture allows users to upload or capture supporting documents during the verification flow, such as proof of address, bank statements, utility bills, or other required documentation. The module guides users to provide a clear and complete image of the document, ensuring all relevant information is visible and readable before submission. Document Capture typically occurs after ID and Selfie Capture, and before the final verification result.
          *** ## Where it fits in the flow **Document Capture** usually appears after the ID Capture and Selfie Capture flows have been completed. Once identity verification steps are completed, the flow continues to Document Capture, where users are asked to upload or capture supporting documentation such as proof of address, bank statements, utility bills, or other required documents before proceeding to any remaining verification logic. *** ## User Flow The **Document Capture** module guides users through uploading or capturing supporting documentation. Depending on the integration, users may upload an existing file or capture the document directly using their device camera. During this step, the system helps users ensure the document is fully visible, readable, and correctly framed before submission. Once the document is provided, users either continue the verification flow seamlessly or receive specific feedback to help them correct any issues and successfully resubmit their document.

          *** ## Full Flow Map This diagram presents the full sequence of screens involved in Document Capture, from document upload or camera capture, to document validation, processing, feedback, and final submission.
          *** ## Happy Path (Light & Dark) The ideal user journey when the document is captured successfully with no interruptions. The happy path represents the smoothest version of the experience, where the user selects the upload method, captures the file, follows the guidance provided, and submits a clear, readable, and fully visible document without requiring retries or corrections. Both light and dark mode previews are included so teams can validate visual consistency across themes.
          *** ## Best Practices
          Recommended guidelines for designing and implementing the **Document Capture** experience. **✅ Do** Keep instructions short and easy to understand. Provide clear guidance for framing and positioning the document correctly. Allow users to retry whenever a capture or upload fails. Support both upload and camera capture flows consistently when applicable. **❌ Don’t** Don’t rely solely on color to communicate status or feedback. Don’t crop, obscure, or cover important document information. Don’t skip or reduce essential error and validation states. --- - Path: `design-and-ux/document-capture-screens-states` - URL: https://developer.incode.com/design-and-ux/document-capture-screens-states/ - Markdown: https://developer.incode.com/design-and-ux/document-capture-screens-states.md # Screens & States A complete view of all screens the user may encounter during the Face Match experience. Each state includes a brief description and a direct link to its source in Figma. **Open Full Screen and Specs in [Figma](https://www.figma.com/design/BXeJ6Q3TXahJVWEt8QoMVA/Face-Match---In-Production?node-id=18-19332)** Source of truth for layout, visual specs, interactions, and platform variations. *** ## Document Capture Tutorial The tutorial screen introduces the document capture process. Depending on the available verification methods, the screen may display both capture and upload options, or only a single available method for the user.
          ## Document Verification Method This screen allows users to select the method they will use to verify their document. The selection modal is available on both web and native platforms. On native, users can choose between taking a photo, selecting an image from the camera roll, or choosing a file from the device storage. On web, users are presented with capture and upload options, as the native system modal is displayed afterwards to complete the selection flow.
          ## Permission Screens Shown when camera permissions have not been granted. Includes pre-permission context, OS-specific instructions, and fallback steps if the system dialog is dismissed.
          ## Capture Screen Shown during the document capture process. Users are prompted to position their document within the frame and press the capture button once the document is fully visible. A help button is also available if additional guidance is needed.
          ## Common Issues Shown by tapping on the help icon of the Capture Screen, when users need additional guidance. This screen highlights common capture issues, such as blurry images, glare, shadows, or documents being out of frame, helping users take the photo correctly and avoid verification issues afterwards.
          ## Capture Review Screen Shown after a document has been captured or uploaded, allowing users to review the image before continuing. Users may proceed to the next step or replace the image by recapturing or reuploading the document.
          ## Image Upload Screens Shown after the user confirms the captured document and continues with the verification flow. These screens communicate the upload and success states, providing feedback while the document is being processed before moving to the next step.
          ## Upload Review Screen Shown after the user uploads a document and continues with the verification flow. This screen allows users to review the selected file before proceeding, displaying a small preview of the document along with the file name to confirm the correct file was chosen.
          ## File Upload Screens Shown after the user uploads and confirms a file to continue with the verification flow. These screens communicate the upload and success states, providing feedback while the file is being processed before moving to the next step.
          ## Consecutive Pages Tutorial Shown when the document requires additional pages or supporting information to complete the verification process. Depending on the flow configuration, users may be required to continue with the next page or optionally add more information before proceeding.
          ## Error Shown when the document capture process fails or the uploaded image cannot be processed. Users may retry the capture flow, with 3 attempts available by default before the flow is considered unsuccessful.
          ## Connection Error Displays when connectivity is lost during capture or upload. Users can retry once a stable connection is restored. --- - Path: `design-and-ux/document-capture-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/document-capture-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/document-capture-specs-guidelines.md # Specs & Guidelines The **Document Capture** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.

          *** ## Responsiveness & Viewport Adaptation The **Document Capture** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet. This ensures that key interactive areas, such as the silhouette, capture instructions, and CTAs. remain visible, accessible, and properly aligned across platforms.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | ---------------------------------- | ------------------------------------------------------------------------------ | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; illustration scales down to maintain visibility | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing is redistributed; instructions remain pinned above CTA | | **Foldables (e.g., Pixel Fold)** | Larger visual and more balanced white space; content remains centered | | **Tablets** | Increased layout margins; visual scales proportionally | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | ------------------------------ | ------------------------------------------------------------------ | ----------------------------------------------- | | Document frame / guidance area | Scales proportionally by viewport height and document aspect ratio | Color only (size and detection logic are fixed) | | Instruction text | Reflows to one or two lines depending on width | Text is fully localizable | | Buttons | Width adjusts to container, vertical spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Scales padding according to device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | ------------------------- | ------------------------------------------ | | Capture logic & detection | Must remain consistent for accuracy | | Capture frame proportions | Crucial for document alignment guidance | | Minimum text size | Required for readability & WCAG compliance | | Minimum tap target sizes | Ensures accessibility on mobile | | Overall hierarchy | Prevents cognitive load at different sizes |
          ### Design Notes * The document guidance frame always remains the dominant visual element, regardless of screen size or document type. * Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. * Avoid adding custom UI above or below the module, it may break alignment. * Multiline text is handled gracefully, but avoid extremely long localized strings.

          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions Document Capture includes predefined transition rules and micro-interactions that ensure a smooth user experience across tutorial, capture, uploading, and error flows. Timing, easing, and animation guidelines are documented directly in Figma prototypes.

          *** ## Localization The **Document Capture** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Buttons and CTAs automatically expand to fit translated labels. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable. * Incode supports a variety of languages
          --- - Path: `design-and-ux/document-capture-v1-vs-v2-comparison` - URL: https://developer.incode.com/design-and-ux/document-capture-v1-vs-v2-comparison/ - Markdown: https://developer.incode.com/design-and-ux/document-capture-v1-vs-v2-comparison.md # Document Capture V1 vs V2 Comparison
          In V1, Document Capture offers a basic experience for the user to capture or upload the document. The camera view has a document overlay for the user to use as a guide, but it may not reflect exactly the format that the user needs to upload. Guidance is limited, and tutorials can sometimes become redundant to users. Customization and behavior can vary. In V2, Document Capture has refined tutorials that clearly communicate to users what’s expected to complete the process. The camera view has a larger frame without any overlay so the user doesn’t have any distractions. Common issues screens was also refined for clarity, among other steps from the experience that have been reviewed and improved. The UI is cleaner, transitions are smoother, and customization follows a unified UXv2 system, making the flow more predictable and easier to complete.


          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences).
          | Capabilities | V1 | V2 | Notes | | ------------------------------ | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | Manually capture document | ✅ | ✅ | V2 has a larger capture frame, and introduced instructions to the capture screen for clarity. | | Upload methods supported | ✅ | ✅ | Both versions allow the user to choose the upload method and they can be configured. | | Common Issues | ✅ | ✅ | V2 refined the issues displayed and the content for clarity, so users can get a good capture. | | Dedicated second page tutorial | ❌ | ✅ | V2 has a dedicated tutorial for cases where the user may need to capture following pages. | | Error States | ✅ | ✅ | Both versions cover general error cases that users can encounter. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime.
          | Behavior | V1 | V2 | Notes | | -------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | Tutorial behavior | Basic visual of standard document layout | Straightforward and minimal tutorial | V2 is intuitive and directs the focus towards the tutorial instructions. | | Multi-page capturing | It repeats the full module unchanged to capture a second page | Dedicated tutorials for the capture of consecutive pages | V2 features dedicated screens for capturing consecutive pages, complete with tutorials for both optional and mandatory steps. | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. | | Capture experience | Native camera experience | Custom camera view with instructions and common issues | V2 uses a custom camera experience with instruction text, an overlay for positioning guidance, and access to a help section for better capture. | ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify. **For full details, visit the [Customization](/design-and-ux/document-capture-customization/) tab of this module.**

          --- - Path: `design-and-ux/dropdown` - URL: https://developer.incode.com/design-and-ux/dropdown/ - Markdown: https://developer.incode.com/design-and-ux/dropdown.md # Dropdown Dropdowns allow users to select a single option from a collapsible list. Used for document types, country selection, and other enumerated choices where a radio group would be too long.
          Anatomy
          Select country
          Closed.dropdown

          The field shows the placeholder or the current selection, with a chevron affordance.

          MexicoColombiaBrazil
          Open.dropdown.is-open

          The menu lists the options; the selected item is highlighted.

          Colombia
          Selected.dropdown.has-value

          After choosing, the field shows the value in full text color.

          Tokens
          ```dh-comp-tokens --dropdown-surface | Field background | Component --dropdown-border-default | Border — rest | Component --dropdown-border-open | Border — open state | Component --dropdown-text-default | Selected text color | Component --dropdown-text-placeholder | Placeholder text color | Component --dropdown-chevron | Chevron icon color | Component --radius-dropdown | Corner radius | Semantic ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/ekyb-design` - URL: https://developer.incode.com/design-and-ux/ekyb-design/ - Markdown: https://developer.incode.com/design-and-ux/ekyb-design.md # eKYB The **eKYB **Verification module collects business identity information and validates it against official corporate registries and regulatory databases to confirm the legitimacy of a legal entity. It enables compliant, real-time business verification within onboarding and regulatory flows. Designed to be structured and secure, the module manages logic, processing states, and verification outcomes with clear system feedback. *** ## Where it fits in the flow **eKYB** Verification is positioned after initial business representative data collection (such as email or phone verification) and before advanced verification modules, depending on the configured onboarding flow. *** ## User Flow The eKYB Verification experience guides users through structured data entry and backend validation.
          *** ## Full Flow Map This diagram outlines the end-to-end screen sequence of the eKYB Verification module, including data input, validation states, and the success outcome.
          *** ## Happy Path (Light & Dark) The ideal user journey occurs when business information is submitted and verified successfully against official records without interruptions. The happy path represents the smoothest version of the experience: the user completes all required business fields accurately (such as legal entity name, registration number, and jurisdiction), submits the form, and the system validates the information against corporate registries without mismatches or delays. The processing state resolves successfully on the first attempt, and the user reaches the confirmation screen without needing to retry or correct any data. Light and dark mode previews are included to allow teams to validate visual consistency, accessibility, and contrast across themes and platforms.
          *** ## Best Practices Recommended guidelines for designing and implementing the eKYB Verification experience. ✅ Do - Keep the form structured, clean, and easy to scan. - Use inline validation to prevent submission errors. - Clearly indicate required fields and input formats. - Preserve user-entered data if verification fails. - Provide clear feedback during the processing state. ❌ Don’t - Don’t delay validation until after submission. - Don’t erase completed fields after backend errors. - Don’t allow duplicate submissions while processing.
          --- - Path: `design-and-ux/ekyc-design` - URL: https://developer.incode.com/design-and-ux/ekyc-design/ - Markdown: https://developer.incode.com/design-and-ux/ekyc-design.md # eKYC The [eKYC module](/features-and-modules/ekyc/) collects user identity information and validates it against official records to confirm identity authenticity. It enables compliant, real-time identity verification within onboarding and regulatory flows. This module is designed to be structured and secure. The module manages logic, processing states, and verification outcomes with clear system feedback. ![KYC Prototype](https://developer.incode.com/assets/c05f497d-3fd8-43b2-a710-ef09b8c1fe0b.gif) *** ## Where it fits in the flow eKYC Verification is positioned after initial user data collection (such as phone or email verification) and before advanced verification modules (including document capture or biometric checks), depending on the configured onboarding flow. *** ## User Flow The eKYC Verification experience guides users through structured data entry and backend validation.
          *** ## Full Flow Map This diagram outlines the end-to-end screen sequence of the eKYC Verification module, including data input, validation states, and the success outcome. *** ## Happy Path (Light & Dark) The ideal user journey occurs when identity information is submitted and verified successfully without interruptions. The happy path represents the smoothest version of the experience: the user completes all required fields accurately, submits the form, and the system validates the information without mismatches or delays. The processing state resolves successfully on the first attempt, and the user reaches the confirmation screen without needing to retry or correct any data. Light and dark mode previews are included to allow teams to validate visual consistency, accessibility, and contrast across themes and platforms. *** ## Best Practices Recommended guidelines for designing and implementing the eKYC Verification experience. ✅ **Do** * Keep the form structured, clean, and easy to scan. * Use inline validation to prevent submission errors. * Clearly indicate required fields and input formats. * Preserve user-entered data if verification fails. * Provide clear feedback during the processing state. ❌ **Don’t** * Don’t delay validation until after submission. * Don’t erase completed fields after backend errors. * Don’t allow duplicate submissions while processing. --- - Path: `design-and-ux/electronic-signature-design` - URL: https://developer.incode.com/design-and-ux/electronic-signature-design/ - Markdown: https://developer.incode.com/design-and-ux/electronic-signature-design.md # Electronic Signature **Electronic Signature** is a key step in onboarding and agreement workflows. It lets users draw their signature directly on screen using a finger or mouse. The module provides a clean signing canvas with the option to clear and redo, and a confirmation step to ensure the signature is captured accurately. *** ## Where it fits in the flow **Electronic Signature** is typically positioned at the end of an onboarding or verification flow, after identity and document checks have been completed, depending on the configured workflow. *** ## User Flow The **Electronic Signature** experience guides users through a simple signature capture, review, and confirmation process.
          *** ## Full Flow Map
          *** ## Happy Path (Light & Dark) The ideal user journey occurs when the signature is drawn and captured successfully without interruptions. **The happy path** represents the smoothest version of the experience: the user draws their signature on the canvas, reviews it, taps "Done," and the system captures and confirms the signature on the first attempt. The user reaches the success screen without needing to clear and redraw or encountering any errors. **Light and dark mode** previews are included to allow teams to validate visual consistency, accessibility, and contrast across themes and platforms.
          *** ## Best Practices Recommended guidelines for designing and implementing the **Electronic Signature experience** ✅ Do * Keep the signature canvas clean, spacious, and easy to interact with on all screen sizes. * Disable the "Done" button until a signature stroke is detected on the canvas. * Provide a clear "Clear canvas" option so users can easily redo their signature. * Give immediate visual feedback when the signature is being captured and processed. * Ensure the canvas is responsive and works well with both finger and mouse input. ❌ Don't * Don't allow submission of an empty canvas. * Don't allow duplicate submissions by leaving the "Done" button active while processing. --- - Path: `design-and-ux/elevation` - URL: https://developer.incode.com/design-and-ux/elevation/ - Markdown: https://developer.incode.com/design-and-ux/elevation.md # Elevation Five levels of depth, each with a fixed shadow recipe and a clear job. Elevation communicates what floats above what — it is never decoration. ## Shadow scale ```dh-strip kind: elevation desc: Shown on a light background — shadows are visible against white. Flat | --shadow-none | none Low | --shadow-sm | 0 1px 2px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.10) Mid | --shadow-md | 0 4px 8px rgba(0,0,0,0.08), 0 2px 4px rgba(0,0,0,0.06) High | --shadow-lg | 0 8px 24px rgba(0,0,0,0.12), 0 4px 8px rgba(0,0,0,0.08) Overlay | --shadow-xl | 0 20px 48px rgba(0,0,0,0.18), 0 8px 16px rgba(0,0,0,0.10) ``` ```dh-principles #006aff | Shadow signals hierarchy | Higher elevation = more visual weight = content that demands attention. Every level is intentional — don't use Overlay for a tooltip. #189f60 | Flat uses border, not faint shadow | Flat surfaces are separated by a 1px border token, not a subtle shadow. Faint shadows are hard to control across light and dark modes. #ff9900 | Dark mode lifts the surface | In dark mode, elevation is often communicated by lightening the surface color — not deepening the shadow. Tokens handle this automatically. ``` ```dh-elevation Flat | Elevation.0 · --shadow-none | none | No shadow. Distinguish with a 1px border instead. Low | Elevation.1 · --shadow-sm | 0 1px 2px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.10) | Subtle lift. Interactive or slightly raised surfaces without strong hierarchy. Mid | Elevation.2 · --shadow-md | 0 4px 8px rgba(0,0,0,0.08), 0 2px 4px rgba(0,0,0,0.06) | Moderate depth. Standard elevation for floating elements and focused surfaces. High | Elevation.3 · --shadow-lg | 0 8px 24px rgba(0,0,0,0.12), 0 4px 8px rgba(0,0,0,0.08) | Strong depth. Content sits significantly above the base surface. Overlay | Elevation.4 · --shadow-xl | 0 20px 48px rgba(0,0,0,0.18), 0 8px 16px rgba(0,0,0,0.10) | Maximum elevation. Reserved for full-screen overlays and blocking surfaces. ``` ```dh-usage Flat | Elevation.0 | No shadow. Distinguish with a 1px border instead. | Default cards, List items, Table rows, Input fields Low | Elevation.1 | Subtle lift. Interactive or slightly raised surfaces without strong hierarchy. | Hover state cards, Sticky table headers, Inline action menus Mid | Elevation.2 | Moderate depth. Standard elevation for floating elements and focused surfaces. | Dropdown menus, Popovers, Focused cards, Tooltips High | Elevation.3 | Strong depth. Content sits significantly above the base surface. | Modals, Dialogs, Side drawers, Command palettes Overlay | Elevation.4 | Maximum elevation. Reserved for full-screen overlays and blocking surfaces. | Full-screen modals, Bottom sheets, Context menus with backdrops ``` --- - Path: `design-and-ux/email-input-customization` - URL: https://developer.incode.com/design-and-ux/email-input-customization/ - Markdown: https://developer.incode.com/design-and-ux/email-input-customization.md # Customization This section outlines the elements you can customize within the **Email Input** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms.
          ## Empty Form Screen Initial state of the module. The email field is empty, validation hasn’t run yet, and Continue is disabled until a valid format is entered.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :---------------------------- | :-------------------------------- | :------------------------------------------------ | | **Text** | Title, subtitle, button label | Fully localizable; keep succinct for scanability | | **Email Input (Idle)** | Border, surface, placeholder text | Maintain clear contrast with focused/error states | | **Close Icon** | Color | Should remain subtle vs. brand accents | | **Primary Button (Disabled)** | Label and disabled colors | Must remain visually distinct from enabled state | | **Brand Colors** | Header, accents | Use existing brand tokens to ensure consistency |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :------------------------- | :------------------------------------------------------ | | Layout structure & spacing | Ensures cross-module consistency and predictable rhythm | | Input height & radius | Standardized for touch ergonomics and familiarity | | Button placement | Keeps spatial consistency through all states | | WCAG minimum contrast | Mandatory for accessibility compliance |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :--------------------------- | :-------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | Subtitle text | `text-body-secondary` | `#60667C` | | Email input border (idle) | `input-border-default` | `#EBECEF` | | Email input surface (idle) | `input-surface-default` | `#FCFCFD` | | Email input placeholder | `input-text-field-placeholder` | `#A3A8B8` | | Email input text | `input-text-field-default` | `#262831` | | Button background (disabled) | `button-primary-surface-disabled` | `#EBECEF` | | Button text (disabled) | `button-primary-text-disabled` | `#A3A8B8` | | Background surface | `surface-neutral-0` | `#FFFFFF` |
          ### Design Notes * If customizing text, ensure clarity and brevity (e.g., “Enter your email” instead of “Please provide your email address”). * When adjusting button color, maintain strong contrast for accessibility.
          *** ## Focused Input Screen State when the user is actively typing and the email format is valid. The input shows a focused style and "Continue" button becomes enabled.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------------------- | :---------------------------------- | :-------------------------------------- | | **Text** | Title, subtitle, button label | Fully localizable; keep concise | | **Email Input (Focused)** | Border, surface, caret, placeholder | Must keep high contrast vs. idle/error | | **Close Icon** | Color | Remains secondary to brand accents | | **Primary Button (Enabled)** | Label and background/text colors | Use brand primary; ensure WCAG contrast |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :---------------------------- | :-------------------------------------------- | | Input height, radius, spacing | Touch ergonomics and cross-module consistency | | Button placement | Spatial predictability across states | | WCAG minimum contrast | Required for certification and compliance |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :---------------------------- | :------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | Subtitle text | `text-body-secondary` | `#60667C` | | Email input border (focused) | `input-border-focused` | `#006AFF` | | Email input surface (focused) | `input-surface-focused` | `#FCFCFD` | | Email input text | `input-text-field-default` | `#262831` | | Email input placeholder | `input-text-field-placeholder` | `#A3A8B8` | | Button background (enabled) | `button-primary-surface-default` | `#006AFF` | | Button text (enabled) | `button-primary-text-default` | `#FFFFFF` | | Background surface | `surface-neutral-0` | `#FFFFFF` |
          ### Design Notes * You can adjust the focus color to match your brand, but ensure it remains visually distinct from error states. * If modifying typography, preserve visual differences between title, subtitle, and input to maintain clarity. * Always test your custom color scheme in light and dark modes for accessibility consistency.
          *** ## OTP Entry Screen (Focused State) This screen appears after the user enters their email and the system sends a one-time passcode (OTP) to this email. The user is prompted to enter the 6-digit verification code in a single input field. As the field gains focus, the border and surface adapt to indicate active interaction. A countdown below the button communicates when the user can resend the code.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :------------------- | :------------------------------------- | :------------------------------------------------------------- | | **Text** | Title, helper text, countdown label | Fully localizable; supports dynamic values (e.g., countdown) | | **OTP Fields** | Border and text color in focused state | Must maintain accessibility contrast and clarity | | **Buttons** | Label, color states (disabled/enabled) | Must meet WCAG 2.1 contrast requirements | | **Resend Code Text** | Color, hover/press state | Uses tertiary text token, consistent with interaction patterns | | **Brand Colors** | Primary accent and focus color | Derived from `brand-500` and related tokens |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :---------------------------------------------------- | | Input field layout | Ensures consistency across all OTP verification steps | | Field spacing | Optimized for readability and tap accuracy | | Countdown behavior | Fixed duration to standardize retry experience | | Button placement | Standard alignment for visual rhythm and reachability | | Typography hierarchy | Maintains cross-platform readability | | WCAG minimum contrast | Required for accessibility certification |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :--------------------------- | :-------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | OTP input border (focused) | `input-border-focused` | `#006AFF` | | OTP input surface (focused) | `input-surface-focused` | `#FCFCFD` | | OTP input text | `input-text-field-default` | `#262831` | | Button background (disabled) | `button-primary-surface-disabled` | `#EBECEF` | | Button text (disabled) | `button-primary-text-disabled` | `#A3A8B8` | | Countdown text | `text-body-secondary` | `#60667C` | | Resend link | `button-tertiary-text-disabled` | `#60667C` | | Background surface | `surface-neutral-0` | `#FFFFFF` |
          ### Design Notes * You can adjust the focus color to match your brand, but ensure it remains visually distinct from error states. * If modifying typography, preserve visual differences between title, subtitle, and input to maintain clarity. * Always test your custom color scheme in light and dark modes for accessibility consistency.
          *** ## OTP Checking (Verification Loading) Screen This screen represents the verification state of the OTP. After the user submits the one-time passcode (OTP), the system verifies the input. The interface locks input fields and transitions the button to a loading spinner, indicating that validation is in progress. During this state, interaction is temporarily disabled until the verification completes.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :------------------------------ | :---------------------------------- | :-------------------------------------------------- | | **Text** | Title and helper text | Fully localizable; tone can be adapted | | **OTP Fields (Disabled)** | Border, background, and text color | Should visually indicate a non-editable state | | **Buttons** | Spinner color, background, and text | Spinner inherits brand color for visual consistency | | **Resend / Change Number Text** | Color and link state | Uses tertiary text token | | **Brand Colors** | Button and header accents | Derived from `brand-...` tokens |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :----------------------- | :--------------------------------------------------------- | | Layout structure | Ensures consistency across all verification states | | Button position | Aligned for accessibility and predictable interaction flow | | Input layout and spacing | Maintains readability during transition states | | Loading spinner size | Standardized for cross-platform consistency | | Typography hierarchy | Maintains readability and balance | | WCAG minimum contrast | Ensures accessible visual design |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :--------------------------- | :------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | OTP input border (disabled) | `input-border-disabled` | `#EBECEF` | | OTP input surface (disabled) | `input-surface-disabled` | `#EBECEF` | | OTP input text (disabled) | `input-text-field-disabled` | `#A3A8B8` | | Spinner accent | `surface-brand-400-static` | `#3388FF` | | Button background (loading) | `button-primary-surface-default` | `#006AFF` | | Button text (loading) | `button-primary-text-default` | `#FFFFFF` | | Resend / Change Email text | `button-tertiary-text-disabled` | `#60667C` | | Background surface | `surface-neutral-0` | `#FFFFFF` |
          ### Design Notes * If modifying color schemes, ensure that disabled input states remain visibly distinct.
          *** ## Processing Screen This optional screen appears after the OTP verification is completed and before the module transitions to a success or failure state. It communicates that the system is finalizing the verification process, providing visual feedback to assure the user that progress is ongoing.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :-------------------------------------- | :------------------------------------------------------------ | | **Text** | Loading message (e.g., “Processing...”) | Fully localizable; keep short and neutral | | **Spinner** | Color, animation speed | Must use brand color for recognition; avoid slowing animation | | **Background** | Color and safe area padding | Maintain contrast and visual calmness | | **Brand Colors** | Header and spinner accent | Should use primary brand token for consistency |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :---------------- | :----------------------------------------------- | | Spinner placement | Centralized for visual focus and balance | | Animation timing | Consistent across all processing states in SDK | | Typography size | Maintains clear hierarchy and visual stability | | Button removal | Reduces confusion during non-interactive state | | Layout rhythm | Matches other module loading states for cohesion |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :------------------------- | :-------------------------- | :------------ | | Spinner accent (primary) | `spinner-surface-primary` | `#006AFF` | | Spinner accent (secondary) | `spinner-surface-secondary` | `#E5F0FF` | | Title text | `spinner-text-title` | `#262831` | | Background surface | `surface-neutral-0` | `#FFFFFF` |
          ### Design Notes * Keep the text short; don’t include instructions or next steps here. * If using customized colors, ensure they don’t reduce the contrast of the spinner icon.
          *** ## Success Screen This screen appears after the user’s email has been successfully verified. It provides a clear confirmation of success before the flow transitions to the next module or completion step. The layout is intentionally minimal to maintain focus on the success feedback.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :--------------------------------------------- | :----------------------------------------------------------------------------------- | | **Text** | Confirmation message (e.g., “Email verified!”) | Fully localizable; tone should remain concise and positive | | **Success Icon** | Color, animation | Should use the positive status color token; simple checkmark animation is acceptable | | **Brand Colors** | Header and accent | Must align with overall brand identity while maintaining readability | | **Background** | Color | Keep high contrast for the icon and message |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :--------------------- | :------------------------------------------------------ | | Layout structure | Ensures consistent feedback presentation across modules | | Icon size and position | Optimized for recognition and accessibility | | Text alignment | Central alignment for visual balance | | Typography hierarchy | Maintains brand consistency and readability | | WCAG minimum contrast | Required for accessibility compliance |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :----------------- | :--------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | Success icon | `icon-status-positive` | `#189F60` | | Icon background | `icon-neutral-0` | `#FFFFFF` | | Background surface | `surface-neutral-0` | `#FFFFFF` |
          ### Design Notes * Keep the confirmation text short and positive; don’t include instructions or next steps here. * If using customized colors, ensure they don’t reduce the contrast of the success message or icon.
          *** ## OTP Error Screen This screen appears when the user enters an incorrect or expired code. It provides immediate visual feedback through red highlight states and an error message. The interface allows the user to resend the code or change their email before attempting verification again.  ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :-------------------------------- | :----------------------------- | :---------------------------------------------------- | | **Text** | Error message and helper text | Fully localizable; keep concise and polite tone | | **Input Fields (Error)** | Border, background, text color | Must maintain strong color contrast for accessibility | | **Error Icon** | Color | Uses negative (error) status color token | | **Buttons** | Label, color state | Maintain clear disabled and active visual distinction | | **Links (Resend / Change Email)** | Color and hover states | Use brand accent color for recognition | | **Brand Colors** | Header and accents | Should align with existing brand color tokens |  ### Fixed Elements | **Element** | **Why it is fixed** | | :---------------------------- | :-------------------------------------------- | | Layout structure | Maintains consistency across OTP states | | Input field shape and spacing | Optimized for error visibility | | Button placement | Standardized for user familiarity | | Typography hierarchy | Preserves consistent hierarchy and legibility | | Error message position | Fixed to align directly below input fields | | WCAG minimum contrast | Required for accessibility compliance |  ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :---------------------------- | :-------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | Error border | `input-border-negative` | `#E71111` | | Error surface | `input-surface-negative` | `#EBECEF` | | Error text | `input-text-helper-negative` | `#E71111` | | Error icon | `input-icon-negative` | `#E71111` | | Input text (default) | `input-text-field-default` | `#262831` | | Button background (disabled) | `button-primary-surface-disabled` | `#EBECEF` | | Button text (disabled) | `button-primary-text-disabled` | `#A3A8B8` | | Links (Resend / Change Email) | `button-tertiary-text-default` | `#006AFF` | | Background surface | `surface-neutral-0` | `#FFFFFF` |  ### Design Notes * Error messaging should remain concise — don’t overload users with explanations. * Avoid replacing the red border with icons alone; border color communicates immediacy effectively.
          *** ## Failure Screen This screen appears when a critical issue prevents the verification process from completing — for example, a timeout, or unexpected backend failure. It reassures the user with clear feedback and offers a “Try again” action to quickly restart the verification flow.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :------------------- | :---------------------------- | :-------------------------------------------------------------- | | **Text** | Heading and button label | Fully localizable; tone should remain calm and neutral | | **Error Icon** | Color, size, animation | Should use negative color token; avoid using motion-heavy icons | | **Button (Primary)** | Label, background, text color | Use brand accent for consistency; maintain high contrast | | **Brand Colors** | Header, accent | Must match brand token palette | | **Background** | Color | Maintain sufficient contrast for visibility and focus |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :---------------------- | :----------------------------------------------------------- | | Layout and spacing | Consistent centered hierarchy across all result states | | Icon and text alignment | Ensures immediate clarity and minimal scanning effort | | Typography weight | Reinforces error hierarchy; avoids visual noise | | Button placement | Fixed below feedback message to preserve spatial consistency | | WCAG minimum contrast | Required for accessibility compliance |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :-------------------------- | :------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | Error icon | `icon-status-negative` | `#E71111` | | Button background (primary) | `button-primary-surface-default` | `#006AFF` | | Button text | `button-primary-text-default` | `#FFFFFF` | | Background surface | `surface-neutral-0` | `#FFFFFF` |  ### Design Notes * Error messaging should remain concise — don’t overload users with extra details. * Avoid specifying is details whether the error is due to network, validation, or server issues to prevent potential reverse-engineering attempts by fraudsters. --- - Path: `design-and-ux/email-input-design` - URL: https://developer.incode.com/design-and-ux/email-input-design/ - Markdown: https://developer.incode.com/design-and-ux/email-input-design.md # Email Input The **Email Input** module allows users to verify their email address by entering it and confirming a one-time passcode (OTP) sent to their inbox. This module ensures email ownership, a key step in identity verification and account activation flows. It is designed for clarity, speed, and accessibility — optimized for both native and web environments. *** ## Where it fits in the flow **Email Input** typically appears early in the onboarding or verification process, often as an alternative or complement to Phone Number Input. Once the user confirms their email, the system proceeds to the next validation stage automatically or transitions to user onboarding logic configured by the client. *** ## User Flow The **Email Input** experience guides the user from entry to verification. After submitting a valid email address, the system sends a one-time passcode (OTP) to the provided address and prompts the user to enter it for confirmation. If the email format is invalid or the OTP entry fails, fallback paths allow the user to correct their input, resend the verification code, or change the email address. Once the verification is successful, the user proceeds automatically to the next module or configured step in the flow.
          *** ## Full Flow Map This diagram presents the full sequence of screens involved in the Email Input module — from the initial email entry and format validation, through OTP verification and system feedback, to final confirmation. It outlines both the ideal verification path and the alternative user journeys, including error handling for invalid email formats, incorrect codes, network issues, and retry flows. The map visualizes all possible user interactions and system states within the module, ensuring clarity for design, development, and QA alignment.
          *** ## Happy Path (Light & Dark) The ideal user journey when the email is verified successfully without interruptions. The happy path represents the smoothest version of the experience — the user enters a valid email address, receives the verification code instantly, inputs the correct OTP, and the verification succeeds on the first attempt. No manual retries or format corrections are required. Both light and dark mode previews are included so that design, product, and engineering teams can validate color contrast, typography consistency, and accessibility across all themes and devices. Geolocation module - Happy Path in Light mode Geolocation module - Happy Path in Dark mode
          *** ## Best Practices Recommended guidelines for designing and implementing the **Email Input** experience. **✅ Do** * Keep the email input field clearly labeled and accessible. * Display input validation (e.g., invalid format) immediately to reduce friction. * Maintain consistent CTA placement (“Continue”) across all screens. **❌ Don’t** * Don’t delay validation — instant feedback improves trust and usability. * Avoid truncating long email addresses. * Don’t change button positions between steps; spatial consistency aids flow.
          --- - Path: `design-and-ux/email-input-screens-states` - URL: https://developer.incode.com/design-and-ux/email-input-screens-states/ - Markdown: https://developer.incode.com/design-and-ux/email-input-screens-states.md # Screens & States A complete view of all screens the user may encounter during the **Email Input** module experience. Each state includes a brief description. *** ## Enter Email Guides the user from an empty field to a valid email and into submission. The Continue button is disabled until a valid format is detected; it activates once validation passes. While submitting, the button shows a loading state to prevent duplicate requests.

          ## Enter Code (OTP Input) Displayed after the user submits an email. The system sends an SMS with a one-time code, and this screen prompts the user to enter it. A countdown timer indicates when the “Resend code” option becomes available.

          ## Processing A short step after the OTP is submitted. Spinner + status text communicates progress while preventing multiple submissions. This state should be brief and non-interruptible (except for closing the module, if allowed by host app).

          ## Success Confirms verification with a positive icon and concise message (Email verified!). Automatically progresses to the next module or returns control to the host app per integration settings.

          ## Error States (Email & OTP) Covers common failures: * Invalid email format (inline helper text; button remains disabled) * Incorrect code (inputs marked, helper text provided) * Code expired (inputs marked, helper text provided) Recovery affordances (Resend code, Change email) remain visible. Copy is intentionally brief to avoid over-explaining and reduce the risk of aiding malicious testing. --- - Path: `design-and-ux/email-input-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/email-input-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/email-input-specs-guidelines.md # Specs & Guidelines The **Email Input** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.
          *** ## Responsiveness & Viewport Adaptation The **Email Input** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet. This ensures that key interactive elements, such as the input field and CTA button, remain visible, accessible, and consistently aligned across all platforms.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | :--------------------------------- | :------------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | Input field and button stack vertically; spacing compresses slightly for balance | | **Standard phones (iPhone 12–16)** | Full layout displayed; consistent alignment between title, field, and CTA | | **Tall/narrow Android devices** | Vertical rhythm adapts to keep the field and button comfortably in view | | **Foldables (e.g., Pixel Fold)** | Content remains centered; additional margin creates visual balance | | **Tablets** | Wider margins and proportional scaling of text and elements | | **Desktop web** | Centered layout with max-width container and safe-area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | :------------------ | :------------------------------------------------- | :--------------------- | | Map / Illustration | Scales with viewport; adapts to portrait/landscape | Color and style only | | Instruction text | Reflows to one or two lines depending on width | Yes, fully localizable | | Buttons | Width adjusts to container, spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Adjusts padding per device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | :---------------------- | :------------------------------------------- | | Input validation logic | Ensures consistent verification behavior | | Minimum text size | Maintains readability and WCAG compliance | | Tap target dimensions | Accessibility standard across mobile devices | | Input-field proportions | Keeps layout balance across modules | | Layout hierarchy | Ensures predictable user experience |
          ### Design Notes * The input field remains the focal point on all screen sizes — avoid introducing secondary visual elements. * Maintain generous vertical spacing for clarity, especially on devices with on-screen keyboards. * Ensure button and input alignment remain vertically stacked — never side-by-side. * Avoid overlaying or crowding the layout with additional text (e.g., marketing or help tips). * For localization, test long strings (especially in German, Spanish, or Portuguese) to prevent overflow and maintain rhythm.
          *** ## Desktop & Tablet Guidelines The **Email Input** module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.
          *** ## Prototype & Transitions **Email Input** includes predefined transition rules and micro-interactions that ensure a smooth user experience. Animation guidelines are documented directly in Figma prototypes.
          *** ## Localization **Email Input** supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          ### Key considerations * Incode supports a variety of languages. * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Buttons and CTAs automatically expand to fit translated labels. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable.
          --- - Path: `design-and-ux/email-input-v1-vs-v2-comparison` - URL: https://developer.incode.com/design-and-ux/email-input-v1-vs-v2-comparison/ - Markdown: https://developer.incode.com/design-and-ux/email-input-v1-vs-v2-comparison.md # Email Input V1 vs V2 Comparison V1 provides a basic email input and verification experience. While it supports the necessary validation logic, the flow offers less flexibility in adapting the experience to different product needs, markets, or branding requirements. V2 rethinks the flow to be clearer, and easier to customize, introducing better error handling, and alignment with the token-based system. The V2 experience is designed to reduce user confusion, lower drop-off during verification, and ensure consistent look across platforms and markets.


          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | -------------------------- | ------- | -------- | ------------------------------------------------------------------ | | Email verification | ✅ | ✅ | Core functionality present in both versions | | Inline validation | ✅ | ✅ | Validation logic during entry supported in both versions | | Error states coverage | ✅ | ✅ | Both handle errors, V2 structures them better and improves clarity | | Customization options | Limited | Advanced | V2 supports token-based customization | | Documentation completeness | Basic | Enhanced | V2 provides enhanced, standardized documentation coverage |
          ***
          ## Behavior Differences How the module behaves during runtime. | Behavior | V1 | V2 | Notes | | --------------------- | -------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------------------------- | | Error handling | Separate error states, less contextual | Clear, actionable error messages with improved UX writing | V2 reduces cognitive load | | State transitions | Default transitions | Defined transitions between states | V2 includes transition smoothness and consistency as part of the experience | | Flow and UI structure | Functional but less standardized | Structured and consistent | Aligned with the tokenized design system | ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.
          --- - Path: `design-and-ux/face-capture-customization` - URL: https://developer.incode.com/design-and-ux/face-capture-customization/ - Markdown: https://developer.incode.com/design-and-ux/face-capture-customization.md # Customization This section outlines the elements you can customize within the **Face Capture** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms.
          ## Tutorial Screen The Tutorial Screen prepares the user for the Face Capture step. It introduces the action, provides the necessary context, and sets expectations before the camera is activated.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ---------------- | ----------------------------------------------------- | -------------------------------------- | | **Text** | Title, subtitle, body text | Fully localizable; tone can be adapted | | **Illustration** | Full replacement | Must remain clear and represent a face | | **Brand Colors** | Header, highlight elements, illustration ring, button | Uses brand tokens | | **Buttons** | Label, color, radius | Must follow platform guidelines | | **Footer** | “Verified by Incode” line | Optional but recommended |
          ### Fixed Elements | **Element** | **Why it is fixed** | | --------------------- | ------------------------------------- | | Layout structure | Ensures consistency across modules | | Silhouette style | Must remain consistent with global UX | | Spacing & safe areas | Required for device compatibility | | Text hierarchy | Optimized for readability | | Close icon position | Standardized for user familiarity | | WCAG minimum contrast | Mandatory |
          ### Token Reference | **UI Element** | **Token** | **Value** | | ----------------- | ------------------------------ | --------- | | Background | Surface/Neutral/0 | #FFFFFF | | Title text | Text/Body/800 (Primary) | #262831 | | Subtitle text | Text/Body/500 (Secondary) | #60667C | | Disclaimer | Text/Body/500 (Secondary) | #60667C | | Button background | Button/Primary/Surface/Default | #006AFF | | Button text | Button/Primary/Text/Default | #FFFFFF | | Footer text | Text/Body/500 (Secondary) | #60667C |
          ### Design Notes * Keep copy short to minimize cognitive load. * The illustration can be customized using color tokens on Web. For Native platforms, reach out so we can provide a tailored solution. * Ensure tap targets meet accessibility guidelines. * Maintain clear focus states for keyboard and screen reader users (Web).
          *** ## Fake Permission Screen The Fake Permission Screen is shown before the operating system displays its native camera permission modal. It prepares the user, explains why camera access is required, and significantly reduces the likelihood of users denying permission. This step increases trust and prevents interruptions during the selfie flow.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ------------------ | --------------------------------------------- | -------------------------------------------------- | | **Text** | Title, subtitle, permission explanation | Fully localizable; tone should remain reassuring | | **Buttons** | Label (“Allow”, “Don’t allow”), color, radius | Must maintain primary/secondary hierarchy | | **Brand Colors** | Button accents, icon color, text accents | Uses brand tokens | | **Modal Surface** | Background color, elevation, corner radius | Must remain high-contrast and readable | | **Link/Help Text** | “Learn more” or similar supportive text | Optional; can adapt tone based on compliance needs |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------- | --------------------------------------------------------------- | | Background dim opacity | Indicates OS-level permission flow; needed for clarity | | Modal position | Standardized centered layout for all modules | | Button hierarchy | Mirrors OS expectations; prevents accidental “Don’t allow” taps | | Safety text hierarchy | Ensures user comprehension before OS prompt | | Spacing & safe areas | Required for device consistency | | WCAG minimum contrast | Mandatory |
          ### Token Reference | **UI Element** | **Token** | **Value** | | ---------------------- | ------------------------------- | ----------- | | Dimmed background | Surface/Neutral/1000 80% Static | #000000 80% | | Modal background | Surface/Neutral/0 | #FFFFFF | | Title text | Text/Body/800 (Primary) | #262831 | | Subtitle text | Text/Body/500 (Secondary) | #60667C | | Primary button (Allow) | Button/Primary/Surface/Default | #006AFF | | Primary button text | Button/Primary/Text/Default | #FFFFFF | | Secondary button | Button/Secondary/Border/Default | #006AFF | | Secondary button text | Button/Secondary/Text/Default | #006AFF |
          ### Design Notes * The pre-permission modal reduces drop-off by providing context before the OS permission. * Maintain a clear hierarchy between primary (Allow) and secondary (Don’t allow) actions. * Keep the dim overlay consistent to align with OS modal expectations. * Ensure high contrast between modal, text, and background elements. * Avoid adding extra steps or interaction on this screen.
          *** ## Capture Screens During capture, the user aligns their face within the silhouette, and the system evaluates real-time conditions such as lighting, alignment, and distance. Once requirements are met, the photo is taken automatically. Colors and on-screen text can be customized to match your brand, while the silhouette itself is fixed, as it plays an essential role in helping users position their face correctly.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ---------------- | --------------------------------------------------- | -------------------------------- | | **Text** | Instruction text (“Align your face…”, “Get ready…”) | Fully localizable | | **Brand Colors** | Progress indicator, icon colors, header color | Control via tokens | | **Illustration** | Silhouette outline color | Color only — shape cannot change | | **Background** | Neutral/light surfaces | Must maintain contrast | | **Footer** | “Verified by Incode” line | Optional |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------- | --------------------------------------------------------------- | | Silhouette shape | Essential for proper face alignment | | Auto-capture behavior | Ensures consistency and accuracy across devices | | Detection logic | Required for system-level validation (lighting, distance, etc.) | | Layout & hierarchy | Preserves visual consistency across modules | | Minimum contrast | Mandatory to meet accessibility standards | | Progress indicator arc | Behavior and animation timing remain fixed |
          ### Token Reference | **UI Element** | **Token** | **Value** | | ----------------------- | ------------------------- | --------- | | Instruction text | Text/Body/800 (Primary) | #262831 | | Silhouette ring (outer) | Border/Neutral/100 | #EBECEF | | Silhouette arc progress | Border/Status/Focus | #006AFF | | Background | Surface/Neutral/0 Static | #FFFFFF | | Footer text | Text/Body/500 (Secondary) | #006AFF |
          ### Design Notes * The silhouette cannot be altered in shape, only color, as it ensures correct face alignment. * The progress arc represents detection readiness; its behavior should remain consistent to avoid confusing users. * Use brand colors subtly to avoid distracting from the user’s face. * Keep instruction text short and focused to reduce cognitive load. * Maintain clear focus states and large tap areas (for accessibility on Web).
          *** ## Manual Capture Manual capture is triggered after a period of inactivity (default: 30 seconds) when automatic detection conditions are not met. In this mode, the user aligns their face within the silhouette and presses the capture button manually. This ensures the user can still complete the verification even in low-light, complex backgrounds, or edge-case scenarios.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------------------- | ------------------------------------------------------------- | ----------------------------------------------------- | | **Text** | Instructional text (“Align your face… and press the button…”) | Fully localizable | | **Button** | Label, color, radius, icon color | Must follow platform accessibility & tap-target rules | | **Brand Colors** | Header, accent rings, button background, icon accents | Driven by brand tokens | | **Silhouette Color** | Outer ring color only | Shape/size cannot change | | **Background** | Light/neutral backgrounds | Must maintain contrast with silhouette | | **Footer** | “Verified by Incode” line | Optional |
          ### Fixed Elements | **Element** | **Why it is fixed** | | --------------------------- | ----------------------------------------------------- | | Silhouette shape | Core UX element ensuring proper face alignment | | Camera button placement | Ensures reachability and consistency across platforms | | Detection logic fallback | Manual mode must always follow auto mode | | Layout spacing & safe areas | Required for compatibility across device sizes | | Accessibility contrast | Must meet WCAG AA requirements | | Tap target size for button | Required for usability and accessibility |
          ### Token Reference | **UI Element** | **Token** | **Value** | | --------------------- | ------------------------------ | --------- | | Silhouette border | Border/Neutral/100 | #EBECEF | | Silhouette background | Surface/Neutral/900 80% Static | #14151A | | Button icon | Icon/Neutral/50 Static | #FCFCFD | | Button background | Icon/Neutral/800 Static | #262831 | | Instruction text | Text/Body/500 (Secondary) | #60667C | | Background | Surface/Neutral/0 Static | #FFFFFF | | Footer text/link | Text/Body/500 (Secondary) | #60667C |
          ### Design Notes * Manual mode provides a fail-safe capture method when automatic detection is not possible. * Ensure the camera button remains highly visible against any background. * Keep instructional text concise and actionable to reduce friction. * The silhouette must remain visible at all times; avoid color changes that reduce contrast. * Button must preserve accessible tap size (minimum 44×44 px on mobile).
          *** ## Capture Complete (Uploading & Success) Once the selfie is captured, either automatically or manually, the user transitions into the Uploading and Success states. These screens reassure the user that the capture is being processed and provide a clear confirmation when the image is accepted. Both the loading ring and the confirmation colors can be branded to match your product’s identity.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ---------------- | -------------------------------------- | ------------------------------------ | | **Text** | “Uploading…”, “Success!”, body text | Fully localizable | | **Brand Colors** | Progress ring, outline, success colors | Should follow brand tokens | | **Surfaces** | Background, circular surface | Must ensure contrast and clarity | | **Footer** | “Verified by Incode” | Optional | | **Animation** | Progress ring color transitions | Only color; timing/behavior is fixed |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------- | ---------------------------------------------------------- | | Progress ring behavior | Ensures consistent feedback cadence across all modules | | Success timing | User feedback consistency / prevents premature transitions | | Layout structure | Standardized for readability and predictability | | Minimum contrast | Required for WCAG AA compliance | | Loading animation arc | Behavior cannot be modified to maintain UX continuity |
          ### Token Reference | **UI Element** | **Token** | **Value** | | -------------------- | ------------------------- | --------- | | Loading ring (outer) | Spinner/Surface/Primary | #006AFF | | Loading ring (inner) | Spinner/Surface/Secondary | #E5F0FF | | Text (“Uploading…”) | Text/Body/800 (Primary) | #262831 | | Background | Surface/Neutral/0 | #FFFFFF | | Footer text | Text/Body/500 (Secondary) | #60667C |
          ### Design Notes * Keep messaging short and neutral, users should feel reassured, not overwhelmed. * The green ring color communicates a positive state; ensure it remains accessible and high-contrast. * Background should remain clean and unobtrusive to keep focus on the processing state. * Avoid adding interaction in these screens; the user should not be able to interrupt this step. * Maintain consistent ring thickness and spacing to preserve visual rhythm across modules.
          *** ## Error Screens Error screens appear when an issue occurs during capture, such as face misalignment, incorrect lighting, occlusions, or when all attempts have been exhausted. These screens help guide users back into the flow by providing corrective instructions or informing them that manual review will be needed. While text and styling can be branded, error types cannot be removed, as they correspond to specific detection events within the experience.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ---------------- | ---------------------------------------------------------- | ---------------------------------------------- | | **Text** | Error title, description, remaining attempts label | Fully localizable | | **Buttons** | CTA labels (“Try again”, “Continue”), button color, radius | Must keep primary/secondary hierarchy | | **Brand Colors** | Header, accent colors, button colors | Follows brand token system | | **Icons** | Icon color (warning, error) | Only color, not shape | | **Background** | Neutral/light surfaces | Must maintain strong contrast with text + icon |
          ### Fixed Elements | **Element** | **Why it is fixed** | | -------------------------- | ------------------------------------------------------------ | | Error event types | Linked to detection logic; cannot be removed or reordered | | Error icon shapes | Ensures immediate recognition and consistency across modules | | Error screen layout | Preserves visual predictability | | “Attempts remaining” logic | Required for accuracy and flow integrity | | Final error behavior | Must proceed to next step with manual review | | Accessibility contrast | Required to meet WCAG AA |
          ### Token Reference | **UI Element** | **Token** | **Value** | | ------------------- | ------------------------------ | --------- | | Icon (error circle) | Icon/Status/Negative | #E71111 | | Icon (x-mark) | Icon/Neutral/0 | #FFFFFF | | Title text | Text/Body/800 (Primary) | #262831 | | Description text | Text/Body/500 (Secondary) | #60667C | | Background | Surface/Neutral/0 | #FFFFFF | | CTA background | Button/Primary/Surface/Default | #006AFF | | CTA text | Button/Primary/Text/Default | #FFFFFF | | Footer text | Text/Body/500 (Secondary) | #006AFF |
          ### Design Notes * Error messaging should remain clear, direct, and action-oriented. * Use meaningful icon colors (yellow for warnings, red for errors). * Maintain consistent spacing and visual hierarchy for readability. * “Try again” should always feel like the primary action when applicable. * Final error screens should not offer a retry, only a “Continue” action guiding users into manual review logic. * Avoid long or overly technical messages; users should understand the issue at a glance. --- - Path: `design-and-ux/face-capture-design` - URL: https://developer.incode.com/design-and-ux/face-capture-design/ - Markdown: https://developer.incode.com/design-and-ux/face-capture-design.md # Face Capture Face Capture confirms the user’s physical presence by capturing a live selfie that is later used to validate their identity. This module appears after ID Capture and before verification submission or Face Match, forming a core step in the onboarding and authentication flow. *** ## Where it fits in the flow **Face Capture** usually appears immediately after completing document capture. Once the user provides a valid selfie, the flow continues to biometric comparison or any downstream verification logic required by the application. *** ## User Flow The **Face Capture** experience moves through several clear stages that guide the user from preparation to a successful capture. After granting camera permission, the user is introduced to the process through a short tutorial. When capture begins, the system evaluates alignment, lighting, and facial conditions in real time and triggers an automatic capture once all requirements are met. If automatic capture does not occur within the configured timeframe, the experience transitions to manual capture, allowing the user to take the selfie directly. After the image is captured, it is uploaded and analyzed to confirm quality and usability. The user then receives a success state or an error message with retry options before continuing to the next step.

          *** ## Full Flow Map This diagram presents the full sequence of screens involved in **Face Capture**, from tutorial and permission handling, to auto/manual capture, uploading, and final feedback.
          *** ## Happy Path (Light & Dark) The ideal user journey when the selfie is captured successfully with no interruptions. The happy path represents the smoothest version of the experience, where the user grants camera access, follows the tutorial, the system detects proper alignment and lighting, and the selfie is captured automatically without requiring retries or manual intervention. Both light and dark mode previews are included so teams can validate visual consistency across themes.
          *** ## Best Practices Recommended guidelines for designing and implementing the **Face Capture** experience. **✅ Do** * Keep instructions short and easy to understand. * Maintain a clear, unobstructed silhouette for proper alignment. * Ensure high contrast and readable text across all steps. * Provide retry options whenever a capture fails. * Guide users with actionable feedback (lighting, alignment, visibility). **❌ Don’t** * Don’t reduce overlay opacity below 50%, as it affects face visibility. * Don’t rely solely on color to communicate status or feedback. * Don’t skip or reduce essential error states. * Don’t allow UI elements to obstruct the camera area or silhouette. --- - Path: `design-and-ux/face-capture-screens-states` - URL: https://developer.incode.com/design-and-ux/face-capture-screens-states/ - Markdown: https://developer.incode.com/design-and-ux/face-capture-screens-states.md # Screens & States A complete view of all screens the user may encounter during the Face Capture experience. Each state includes a brief description. Source of truth for layout, visual specs, interactions, and platform variations. *** ## Tutorial Pre-capture instructional screen introducing the selfie step. Includes illustration/video and clear guidance before the camera opens.
          ## Permission Screens Shown when camera permissions have not been granted. Includes pre-permission context, OS-specific instructions, and fallback steps if the system dialog is dismissed.
          ## Auto Capture Automatic capture triggers when face alignment, lighting, and detection thresholds are met. This is the primary and recommended capture method.
          ## Manual Capture (Fallback) Fallback option shown after a period of inactivity (default: 30 seconds) or when auto-capture cannot confidently detect a valid frame. Users can take the photo manually.
          ## Feedback Messages (Real-Time Guidance) Real-time, contextual guidance displayed while the camera is active. Helps users correct lighting, distance, positioning, and visibility issues to ensure a valid capture.
          ## Uploading Displayed while the captured selfie is uploaded and prepared for server-side validation. Prevents users from interacting until upload is complete.
          ## Success Shown when the selfie passes validation. The user can proceed to the next verification step without additional input.
          ## Retry Errors Displayed when validation fails but attempts remain. Provides specific corrective guidance and a retry CTA. Attempts reset after a successful capture.
          ## Final Errors (No Attempts Remaining) Shown when all capture attempts have been used. The selfie is submitted for manual review, and the user may continue to the next step.
          ## Connection Error Displays when connectivity is lost during capture or upload. Users can retry once a stable connection is restored. --- - Path: `design-and-ux/face-capture-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/face-capture-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/face-capture-specs-guidelines.md # Specs & Guidelines The **Face Capture** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.

          *** ## Responsiveness & Viewport Adaptation The **Face Capture** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet. This ensures that key interactive areas, such as the silhouette, capture instructions, and CTAs. remain visible, accessible, and properly aligned across platforms.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | ---------------------------------- | ---------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; silhouette scales down to maintain visibility | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing is redistributed; instructions remain pinned above CTA | | **Foldables (e.g., Pixel Fold)** | Larger silhouette and more balanced white space; content remains centered | | **Tablets** | Increased layout margins; silhouette scales proportionally | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | ------------------- | --------------------------------------------------- | -------------------------------- | | Silhouette size | Scales proportionally by viewport height | Color only (size is fixed logic) | | Instruction text | Reflows to one or two lines depending on width | Yes, text is fully localizable | | Buttons | Width adjusts to container, vertical spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Scales padding according to device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | ------------------------- | ------------------------------------------ | | Capture logic & detection | Must remain consistent for accuracy | | Silhouette proportions | Crucial for face alignment guidance | | Minimum text size | Required for readability & WCAG compliance | | Minimum tap target sizes | Ensures accessibility on mobile | | Overall hierarchy | Prevents cognitive load at different sizes |
          ### Design Notes * The silhouette always remains the dominant element, regardless of screen size. * Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. * Avoid adding custom UI above or below the module, it may break alignment. * Multiline text is handled gracefully, but avoid extremely long localized strings.

          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions Face Capture includes predefined transition rules and micro-interactions that ensure a smooth user experience across tutorial, capture, uploading, and error flows. Timing, easing, and animation guidelines are documented directly in Figma prototypes.

          *** ## Localization The **Face Capture** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Buttons and CTAs automatically expand to fit translated labels. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable. * Incode supports a variety of languages
          --- - Path: `design-and-ux/face-capture-v1-vs-v2-comparison` - URL: https://developer.incode.com/design-and-ux/face-capture-v1-vs-v2-comparison/ - Markdown: https://developer.incode.com/design-and-ux/face-capture-v1-vs-v2-comparison.md # Face Capture V1 vs V2 Comparison
          In V1, Face Capture offers a basic experience to capture the user’s face, with limited guidance during the process. It focuses on checking the list of conditions that need to be met for a good capture, providing low visual guidance throughout the flow. In V2, Face Capture guides users step by step. The experience gives live instructions and helps users fix issues as they happen, making the process clearer and easier to complete. It also introduces a cleaner, more modern UI with clearer hierarchy, smoother transitions, and consistent visual patterns.


          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences).
          | Capabilities | V1 | V2 | Notes | | -------------------------- | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | Auto-capture | ✅ | ✅ | Both versions capture the image automatically when conditions are met. | | Capture Condition Checks | ✅ | ✅ | V2 has improved live feedback messages for clarity and understandability. | | Manual Capture | ✅ | ✅ | V2 provides instructions to the user on how to take the photo. | | Capture Attempts | ✅ | ✅ | V2 visually differentiates instances with remaining attempts from those with exhausted ones. | | Error States | ✅ | ✅ | Both versions cover general error cases that users can encounter. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime.
          | Behavior | V1 | V2 | Notes | | --------------------- | ------------------------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | | Tutorial behavior | Long step-by-step animation | Straightforward animated tutorial | V2 is intuitive and directs the focus towards the tutorial instructions. | | Permission flow logic | Immediate native popup is triggered | Pre-permission bottom sheet shown before native popup | When necessary, V2 adds an explanatory step to reduce permission drop-off. | | Feedback presentation | Brief contextual instructions | Clear, actionable feedback for a successful capture | V2 has updated feedback instructions for users to correct their action faster. | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. | | Capture experience | Basic capture animations and user guidance | Enhanced contextual overlay and indicative ring | V2 uses an overlay around the silhouette for enhanced positioning guidance when necessary. |
          ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify. **For full details, visit the [Customization](/design-and-ux/face-capture-customization/) tab of this module.**

          --- - Path: `design-and-ux/face-match-customization` - URL: https://developer.incode.com/design-and-ux/face-match-customization/ - Markdown: https://developer.incode.com/design-and-ux/face-match-customization.md # Customization This section outlines the elements you can customize within the **Face Match** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible — such as text, brand colors, and buttons — and which elements remain fixed to ensure consistency, accessibility, and a trustworthy result presentation across platforms.
          *** ## Comparison Screen The entry screen shows the selfie and ID portrait side by side under a clear heading. Header, text, and label styling can be branded, while the two source images and their layout stay fixed so users always understand what is being compared.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------- | -------------------------- | --------- | | **Text** | Title (“Verifying identity”), Selfie/ID labels | Fully localizable | | **Brand Colors** | Logo/header tint, label and text accents | Uses brand tokens | | **Footer** | “Verified by Incode” line | Optional but recommended |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ----------- | ------------------- | | Side-by-side image layout | Ensures users understand which images are compared | | Image crop & shape | Standardized circular crops for consistency | | Text hierarchy | Optimized for readability | | WCAG minimum contrast | Mandatory |
          ### Token Reference | **UI Element** | **Token** | **Value** | | -------------- | --------- | --------- | | Background | Surface/Neutral/0 | #FFFFFF | | Logo / header | Brand/500 | #006AFF | | Title text | Text/Body/800 (Primary) | #262831 | | Label text | Text/Body/500 (Secondary) | #60667C | | Footer text | Text/Body/500 (Secondary) | #60667C |
          ### Design Notes * Keep the title short and reassuring. * Maintain a clear visual distinction between the Selfie and ID labels. * Ensure both images remain clearly visible and balanced.
          *** ## Checking Photos The processing state reassures the user while the comparison runs. The loading indicator color and supporting text can be branded; the animation behavior and timing remain fixed.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------- | -------------------------- | --------- | | **Text** | “Checking your photos”, supporting line | Fully localizable | | **Brand Colors** | Spinner / progress indicator color | Control via tokens | | **Footer** | “Verified by Incode” line | Optional |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ----------- | ------------------- | | Spinner behavior & timing | Ensures consistent feedback cadence across modules | | Layout structure | Standardized for predictability | | Minimum contrast | Required for WCAG AA |
          ### Token Reference | **UI Element** | **Token** | **Value** | | -------------- | --------- | --------- | | Spinner (arc) | Spinner/Surface/Primary | #006AFF | | Spinner (track) | Spinner/Surface/Secondary | #E5F0FF | | Title text | Text/Body/800 (Primary) | #262831 | | Supporting text | Text/Body/500 (Secondary) | #60667C | | Background | Surface/Neutral/0 | #FFFFFF |
          ### Design Notes * Keep messaging short and neutral so users feel reassured. * Do not allow interaction during this step. * Maintain consistent ring thickness to preserve visual rhythm across modules.
          *** ## Matched (Success) The success state confirms a positive match. The confirmation icon accent, success text, and the primary CTA can be branded, while the result icon shape and layout stay fixed.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------- | -------------------------- | --------- | | **Text** | “Matched!”, body text, CTA label (“Continue”) | Fully localizable | | **Buttons** | Label, color, radius | Must follow platform guidelines | | **Brand Colors** | Success icon accent, CTA color | Uses brand tokens | | **Footer** | “Verified by Incode” line | Optional |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ----------- | ------------------- | | Result icon shape | Ensures immediate recognition across modules | | Success timing | Prevents premature transitions | | Layout structure | Standardized for readability | | Minimum contrast | Required for WCAG AA |
          ### Token Reference | **UI Element** | **Token** | **Value** | | -------------- | --------- | --------- | | Success icon | Icon/Status/Positive | #189F60 | | Title text | Text/Body/800 (Primary) | #262831 | | CTA background | Button/Primary/Surface/Default | #006AFF | | CTA text | Button/Primary/Text/Default | #FFFFFF | | Background | Surface/Neutral/0 | #FFFFFF |
          ### Design Notes * Keep the confirmation message short and positive. * Ensure the success accent remains accessible and high-contrast. * “Continue” should read as the clear primary action.
          *** ## Faces Do Not Match (Error) The error state communicates a failed comparison. Text, the error icon color, and the CTA can be branded, while the error icon shape and the result behavior remain fixed.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | -------- | -------------------------- | --------- | | **Text** | Error title (“Faces do not match”), description, CTA label | Fully localizable | | **Buttons** | Label, color, radius | Keep primary hierarchy | | **Brand Colors** | Header / text accents, CTA color | Follows brand token system | | **Icons** | Icon color (error) | Only color, not shape |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ----------- | ------------------- | | Error icon shape | Ensures immediate recognition and consistency | | Error screen layout | Preserves visual predictability | | Result behavior | Must hand off to the application’s downstream logic | | Accessibility contrast | Required to meet WCAG AA |
          ### Token Reference | **UI Element** | **Token** | **Value** | | -------------- | --------- | --------- | | Error icon (circle) | Icon/Status/Negative | #E71111 | | Error icon (x-mark) | Icon/Neutral/0 | #FFFFFF | | Title text | Text/Body/800 (Primary) | #262831 | | Description text | Text/Body/500 (Secondary) | #60667C | | CTA background | Button/Primary/Surface/Default | #006AFF | | CTA text | Button/Primary/Text/Default | #FFFFFF |
          ### Design Notes * Keep error messaging clear, direct, and non-technical. * Use a meaningful error color (red) for the icon. * Always provide a clear way to continue.
          --- - Path: `design-and-ux/face-match-design` - URL: https://developer.incode.com/design-and-ux/face-match-design/ - Markdown: https://developer.incode.com/design-and-ux/face-match-design.md # Face Match Face Match confirms that the person presenting themselves is the same person shown in the identity document, by comparing the live selfie against the portrait extracted from the ID. This module typically runs right after the selfie and the ID document have been captured. It acts as the biometric link between the user and their document, returning a clear match / no-match result before the flow continues. *** ## Where it fits in the flow **Face Match** usually appears immediately after **Face Capture** and **ID Capture**, once both a selfie and an ID portrait are available. The module compares the two images and surfaces the outcome to the user. On a successful match the flow continues to downstream verification or submission; on a no-match it presents a clear error state before handing control back to the application. *** ## User Flow The **Face Match** experience is short and reassuring. The user first sees their selfie and ID portrait side by side under a clear “Verifying identity” heading, confirming which two images are being compared. The system then runs the biometric comparison while a brief processing state lets the user know their photos are being checked. Once the comparison completes, the user receives an explicit result: a success state confirming the faces matched, or an error state indicating the faces do not match. Both outcomes provide a clear next action so the user always knows how to continue.

          *** ## Full Flow Map This diagram presents the full sequence of screens involved in **Face Match**, from the side-by-side comparison and processing state through to the match and no-match outcomes.
          *** ## Happy Path (Light & Dark) The ideal journey, where the selfie and ID portrait belong to the same person and the comparison succeeds without interruption.
          *** ## Best Practices Recommended guidelines for designing and implementing the **Face Match** experience. **✅ Do** * Make it obvious which two images are being compared (Selfie vs ID). * Keep the processing state short and reassuring. * Communicate both match and no-match outcomes explicitly. * Provide a clear next action on every result screen. * Maintain high contrast and readable text across light and dark themes. **❌ Don’t** * Don’t hide or merge the two source images in a way that obscures what is being compared. * Don’t rely on color alone to communicate the match result. * Don’t skip the no-match error state. * Don’t add interaction during the processing step. --- - Path: `design-and-ux/face-match-screens-and-states` - URL: https://developer.incode.com/design-and-ux/face-match-screens-and-states/ - Markdown: https://developer.incode.com/design-and-ux/face-match-screens-and-states.md # Screens & States A complete view of all screens the user may encounter during the Face Match experience. Each state includes a brief description and a direct link to its source in Figma. **Open Full Screen and Specs in [Figma](https://www.figma.com/design/BXeJ6Q3TXahJVWEt8QoMVA/Face-Match---In-Production?node-id=18-19332)** Source of truth for layout, visual specs, interactions, and platform variations. *** ## Face Comparison Comparison screen showing the images from the ID and Selfie. It animates automatically when comparing the images to clearly communicate the step to the user.
          ## Compact Mode Face Comparison This is a configurable alternative to the Face Comparison screen. The images from the ID and Selfie are not shown, and a loader is displayed while the match is performed.
          ## Success Shown when the face match is successful. The user can proceed to the next verification step without additional input.
          ## Error Shown when the face match has resulted unsuccessful. The user may continue to the next step, depending on the configuration of the flow.
          --- - Path: `design-and-ux/face-match-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/face-match-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/face-match-specs-guidelines.md # Specs & Guidelines The **Face Match** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.

          *** ## Responsiveness & Viewport Adaptation The **Face Match** module is fully responsive and adapts to a wide range of device sizes and aspect ratios. The comparison images, result icons, instructions, and CTAs remain visible, balanced, and properly aligned across platforms.
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | ----------- | ----------------------- | ---------------- | | Comparison images | Scale proportionally; circular crops preserved | Not the crop; surrounding styling yes | | Selfie / ID labels | Reflow above each image | Text & color | | Result icon & text | Centered; scale with viewport | Color & text | | Buttons | Width adjusts to container | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | ----------- | ---------- | | Comparison layout | Users must understand which images are compared | | Image crop proportions | Consistency and recognizability | | Minimum text size | Readability & WCAG compliance | | Minimum tap target sizes | Accessibility on mobile | | Overall hierarchy | Prevents cognitive load at different sizes |

          *** ## Desktop & Tablet Guidelines The module adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions Face Match includes predefined transition rules and micro-interactions that keep the experience smooth across comparison, processing, and result states. Timing and easing are documented directly in the Figma prototypes.

          *** ## Localization The **Face Match** module supports full localization and adapts to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Buttons and CTAs automatically expand to fit translated labels. * Selfie / ID labels remain clear across languages. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable.
          --- - Path: `design-and-ux/face-match-v1-vs-v2-comparison` - URL: https://developer.incode.com/design-and-ux/face-match-v1-vs-v2-comparison/ - Markdown: https://developer.incode.com/design-and-ux/face-match-v1-vs-v2-comparison.md # Face Match V1 vs V2 Comparison
          In V1, Face Match presents a functional comparison of the selfie and ID portrait under a “Verifying photo based identity” heading, with limited branding and a result conveyed primarily through a tinted photo and a bottom status banner. In V2, Face Match keeps the same core comparison but wraps it in a cleaner, fully branded experience: an Incode header, a “verified by Incode” trust footer, a simplified “Verifying identity” title, and explicit, dedicated result screens — a green “Matched!” success with a clear **Continue** CTA, and a distinct “Faces do not match” error state.


          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences).
          | Capabilities | V1 | V2 | Notes | | ------------ | -- | -- | ----- | | Selfie vs ID comparison | ✅ | ✅ | Both versions compare the live selfie against the ID portrait. | | Match / no-match result | ✅ | ✅ | V2 presents dedicated success and error screens. | | Result confirmation | ✅ | ✅ | V1 uses a tinted photo + status banner; V2 uses a clear result icon and message. | | Brand header & trust footer | ❌ | ✅ | V2 adds the Incode logo header and “verified by Incode” footer. | | Explicit Continue CTA | ❌ | ✅ | V2 adds a primary action on result screens. | | Dedicated no-match error screen | ❌ | ✅ | V2 introduces a distinct “Faces do not match” state. | | Customization options | ❌ | ✅ | V2 allows control over text, colors, and buttons via tokens. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module presents itself and behaves across states.
          | Behavior | V1 | V2 | Notes | | -------- | -- | -- | ----- | | Heading | “Verifying photo based identity” | “Verifying identity” | V2 simplifies and lightens the title for clarity. | | Image labels | Solid dark Selfie/ID pills | Lighter outline labels | V2 reduces visual weight while keeping clarity. | | Branding | No header or footer | Incode header + “verified by Incode” footer | V2 reinforces trust and brand consistency. | | Success presentation | Tinted photo + bottom “Liveness success” banner | Green check + “Matched!” + Continue CTA | V2 makes the outcome and next step explicit. | | No-match handling | Limited / implicit | Dedicated “Faces do not match” screen with CTA | V2 communicates failure clearly and guides the user forward. |
          ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of isolated options per screen, V2 uses a unified token-based system that controls visuals and behavior with fewer parameters and predictable outcomes. This means less engineering work, consistent branding across modules, and reduced risk of breaking flows. **For full details, visit the [Customization](/design-and-ux/face-match-customization/) tab of this module.**

          --- - Path: `design-and-ux/fiscal-qr-ocr-customization` - URL: https://developer.incode.com/design-and-ux/fiscal-qr-ocr-customization/ - Markdown: https://developer.incode.com/design-and-ux/fiscal-qr-ocr-customization.md # Customization This section outlines the elements you can customize within the **Fiscal QR OCR** module to match your brand while preserving Incode's core UX. It clarifies which areas are flexible, such as text, scanning frame colors, and brand colors, and which elements remain fixed to ensure consistency, accessibility, and reliable QR detection logic across platforms.
          ## Tutorial Screen This screen prepares the user for the QR scanning step. It displays a dedicated illustration of a fiscal QR code and provides instructions on how to position the document before proceeding.
          ### Customizable Elements | Area | What can be customized | Notes | | ------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------- | | **Title text** | Screen title ("Zoom the QR code inside the frame") | Fully localizable; should remain clear and action-oriented. | | **Subtitle text** | Supporting instruction ("QR will be scanned automatically") | Tone can match your brand voice; should remain informative. | | **QR illustration** | Fiscal QR code illustration | Can be recolored using brand tokens. | | **QR frame border color** | Illustration frame stroke | Uses brand tokens. | | **Button** | Label, color, radius | Must follow platform guidelines. | | **Background Color** | Screen background | Must maintain strong contrast with text and elements. | | **Brand Colors** | Header text, accent color | Uses brand tokens. | | **Footer** | "Verified by Incode" line | Optional but recommended for trust and product consistency. |

          ### Fixed Elements | Element | Why it is fixed | | ---------------------------------- | ------------------------------------------------------------ | | **QR detection logic** | Must remain consistent for accurate fiscal QR code scanning. | | **Component spacing & safe areas** | Required for device compatibility and visual stability. | | **Text hierarchy** | Optimized to communicate requirements clearly. | | **WCAG contrast requirements** | Mandatory for accessibility and regulatory compliance. |

          ### Token Refearence | UI Element | Token | Value | | --------------------- | --------------------------------------------------------------------------- | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Subtitle text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **QR frame border** | Border Status Focus → Color/Brand/500 | #006AFF | | **Button background** | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Button text** | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Footer text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Footer icon** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Close icon** | Icon/Neutral/0 Static → Color/Gray/0 | #FFFFFF |
          ### Design Notes - Keep the instruction text concise and specific — users should immediately understand what type of document and QR code is expected. - The QR code illustration should reinforce what the user needs to locate on their document before proceeding. - Ensure tap targets meet accessibility guidelines.
          *** ## Ready to Scan This screen appears when the camera is active and the module is waiting for the user to align a fiscal QR code within the scanning frame. The frame is in its neutral/searching state.
          ### Customizable Elements | Area | What can be customized | Notes | | --------------- | --------------------------------------------------- | ----------------------------------------------------------------- | | **Title text** | Scanning instruction ("Align QR code in the frame") | Fully localizable; should remain clear and action-oriented. | | **Skip button** | Label, color | Action should allow the user to exit the scanning flow if needed. | | **Background** | Camera view overlay | Dark background is standard for camera screens. |
          ### Fixed Elements | Element | Why it is fixed | | ------------------------------------- | -------------------------------------------------------------------------------------------------- | | **Camera view** | Live camera feed required for QR code detection. | | **Scanning frame shape and position** | Required for accurate QR code alignment and detection. | | **Frame color states** | Blue = searching, green = detected, red = error. Logic is fixed; colors can be updated via tokens. | | **QR detection logic** | Must remain consistent for accurate fiscal QR code scanning. | | **Spacing & safe areas** | Required for device consistency. |
          ### Token Reference | UI Element | Token | Value | | -------------------- | --------------------------------- | ------- | | **Title text** | Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Skip button text** | Text/Body/0 Static → Color/Gray/0 | #FFFFFF |
          ### Design Notes - Keep messaging short and reassuring; users should feel confident before proceeding. - The green checkmark and clean layout reinforce the positive outcome without additional explanation needed. - Background should remain clean to keep focus on the confirmation.
          *** ## Scanning - QR Detected This state is shown automatically when the camera successfully detects a fiscal QR code within the scanning frame. The frame border transitions to green to communicate that detection was successful and data extraction is in progress.
          ### Customizable Elements | Area | What can be customized | Notes | | --------------------------------------- | ------------------------------------ | ----------------------------------- | | **Title text** | Scanning instruction text | Fully localizable. | | **Skip button** | Label, color | Remains available during detection. | | **Frame border color (detected state)** | Green border on successful detection | Uses positive status token. |

          ### Fixed Elements | Element | Why it is fixed | | ------------------------ | --------------------------------------------------------------------------------------------- | | **Detection trigger** | Frame color changes automatically upon successful QR detection; cannot be manually triggered. | | **Status color mapping** | Green = detected/success; required for consistent user feedback. | | **QR detection logic** | Must remain consistent for accurate data extraction. |
          ### Token Reference | UI Element | Token | Value | | --------------------------- | -------------------------------------------------- | ------- | | **Title text** | Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Frame border (detected)** | Border Status Positive Static → Color/Positive/500 | #189F60 | | **Skip button text** | Text/Body/0 Static → Color/Gray/0 | #FFFFFF |
          ### Design Notes - The green frame transition happens automatically — no additional UI elements or animations should be added to this state. - Keep the interface clean to allow users to focus on holding the document steady while data is being extracted.ity.
          *** ## Error — Invalid QR Code Shown inline within the scanning screen when the detected QR code does not correspond to a valid fiscal document. The frame border changes to red and an error message appears below the frame, allowing the user to reposition and retry without leaving the screen.
          ### Customizable Elements | Area | What can be customized | Notes | | ------------------------------------ | ------------------------------------------------ | ---------------------------------------------------------- | | **Title text** | Scanning instruction text | Fully localizable. | | **Inline error message text** | Error feedback ("Invalid QR scanned, try again") | Fully localizable; tone should be neutral and instructive. | | **Frame border color (error state)** | Red border on invalid detection | Uses negative status token. | | **Skip button** | Label, color | Action remains available to exit the flow. |

          ### Fixed Elements | Element | Why it is fixed | | -------------------------- | ------------------------------------------------------------- | | **Error logic** | Must accurately reflect the QR validation result. | | **Status color mapping** | Red = negative/invalid; required for clarity and consistency. | | **Inline error placement** | Positioned directly below the frame for clear attribution. |
          ### Token Reference | UI Element | Token | Value | | ------------------------ | ------------------------------------------- | ------- | | **Title text** | Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Frame border (error)** | Border Status Negative → Color/Negative/500 | #E71111 | | **Inline error text** | Text/Status/Negative → Color/Negative/500 | #E71111 | | **Skip button text** | Text/Body/0 Static → Color/Gray/0 | #FFFFFF |
          ### Design Notes - Error messaging should be clear, direct, and action-oriented — users should understand they need to try a different QR code without feeling blamed. - The red frame provides immediate visual feedback; pair it with the inline text to ensure accessibility.
          *** ## Error — Link Expired Shown as a full-screen state when the onboarding session link the user is trying to access has expired. The user is informed of the issue and prompted to request a new link to continue the process.
          ### Customizable Elements | Area | What can be customized | Notes | | -------------------- | ----------------------------------- | ---------------------------------------------------------- | | **Title text** | Error message ("Your link expired") | Fully localizable; tone should be neutral and non-blaming. | | **Subtitle text** | Supporting detail | Fully localizable. | | **Status icon** | Error indicator | Can be replaced; must remain clearly negative. | | **Background color** | Full screen | Must support strong contrast. |

          ### Fixed Elements | Element | Why it is fixed | | ------------------------ | -------------------------------------------------------------- | | **Session expiry logic** | Must accurately reflect the session state; cannot be bypassed. | | **Status color mapping** | Red = negative; required for clarity and consistency. | | **Title hierarchy** | Emphasizes the issue clearly. |
          ### Token Reference | UI Element | Token | Value | | -------------------------- | ------------------------------------------ | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Subtitle text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Status icon background** | Icon/Status/Negative → Color/Negative/500 | #E71111 | | **Status icon (X mark)** | Icon/Neutral/0 → Color/Gray/0 | #FFFFFF |
          ### Design Notes - Messaging should be clear and guide the user toward a concrete next step — requesting a new link. - Avoid technical language; the user should understand the issue immediately. - Maintain consistent spacing and visual hierarchy for readability.
          --- - Path: `design-and-ux/fiscal-qr-ocr-design` - URL: https://developer.incode.com/design-and-ux/fiscal-qr-ocr-design/ - Markdown: https://developer.incode.com/design-and-ux/fiscal-qr-ocr-design.md # Fiscal QR OCR F**iscal QR OCR** guides the user through scanning a fiscal QR code from a supported document. Once the code is detected, the module extracts the corresponding URL, retrieves the associated fiscal data, and makes it available for downstream processing as part of the verification flow. **Fiscal QR OCR** typically occurs during the document verification step, as a complementary or standalone module to capture fiscal information encoded in QR format. ![](https://developer.incode.com/assets/b70338ce838e672966a209db62bbad2f.gif)
          *** ## Where it fits in the flow **Fiscal QR OCR **usually appears during the document verification step, either as a standalone module or alongside other capture steps. Once the QR code is successfully scanned and the fiscal data is extracted, the flow continues to the next verification step or presents the final result, depending on the outcome and the downstream logic configured in the application. *** ## User Flow The **Fiscal QR OCR** experience is designed to be clear and guided. The user is introduced to the scanning step through an intro screen, then directed to align the fiscal QR code within the scanning frame. The module detects and decodes the code automatically — a blue frame indicates the camera is actively searching, while a green frame confirms the code has been detected and data extraction is underway. Once the scan is complete, the user receives a success state or an error message and the flow continues accordingly.

          *** ## Full Flow Map This diagram presents the full sequence of screens involved in Fiscal QR OCR, from the intro screen and active scanning state, through detection feedback, to the success and error outcomes.

          *** ## Happy Path (Light & Dark) The ideal user journey when the fiscal QR code is successfully detected and data is extracted with no interruptions. The happy path represents the smoothest version of the experience, where the user aligns the QR code correctly within the frame, the module detects and decodes it automatically, and the fiscal data is extracted without errors or retries. Both light and dark mode previews are included so teams can validate visual consistency across themes.

          *** ## Best Practices Recommended guidelines for designing and implementing the Government Record Verification experience. **✅ Do** - Keep the intro screen copy clear about what type of document and QR code is expected. - Use the scanning frame color states to communicate detection progress — blue for searching, green for detected. - Provide clear inline error feedback when an invalid QR code is scanned, so the user can retry without leaving the screen. - Keep the scanning interface clean and distraction-free to help users position the QR code correctly. - Use the "verified by Incode" footer to maintain trust throughout the flow. **❌ Don’t** - Don't remove or skip the intro screen — users need to understand what document and QR code they are expected to scan. - Don't rely solely on color to communicate scanning status; pair color changes with instructional text where possible. - Don't remove error states — inline feedback for invalid QR codes and session-level errors must remain intact, as they correspond to specific detection logic. - Don't add UI elements over the scanning frame that could obstruct the user's view of the QR code.
          --- - Path: `design-and-ux/fiscal-qr-ocr-screens-states` - URL: https://developer.incode.com/design-and-ux/fiscal-qr-ocr-screens-states/ - Markdown: https://developer.incode.com/design-and-ux/fiscal-qr-ocr-screens-states.md # Screens & States A complete view of all screens the user may encounter during the **Fiscal QR OCR** experience. Each state includes a brief description and a direct link to its source in Figma. *** ## Intro Screen This screen appears at the beginning of the Fiscal QR OCR flow and prepares the user for the scanning step. It displays a dedicated illustration of a fiscal QR code and provides instructions on how to position the document for scanning. The user taps Continue to proceed to the active scanning screen.
          ## Read to Scan This screen appears when the camera is active and the module is ready to detect a fiscal QR code. The scanning frame is displayed with positioning guidance to help the user align the QR code correctly. At this state, the frame is neutral — the module is initialized but has not yet detected a code.
          ## Scanning - QR Detected This state is shown when the camera detects a fiscal QR code within the frame. The scanning frame border changes from its neutral state to green, indicating that the code has been successfully detected and data extraction is underway. The transition happens automatically without user action.
          ## Verifying Shown immediately after a successful QR code detection, while the module retrieves the corresponding URL and processes the extracted fiscal data. A loading spinner and a status message keep the user informed while the operation completes in the background.
          --- - Path: `design-and-ux/fiscal-qr-ocr-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/fiscal-qr-ocr-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/fiscal-qr-ocr-specs-guidelines.md # Specs & Guidelines The **Fiscal QR OCR** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.

          *** ## Responsiveness & Viewport Adaptation The **Fiscal QR OCR** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet. The active scanning screen uses the full device viewport to maximize the camera view and scanning frame visibility.
          ### How the layout adapts across devices | Breakpoint | Behavior | | ---------------------------------- | --------------------------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; scanning frame scales to maintain usable detection area. | | **Standard phones (iPhone 12–16)** | Full layout shown; scanning frame and text hierarchy remain consistent. | | **Tall/narrow Android devices** | Vertical spacing is redistributed; scanning frame remains centered and properly proportioned. | | **Foldables (e.g., Pixel Fold)** | Larger scanning area with more balanced white space; content remains centered. | | **Tablets** | Increased layout margins; scanning frame and intro screen content scale proportionally. | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding applied. |
          ### What is responsive (and customizable) | Element | Responsive Behavior | Customizable | | --------------------------- | --------------------------------------------------------- | ------------------------------ | | **Scanning frame** | Scales proportionally by viewport; remains centered | Frame border color only | | **Title text** | Remains centered and adapts to container width | Yes, text is fully localizable | | **Subtitle text** | Wraps gracefully for longer translations | Yes, text is fully localizable | | **Skip button** | Pinned to bottom of the scanning screen | Label and color | | **QR illustration (intro)** | Scales proportionally within the intro layout | Color & style | | **Continue button** | Width adjusts to container | Color & text | | **Footer / watermark** | Pinned to bottom safe area | Optional | | **Background surfaces** | Expand to full viewport | Yes | | **Error message (inline)** | Positioned directly below the scanning frame at all sizes | Color & text |
          ### What remains fixed across breakpoints | Element | Reason | | ---------------------------- | ------------------------------------------------------------------------------------------------------- | | **QR detection logic** | Must remain consistent for accurate fiscal QR code scanning and data extraction. | | **Scanning frame position** | Required for reliable QR code alignment and detection across all devices. | | **Frame color state logic** | Blue = searching, green = detected, red = error. Logic is fixed; only colors can be updated via tokens. | | **Minimum text size** | Required for readability & WCAG compliance. | | **Minimum tap target sizes** | Ensures accessibility on mobile. | | **Overall hierarchy** | Prevents cognitive load at different sizes. |
          ### Design Notes - The scanning frame always remains the dominant UI element during the active scanning state, regardless of screen size. - Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. - Avoid adding custom UI elements over the camera view — they may obstruct the user's view of the QR code and affect detection accuracy. - Multiline text is handled gracefully, but keep localized strings concise for scanning instructions and error messages.

          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions Fiscal QR OCR includes predefined transition rules and micro-interactions that ensure a smooth user experience from the intro screen and active scanning state, through the QR detection feedback, to the verifying and error outcomes. Timing, easing, and animation guidelines are documented directly in Figma prototypes.

          *** ## Localization The **Fiscal QR OCR** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** - All user-facing text is fully localizable, including the intro screen title and subtitle, scanning instructions, inline error messages, and session-level error messages. - UI adjusts to prevent truncation and maintain readability. - Spacing and vertical rhythm adapt to accommodate longer languages. - Scanning instruction text must remain concise regardless of language — long strings on the camera screen can distract from the scanning task. - Inline error messages should be localized carefully to remain clear and action-oriented in each supported language. - Ensure localized strings preserve clarity and follow regulatory requirements when applicable.
          Incode supports a variety of languages.
          --- - Path: `design-and-ux/fiscal-qr-ocr-v1-vs-v2-comparison` - URL: https://developer.incode.com/design-and-ux/fiscal-qr-ocr-v1-vs-v2-comparison/ - Markdown: https://developer.incode.com/design-and-ux/fiscal-qr-ocr-v1-vs-v2-comparison.md # Fiscal QR OCR V1 vs V2 Comparison In V1, Fiscal QR OCR offers a basic scanning experience with minimal user guidance, no dedicated intro screen with contextual illustrations, and limited customization options. The scanning flow runs with standard camera behavior and generic feedback states. In V2, Fiscal QR OCR delivers a significantly improved experience with a dedicated intro screen, context-specific QR illustrations, live scanning feedback through frame color states, inline error handling, and full alignment with the token-based design system — resulting in a clearer, more guided, and more brandable flow.

          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | -------------------------- | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | QR code scanning | ✅ | ✅ | Both versions scan and decode fiscal QR codes automatically when the code is detected. | | Error states | ✅ | ✅ | Both versions cover general error cases that users can encounter. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime.
          | Behavior | V1 | V2 | Notes | | ------------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | Tutorial behavior | Basic visual of standard QR code layout | Dedicated intro screen with a fiscal QR illustration providing context specific to the document | V2 is intuitive and directs the user's focus toward the scanning instructions with a more relevant visual reference. | | Scanning experience | Native camera experience | Custom camera view with a QR targeting frame, live detection feedback, and inline error hints | V2 uses a custom scanning experience with instruction text, a color-coded positioning frame, and inline error messaging. | | Detection feedback | No live feedback during scanning | Real-time frame color state indicating whether a QR code is being searched for, found, or rejected | V2 actively communicates scanning progress so users understand what the module is doing at each moment. | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. |
          *** ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: - Less engineering work to override UI elements - Consistent branding across modules - Predictable behavior when changing settings - Reduced risk of breaking flows - Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify. This includes the QR illustration color, scanning frame border color states, button styles, instructional text, and error message styling — making it straightforward to align the module with your brand without affecting core scanning and detection logic.

          --- - Path: `design-and-ux/forms-and-data-entry-design` - URL: https://developer.incode.com/design-and-ux/forms-and-data-entry-design/ - Markdown: https://developer.incode.com/design-and-ux/forms-and-data-entry-design.md # Forms and Data Entry **Forms and data entry** is a key step in onboarding and identity verification workflows. It presents users with a set of configurable input fields to capture essential personal information — such as ID number, email address, country of residence, and date of birth — before proceeding to document capture or biometric verification.. *** ## Where it fits in the flow **Forms and Data Entry** is typically positioned at the beginning of an onboarding or identity verification flow, before document capture and biometric checks are performed, depending on the configured workflow.. *** ## User Flow The **Forms and Data Entry** experience guides users through a set of configurable input fields, inline validation feedback, and a final submission confirmation..
          *** ## Full Flow Map
          *** ## Happy Path (Light & Dark) The ideal user journey occurs when the user fills in all required fields correctly, without needing to correct any errors, and completes submission on the first attempt. The **happy path** represents the smoothest version of the experience: the user opens the form, enters their ID number, email, country of residence, and date of birth, taps "Continue," and the system processes and confirms the submission. The user reaches the next step on the first attempt without encountering any validation errors or incomplete fields. Light and dark mode previews are included to allow teams to validate visual consistency, accessibility, and contrast across themes and platforms.
          *** ## Best Practices Recommended guidelines for designing and implementing the **Forms and data entry** ✅ Do * Clearly indicate required and optional fields so users understand what information is needed before submission. * Provide immediate visual feedback during submission — display a loading state, disable inputs, and prevent duplicate submissions while processing. ❌ Don't * Don’t allow users to continue unless all required fields are completed and valid. * Don’t use inconsistent field formats, spacing, or interaction patterns across the form experience. --- - Path: `design-and-ux/geolocation-customization` - URL: https://developer.incode.com/design-and-ux/geolocation-customization/ - Markdown: https://developer.incode.com/design-and-ux/geolocation-customization.md # Customization This section outlines the elements you can customize within the **Geolocation** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms. ## Geo Not Determined Screen This screen appears when the module first requests permission to access the user's current location. It’s the initial state, shown before any user action.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :---------------------------------- | :-------------------------------------------------- | | **Text** | Title, subtitle, button label | Fully localizable; tone can be adapted | | **Illustration** | Colors or full replacement | Must represent a map/location theme | | **Brand Colors** | Illustration accent, button, header | Uses brand tokens | | **Buttons** | Label, color | Must follow platform and WCAG standards | | **Footer** | “Verified by Incode” text | Optional but recommended for transparency and trust |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :------------------------------------------------ | | Layout structure | Ensures consistency across onboarding modules | | Illustration style | Must remain consistent with location flow visuals | | Spacing & safe areas | Required for device compatibility | | Text hierarchy | Optimized for readability | | Close icon position | Standardized for user familiarity | | WCAG minimum contrast | Mandatory for accessibility compliance |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :---------------- | :------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | Background | `surface-neutral-0` | `#FFFFFF` | | Button background | `button-primary-surface-default` | `#006AFF` | | Button text | `button-primary-text-default` | `#FFFFFF` |
          ### Design Notes * Keep copy short to minimize cognitive load. * The illustration establishes the concept of location with neutral tones to maintain focus on the button. * The “verified by Incode” footer reinforces authenticity subtly, maintaining accessibility contrast. *** ## Allow Location Access Screen – Native Displayed on native platforms when the user denies access to location. It guides them to grant permission manually via device settings or skip the step.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :----------------------------------------------------------------- | :----------------------------------------------- | | **Text** | Title, subtitle, button labels (“Open settings”, “Skip this step”) | Fully localizable | | **Icons** | Warning icon color | Must preserve meaning and accessibility contrast | | **Brand Colors** | Buttons, links, highlight elements | Uses brand tokens | | **Buttons** | Label, color | Must follow platform and WCAG standards |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :------------------------- | :--------------------------------------------- | | Layout structure | Maintains visual continuity with other modules | | Warning icon shape | Represents universal alert pattern | | Button spacing & placement | Optimized for tap targets | | Text hierarchy | Follows global UX standards | | Close icon position | Consistent across modules | | WCAG minimum contrast | Required for readability and compliance |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :------------------------------------------ | :-------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | Subtitle text | `text-body-secondary` | `#60667C` | | Warning icon | `icon-status-warning` | `#FF9900` | | Background | `surface-neutral-0` | `#FFFFFF` | | Primary button background (“Open settings”) | `button-primary-surface-default` | `#006AFF` | | Primary button text | `button-primary-text-default` | `#FFFFFF` | | Secondary button border (“Skip this step”) | `button-secondary-border-default` | `#006AFF` | | Secondary button text | `text-accent-brand` | `#006AFF` |
          ### Design Notes * The layout mirrors other SDK modules for predictable UX and user familiarity. * Maintain a clear hierarchy between primary and secondary actions. * The warning icon (icon-status-warning) provides immediate visual feedback but remains minimal to avoid alarm.
          *** ## Allow Location Access Screen – Web This screen provides detailed, step-by-step instructions to enable location permissions in browser settings (for web flows).
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :------------------- | :--------------------------------------------------- | :------------------------------------------------- | | **Instruction Text** | Steps and phrasing (“...tap Chrome”, “Tap Location”) | Fully localizable; must remain short and effective | | **Icons** | Colors, style, or illustration replacement | Must clearly indicate action steps | | **Brand Colors** | Buttons and highlights | Uses brand tokens | | **Buttons** | Label and color (“Refresh page”, “Skip this step”) | Must follow platform and WCAG standards |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :---------------------------------------- | | Layout structure | Keeps parity between web and native flows | | Step order | Required for browser permission accuracy | | Text hierarchy | Ensures clarity of instructions | | Button placement | Optimized for quick completion | | WCAG minimum contrast | Required for web accessibility standards |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :------------------------------------------------- | :-------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | Instruction text | `text-body-primary` | `#262831` | | Highlighted text (“Chrome”, “While using the app”) | `text-body-secondary` | `#60667C` | | Background | `surface-neutral-0` | `#FFFFFF` | | Primary button background (“Refresh page”) | `button-primary-surface-default` | `#006AFF` | | Primary button text | `button-primary-text-default` | `#FFFFFF` | | Secondary button border (“Skip this step”) | `button-secondary-border-default` | `#006AFF` | | Secondary button text | `text-accent-brand` | `#006AFF` |
          ### Design Notes * This screen is tailored for browser-based flows where system permissions differ from native. * Highlighted phrases (“Chrome”, “While using the app”) use text-body-secondary for emphasis while preserving scanability. * Layout presents a step-by-step visual hierarchy: clear numbered or iconographic instructions with consistent vertical spacing. * Visual rhythm relies on consistent spacing between icon + text pairs for each instruction row. * Minimal use of color outside the brand blue keeps the attention on interactive elements and icons.
          *** ## Geo Determined Screen Shown once the system successfully determines the user’s location. It confirms the current detected city and country before proceeding to the next step.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :------------------------------------------------- | :--------------------------------------------------------------- | | **Text** | Title (“You are currently in:”), button label | Fully localizable | | **Illustration** | Colors or full replacement | Must clearly represent location confirmation | | **Brand Colors** | Illustration accent, button background, highlights | Uses brand tokens | | **Buttons** | Label and color | Must follow platform and WCAG standards | | **Footer** | “Verified by Incode” text | Optional but recommended for consistency, transparency and trust |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :---------------------------------------------------- | | Layout structure | Maintains consistency with other verification modules | | Spacing & alignment | Optimized for layout consistency | | Text hierarchy | Required for readability and hierarchy | | Close icon position | Standardized for familiarity | | WCAG minimum contrast | Required for web accessibility standards |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :---------------------------- | :------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | Subtitle text (location name) | `text-body-secondary` | `#60667C` | | Background | `surface-neutral-0` | `#FFFFFF` | | Button background | `button-primary-surface-default` | `#006AFF` | | Button text | `button-primary-text-default` | `#FFFFFF` |
          ### Design Notes * Represents the confirmation state — a positive closure before transition to the next module. * The Continue button keeps the same placement and styling as in the initial screen for consistency. * The location pin illustration reinforces successful completion using brand color for recognition and continuity. --- - Path: `design-and-ux/geolocation-design` - URL: https://developer.incode.com/design-and-ux/geolocation-design/ - Markdown: https://developer.incode.com/design-and-ux/geolocation-design.md # Geolocation The Geolocation module determines the user's current location through browser or device permissions. It is used to verify the user's geographical position as part of identity validation or compliance workflows. *** ## Where it fits in the flow **Geolocation** usually appears before ID and Selfie Capture. After the user’s location is confirmed, the flow continues to biometric or document verification steps depending on the configured process. *** ## User Flow The **Geolocation** experience guides the user from permission to confirmation. After granting access, the system detects the user’s current location and displays a confirmation screen with the detected city or region. If detection fails or permission is denied, fallback paths guide the user to adjust their settings or skip the step (if option to skip is enabled via configuration settings). Once access is restored, the user can retry detection or continue to the next module.
          *** ## Full Flow Map This diagram presents the full sequence of screens involved in the Geolocation module, from initial screen and location permission handling to successful location detection, fallback paths for denied permissions, and final confirmation. It visually represents both the ideal and alternative user journeys, helping teams understand all possible user interactions and system states within the module.
          *** ## Happy Path (Light & Dark) The ideal user journey when the geolocation is detected successfully with no interruptions. The happy path represents the smoothest version of the experience, where the user grants location access, the system accurately detects their current position, and the flow proceeds automatically without requiring manual retries or permission troubleshooting. Both light and dark mode previews are included so design, product, and engineering teams can validate visual consistency and accessibility across themes. Geolocation module - Happy Path in Light mode Geolocation module - Happy Path in Dark mode
          *** ## Best Practices Recommended guidelines for designing and implementing the **Geolocation** experience. **✅ Do** * Explain why location data is requested — transparency builds trust. * Offer a visible “Skip this step” option if location isn’t mandatory. * Localize all geographic messages and region names. **❌ Don’t** * Don’t block progress indefinitely if the user denies permission. * Avoid long delays. --- - Path: `design-and-ux/geolocation-screens-states` - URL: https://developer.incode.com/design-and-ux/geolocation-screens-states/ - Markdown: https://developer.incode.com/design-and-ux/geolocation-screens-states.md # Screens & States A complete view of all screens the user may encounter during the Geolocation experience. Each state includes a brief description. *** ## Geo not determined This screen requests permission to access the user’s current location. It is the initial state of the Geolocation step, appearing before any user action is taken.

          ## Allow location access - Native and Web This screen appears if user rejects location access when the system prompts the user to enable location it. It guides the user to grant permission manually or skip the step if desired.

          ## Geo Determined Displayed after the user grants permission. The system fetches and confirms the current location before moving to the next step.
          --- - Path: `design-and-ux/geolocation-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/geolocation-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/geolocation-specs-guidelines.md # Specs & Guidelines The **Geolocation** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.
          *** ## Responsiveness & Viewport Adaptation The **Geolocation** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet. This ensures that key interactive areas, such as CTAs, remain visible, accessible, and consistently aligned across platforms.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | :--------------------------------- | :------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | Content stacks vertically; map or location icon scales down for visibility | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing adapts to maintain balance | | **Foldables (e.g., Pixel Fold)** | Map illustration expands; centered layout with even white space | | **Tablets** | Wider margins and proportional scaling of map and text | | **Desktop web** | Centered content with max-width constraint and safe-area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | :------------------ | :------------------------------------------------- | :--------------------- | | Map / Illustration | Scales with viewport; adapts to portrait/landscape | Color and style only | | Instruction text | Reflows to one or two lines depending on width | Yes, fully localizable | | Buttons | Width adjusts to container, spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Adjusts padding per device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | :----------------------- | :----------------------------------------- | | Location detection logic | Must remain consistent for accuracy | | Icon proportions | Maintain visual clarity and recognition | | Minimum text size | Ensures readability & WCAG compliance | | Minimum tap target sizes | Accessibility requirement on mobile | | Layout hierarchy | Keeps experience consistent across devices |
          ### Design Notes * The location icon or map remains the visual focal point across all devices. * Vertical spacing uses fixed-safe thresholds; horizontal layout is fluid. * Avoid adding custom elements above or below the module to maintain alignment. * Text reflows smoothly for localization, but long strings should be avoided for clarity.
          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.
          *** ## Prototype & Transitions Geolocation includes predefined transition rules and micro-interactions that ensure a smooth user experience. Animation guidelines are documented directly in Figma prototypes.
          *** ## Localization The **Geolocation** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          ### Key considerations * Incode supports a variety of languages. * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Buttons and CTAs automatically expand to fit translated labels. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable.
          --- - Path: `design-and-ux/geolocation-v1-vs-v2-comparison` - URL: https://developer.incode.com/design-and-ux/geolocation-v1-vs-v2-comparison/ - Markdown: https://developer.incode.com/design-and-ux/geolocation-v1-vs-v2-comparison.md # Geolocation V1 vs V2 Comparison V1 provides a functional geolocation experience that supports the required validation logic. However, the flow is rigid and offers limited flexibility to adapt to different products, markets or branding needs, which can lead to inconsistencies and higher user friction. V2 redesigns the geolocation flow to be clearer, more flexible and design-system-aligned. Built on a token-based approach, it enables consistent experiences across platforms while allowing customization, helping reduce user confusion and drop-off during verification.

          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences).
          | Capabilities | V1 | V2 | Notes | | -------------------------- | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | Location detection | ✅ | ✅ | Core geolocation functionality unchanged. | | Permission handling | ✅ | ✅ | V2 supports configurable permission handling and clearer user messaging. | | Error States | ✅ | ✅ | Both versions handle common geolocation and permission error scenarios. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime.
          | Behavior | V1 | V2 | Notes | | --------------------- | -------------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------ | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. | | Flow and UI structure | Functional but less standardized | Structure and consistent | Aligned with the tokenized design system architecture. |
          ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.


          --- - Path: `design-and-ux/government-record-verification-customization` - URL: https://developer.incode.com/design-and-ux/government-record-verification-customization/ - Markdown: https://developer.incode.com/design-and-ux/government-record-verification-customization.md # Customization This section outlines the elements you can customize within the **Government Record Verification** module to match your brand while preserving Incode's core UX. It clarifies which areas are flexible, such as text and brand colors, and which elements remain fixed to ensure consistency, accessibility, and reliable verification logic across platforms.
          ## Government Record Verification This screen appears while the module runs a background check against the corresponding government entity records. A spinner and status message keep the user informed while the operation completes.
          ### Customizable Elements | Area | What can be customized | Notes | | ---------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | | **Title text** | Loading message ("Hold on a sec..") | Fully localizable; should remain concise. | | **Subtitle text** | Supporting message ("Checking your information with the government records") | Tone can match your brand voice; should reference the government check for transparency. | | **Spinner accent color** | Primary spinner stroke | Uses brand tokens; must remain visually clear. | | **Spinner background color** | Secondary spinner stroke | Should maintain contrast with accent. | | **Background Color** | Screen background | Must preserve readability and contrast. | | **Footer** | "Verified by Incode + Government" line | Optional but strongly recommended for trust and transparency. |

          ### Fixed Elements | Element | Why it is fixed | | --------------------------- | ----------------------------------------------------------------- | | **Verification logic** | Must remain consistent for accurate government record comparison. | | **Processing flow timing** | Linked to backend processing; cannot be shortened or skipped. | | **Spinner animation style** | Standardized across SDK for performance and recognizability. | | **Spacing & safe areas** | Required for device consistency. | | **Minimum contrast** | Required for accessibility and compliance. |

          ### Token Refearence | UI Element | Token | Value | | ------------------------- | -------------------------------------------------------------------- | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Spinner background** | Spinner/Surface/Secondary → Surface/Brand/50 → Color/Brand/50 | #E5F0FF | | **Spinner accent** | Spinner/Surface/Primary → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Title text** | Spinner/Text/Title → Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Subtitle text** | Spinner/Text/Subtitle → Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Footer brand text** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Footer secondary text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Footer icon** | Icon/Neutral/0 Static → Color/Gray/0 | #FFFFFF |
          ### Design Notes - Keep copy short and specific — users should understand verification is actively happening against government records. - The subtitle must reference the government records source to build trust and reduce uncertainty during the wait. - Avoid adding imagery or additional UI elements that may distract from the verification state.
          *** ## Success Screen Shown when the identity data has been successfully matched against the government records, confirming that verification passed. The user receives a clear visual confirmation before the flow continues to the next step.
          ### Customizable Elements | Area | What can be customized | Notes | | -------------------- | -------------------------------------- | ------------------------------------------------------------------- | | **Title text** | Success message ("Identity verified!") | Fully localizable. | | **Status icon** | Green checkmark | Can replace with custom success icon; must remain clearly positive. | | **Background color** | Full-screen background | Keep high contrast with icon and text. | | **Footer** | "Verified by Incode + Government" line | Optional but strongly recommended. |
          ### Fixed Elements | Element | Why it is fixed | | ------------------------ | ----------------------------------------------------- | | **Verification logic** | Must reflect actual backend result; not customizable. | | **Status color mapping** | Green = positive; required for consistent semantics. | | **Icon placement** | Ensures clarity and recognition. |
          ### Token Reference | UI Element | Token | Value | | --------------------------- | ------------------------------------------ | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Status icon background** | Icon/Status/Positive → Color/Positive/500 | #189F60 | | **Status icon (checkmark)** | Icon/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Footer brand text** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Footer secondary text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Footer icon** | Icon/Neutral/0 Static → Color/Gray/0 | #FFFFFF |
          ### Design Notes - Keep messaging short and reassuring; users should feel confident before proceeding. - The green checkmark and clean layout reinforce the positive outcome without additional explanation needed. - Background should remain clean to keep focus on the confirmation.
          *** ## Error Shown when no matching record is found for the provided identity data in the government registry. The user is informed with a clear error message and the flow cannot continue until the issue is addressed.
          ### Customizable Elements | Area | What can be customized | Notes | | -------------------- | -------------------------------------- | ---------------------------------------------------------- | | **Title text** | Error message ("User not found") | Fully localizable; tone should be neutral and non-blaming. | | **Status icon** | Error indicator | Can be replaced; must remain clearly negative. | | **Background color** | Full screen | Must support strong contrast. | | **Footer** | "Verified by Incode + Government" line | Optional but recommended. |

          ### Fixed Elements | Element | Why it is fixed | | ------------------------ | ------------------------------------------------------------ | | **Error logic** | Must accurately reflect the government record lookup result. | | **Status color mapping** | Red = negative; required for clarity and consistency. | | **Title hierarchy** | Emphasizes the issue clearly. |
          ### Token Reference | UI Element | Token | Value | | -------------------------- | ------------------------------------------ | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Status icon background** | Icon/Status/Negative → Color/Negative/500 | #E71111 | | **Status icon (X mark)** | Icon/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Footer brand text** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Footer secondary text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Footer icon** | Icon/Neutral/0 Static → Color/Gray/0 | #FFFFFF |
          ### Design Notes - Error messaging should be clear, direct, and action-oriented without technical language. - Users should understand the issue at a glance and know what to do next. - Maintain consistent spacing and visual hierarchy for readability.

          --- - Path: `design-and-ux/government-record-verification-design` - URL: https://developer.incode.com/design-and-ux/government-record-verification-design/ - Markdown: https://developer.incode.com/design-and-ux/government-record-verification-design.md # Government Record Verification **Government Record Verification** automatically compares the identity data extracted from the user's document against the records held by the corresponding government entity — such as the INE in Mexico or the Registraduría in Colombia. The verification runs in the background and presents the user with a clear outcome once the check is complete. **Government Record Verification** typically occurs after the document capture or upload step, once identity data has been extracted and is ready to be validated against the official government source. ![](https://developer.incode.com/assets/9098cf7157242883e8e8307782412e7b.gif)
          *** ## Where it fits in the flow Government Record Verification usually appears after the document capture or upload step as part of the identity verification pipeline. Once the module completes the comparison against the government records, the flow continues to the next verification step or presents the final result, depending on the outcome and the downstream logic configured in the application. *** ## User Flow The Government Record Verification experience is designed to be transparent and reassuring. The user is informed that their identity is being verified while the module runs a background check against the relevant government source. Once the verification completes, the user receives a clear success or error state and the flow continues accordingly.

          *** ## Full Flow Map This diagram presents the full sequence of screens involved in Government Record Verification, from the verification loading state through to the success and error outcomes.
          *** ## Happy Path (Light & Dark) The ideal user journey when the identity data is successfully matched against the government records with no interruptions. The happy path represents the smoothest version of the experience, where the user's information is found and matched in the government registry without errors or retries. The flow moves directly from the verification loading state to the success confirmation. Both light and dark mode previews are included so teams can validate visual consistency across themes.

          *** ## Best Practices Recommended guidelines for designing and implementing the Government Record Verification experience. **✅ Do** - Keep the loading state copy clear and specific — inform the user their information is being checked against government records. - Display a clean, unambiguous success state so users feel confident before proceeding. - Provide clear error states that explain the issue without technical language and guide the user on next steps - Use the "verified by Incode + Government" footer to reinforce trust and transparency. **❌ Don’t** - Don't remove or skip the loading state — users need to understand verification is in progress. - Don't use generic loading copy; always reference the government record check explicitly. - Don't rely solely on color to communicate the verification outcome. - Don't remove error states, as they correspond to specific logic that must be surfaced to the user.
          --- - Path: `design-and-ux/government-record-verification-screens-states` - URL: https://developer.incode.com/design-and-ux/government-record-verification-screens-states/ - Markdown: https://developer.incode.com/design-and-ux/government-record-verification-screens-states.md # Screens & States A complete view of all screens the user may encounter during the Government Record Verification experience. Each state includes a brief description and a direct link to its source in Figma. *** ## Government Record Verification This screen appears while the module runs a background check, comparing the identity data extracted from the document against the records held by the corresponding government entity. The user is informed that verification is in progress with a loading spinner and a status message referencing the government records source.
          ## Success Shown when the identity data has been successfully matched against the government records, confirming that verification passed. The user receives a clear visual confirmation before the flow continues to the next step.
          ## Error Shown when no matching record is found for the provided identity data in the government registry. The user is informed with a clear error message and the flow cannot continue until the issue is addressed.
          --- - Path: `design-and-ux/government-record-verification-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/government-record-verification-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/government-record-verification-specs-guidelines.md # Specs & Guidelines The **Government Record Verification **module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.
          **Open Screens Specs in [Figma](https://www.figma.com/design/BXeJ6Q3TXahJVWEt8QoMVA/Face-Match---In-Production?node-id=18-19332)**
          *** ## Responsiveness & Viewport Adaptation The **Government Record Verification** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet.
          ### How the layout adapts across devices | Breakpoint | Behavior | | ---------------------------------- | ---------------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; spinner and text scale down to maintain visibility. | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent. | | **Tall/narrow Android devices** | Vertical spacing is redistributed; spinner and text remain centered. | | **Foldables (e.g., Pixel Fold)** | Larger centered layout with more balanced white space. | | **Tablets** | Increased layout margins; spinner and status content scale proportionally. | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding. |
          ### What is responsive (and customizable) | Element | Responsive Behavior | Customizable | | ----------------------- | ----------------------------------------------- | ------------------------------ | | **Spinner** | Remains centered in the layout | Color only | | **Title text** | Remains centered and adapts to container width | Yes, text is fully localizable | | **Subtitle text** | Wraps gracefully for longer translations | Yes, text is fully localizable | | **Status icon** | Remains centered and maintains distance to text | Color & style | | **Footer / watermark** | Pinned to bottom safe area | Optional | | **Background surfaces** | Expand to full viewport | Yes | | **Header area** | Scales padding according to device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | Element | Reason | | ---------------------------- | ----------------------------------------------------------------- | | **Verification logic** | Must remain consistent for accurate government record comparison. | | **Processing flow timing** | Linked to backend processing; cannot be shortened or skipped. | | **Status icon placement** | Ensures clarity and recognition at all sizes. | | **Minimum text size** | Required for readability & WCAG compliance. | | **Minimum tap target sizes** | Ensures accessibility on mobile. | | **Overall hierarchy** | Prevents cognitive load at different sizes. |
          ### Design Notes - The spinner and status icon always remain the dominant visual elements, regardless of screen size. - Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. - Avoid adding custom UI above or below the module — it may break alignment. - Multiline text is handled gracefully, but keep localized strings concise for the loading and result states.

          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions **Government Record Verification** includes predefined transition rules and micro-interactions that ensure a smooth user experience from the verification loading state through to the success and error outcomes. Timing, easing, and animation guidelines are documented directly in Figma prototypes.

          *** ## Localization The **Government Record Verification** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** - All user-facing text is fully localizable, including the loading message, subtitle, success message, and error message. - UI adjusts to prevent truncation and maintain readability. - Spacing and vertical rhythm adapt to accommodate longer languages. - The subtitle referencing government records should be localized carefully to preserve legal and regulatory clarity in each supported region. - Ensure localized strings preserve clarity and follow regulatory requirements when applicable. - Incode supports a variety of languages.
          --- - Path: `design-and-ux/government-record-verification-v1-vs-v2-comparison` - URL: https://developer.incode.com/design-and-ux/government-record-verification-v1-vs-v2-comparison/ - Markdown: https://developer.incode.com/design-and-ux/government-record-verification-v1-vs-v2-comparison.md # Government Record Verification V1 vs V2 Comparison
          In V1, Government Record Verification performs a background check against the corresponding government entity but provides no explicit reference to the source during the verification wait. The loading state is basic, result screens are minimal, and UI elements are not tokenized, which makes customization difficult and limits the ability to align the experience with your brand. In V2, Government Record Verification focuses on transparency and clarity. The loading state explicitly informs the user their information is being checked against government records, result screens are cleaner and more refined, and customization follows a unified token-based system — resulting in a more trustworthy and consistent experience.


          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences).
          | Capabilities | V1 | V2 | Notes | | ----------------------------------- | -- | -- | ------------------------------------------------------------------------------------------------------------------------------------------- | | Government record validation | ✅ | ✅ | Both versions compare OCR-extracted identity data against the corresponding government entity records. | | Loading state | ✅ | ✅ | Both versions display a processing state while the verification request is completed. | | Success state | ✅ | ✅ | Both versions confirm identity verification with a success screen when the record is found and matched. | | Error states | ✅ | ✅ | Both versions cover general error cases that users can encounter. | | Government source attribution in UI | ❌ | ✅ | V2 explicitly informs the user that their information is being checked against government records, both in the loading copy and the footer. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime.
          | Behavior | V1 | V2 | Notes | | ------------------- | -------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | | Loading state | Basic loading indicator with no reference to the verification source | Refined loading screen that explicitly informs the user their information is being checked against government records | V2 keeps users informed during the verification wait, reducing uncertainty and drop-off. | | Result presentation | Basic success and error states with no source attribution | Clearly differentiated success and error screens with the government source referenced in the footer | V2 makes it immediately clear to the user what entity validated their identity. | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. |
          ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: - Less engineering work to override UI elements - Consistent branding across modules - Predictable behavior when changing settings - Reduced risk of breaking flows - Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify. This includes loading indicator styles, text content, result screen colors, and status icon styling — making it straightforward to align the module with your brand without affecting the underlying government verification logic.


          --- - Path: `design-and-ux/guidelines-ekyb` - URL: https://developer.incode.com/design-and-ux/guidelines-ekyb/ - Markdown: https://developer.incode.com/design-and-ux/guidelines-ekyb.md # Specs & Guidelines The **eKYB** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.

          *** ## Responsiveness & Viewport Adaptation The **eKYB** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | ---------------------------------- | ---------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; images scale down to maintain visibility | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing is redistributed; title and images remain pinned to the top | | **Foldables (e.g., Pixel Fold)** | Larger images and more balanced white space; content remains centered | | **Tablets** | Increased layout margins; silhouette scales proportionally | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | ------------------- | ---------------------------------------------------- | ------------------------------ | | Images size | Scale proportionally by viewport height | No | | Title text | Remains centered in the layout and pinned at the top | Yes, text is fully localizable | | Buttons | Width adjusts to container, vertical spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Scales padding according to device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | -------------------------- | ------------------------------------------ | | Matching logic & detection | Must remain consistent for accuracy | | Minimum text size | Required for readability & WCAG compliance | | Minimum tap target sizes | Ensures accessibility on mobile | | Overall hierarchy | Prevents cognitive load at different sizes |
          ### Design Notes * The images always remain the dominant elements, regardless of screen size. * Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. * Avoid adding custom UI above or below the module, it may break alignment. * Multiline text is handled gracefully, but avoid extremely long localized strings.

          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions **eKYB** includes predefined transition rules and micro-interactions that ensure a smooth user experience from the image comparison, to the successful and error states. Timing, easing, and animation guidelines are documented directly in Figma prototypes.


          *** ## Localization The **eKYB** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Buttons and CTAs automatically expand to fit translated labels. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable. * Incode supports a variety of languages
          --- - Path: `design-and-ux/icons` - URL: https://developer.incode.com/design-and-ux/icons/ - Markdown: https://developer.incode.com/design-and-ux/icons.md # Icons A custom icon set designed to match the visual weight of DM Sans. All icons are outlined strokes on a 24×24 grid with 1.5px stroke weight — no fills. They scale cleanly at 16px, 20px, and 24px. ## Specifications ```dh-specs Grid size | 24 × 24px Stroke weight | 1.5px Line cap | round Line join | round Fill style | Stroke-only (outline) Optical sizes | 16px · 20px · 24px ``` ```dh-principles #006aff | Optical sizing, not scaling | Use icons at 16px, 20px, or 24px only. These are the three sizes they were designed for. Arbitrary sizes produce blurry renders and mismatched stroke weight. #189f60 | Color via currentColor | Icons inherit color from the parent's text-color token. Never set fill or stroke directly — let the design token cascade handle it. #820ad1 | Always pair with a label | Don't use an icon alone for an action unless it's universally recognized (close, search). Always add a visible label or aria-label for accessibility. ``` ## Size scale
          16pxCompact / inline
          20pxDefault
          24pxLarge / hero
          Identity6 icons
          Camera
          Face Capture
          ID Card
          Shield
          User Verified
          Search Check
          People3 icons
          User
          Users
          Genuine User
          Actions4 icons
          Lock
          Check Circle
          Warning
          Star
          Communication4 icons
          Mobile
          Email
          Chat
          Clock
          System3 icons
          Layers
          AI Stars
          Rocket
          Use icons at 16px, 20px, or 24px only. These are the optical sizes they were designed for. Avoid arbitrary sizes. Icons inherit color via currentColor. Don't set a fill or stroke color directly — use the text color token on the parent element. Don't use an icon alone for an action unless it's universally recognized (close, back, search). Always add a visible label or aria-label. Icons at 16px pair with Label or Caption text. Icons at 20–24px pair with Body or Button text. Match visual weight. Icons are designed for a specific orientation. Don't rotate unless the icon has an explicit direction variant. When placing an icon next to text, use a 2–4px gap (Scale.1–Scale.2) and align to the text baseline, not the center of the text block.
          --- - Path: `design-and-ux/id-capture-customization` - URL: https://developer.incode.com/design-and-ux/id-capture-customization/ - Markdown: https://developer.incode.com/design-and-ux/id-capture-customization.md # Customization This section outlines the elements you can customize within the **ID Capture** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms.
          ## Tutorial Screen The Tutorial Screen prepares the user for the ID Capture step. It introduces the action, provides the necessary context, and sets expectations before the camera is activated.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ---------------- | ---------------------------------- | -------------------------------------- | | **Text** | Title, subtitle, body text | Fully localizable; tone can be adapted | | **Illustration** | Colors or full replacement | Must remain clear and represent a face | | **Brand Colors** | Header, highlight elements, button | Uses brand tokens | | **Buttons** | Label, color, radius | Must follow platform guidelines | | **Footer** | “Verified by Incode” line | Optional but recommended |
          ### Fixed Elements | **Element** | **Why it is fixed** | | --------------------- | ---------------------------------- | | Layout structure | Ensures consistency across modules | | Spacing & safe areas | Required for device compatibility | | Text hierarchy | Optimized for readability | | WCAG minimum contrast | Mandatory |
          ### Token Reference
          | **UI Element** | **Token** | **Value** | | :---------------- | :----------------------------- | :-------- | | Background | Surface/Neutral/0 | #FFFFFF | | Title text | Text/Body/800 (Primary) | #262831 | | Subtitle text | Text/Body/500 (Secondary) | #60667C | | Helper text | Text/Body/500 (Secondary) | #60667C | | Button background | Button/Primary/Surface/Default | #006AFF | | Button text | Button/Primary/Text/Default | #FFFFFF | | Footer text | Text/Body/500 (Secondary) | #60667C |
          ### Design Notes * Keep copy short to minimize cognitive load. * The illustration uses brand 50 and brand 500 to reinforce brand identity without overwhelming the UI. * Ensure tap targets meet accessibility guidelines. * Maintain clear focus states for keyboard and screen reader users (Web).
          *** ## Fake Permission Screen The Fake Permission Screen is shown before the operating system displays its native camera permission modal. It prepares the user, explains why camera access is required, and significantly reduces the likelihood of users denying permission. This step increases trust and prevents interruptions during the ID Capture flow.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ------------------ | --------------------------------------------- | -------------------------------------------------- | | **Text** | Title, subtitle, permission explanation | Fully localizable; tone should remain reassuring | | **Buttons** | Label (“Allow”, “Don’t allow”), color, radius | Must maintain primary/secondary hierarchy | | **Brand Colors** | Button accents, icon color, text accents | Uses brand tokens | | **Modal Surface** | Background color, elevation, corner radius | Must remain high-contrast and readable | | **Link/Help Text** | “Learn more” or similar supportive text | Optional; can adapt tone based on compliance needs |
          ### Fixed Elements | **Element** | **Why it is fixed** | | ---------------------- | --------------------------------------------------------------- | | Background dim opacity | Indicates OS-level permission flow; needed for clarity | | Modal position | Standardized centered layout for all modules | | Button hierarchy | Mirrors OS expectations; prevents accidental “Don’t allow” taps | | Safety text hierarchy | Ensures user comprehension before OS prompt | | Spacing & safe areas | Required for device consistency | | WCAG minimum contrast | Mandatory |
          ### Token Reference | **UI Element** | **Token** | **Value** | | :-------------------- | :------------------------------ | :-------- | | Background (overlay) | Surface/Neutral/1000 80% Static | #000000 | | Modal background | Surface/Neutral/0 | #FFFFFF | | Divider / handle | Surface/Neutral/200 | #D6CBD2 | | Title text | Text/Body/800 (Primary) | #262831 | | Subtitle text | Text/Body/500 (Secondary) | #60667C | | Primary button | Button/Primary/Surface/Default | #006AFF | | Primary button text | Button/Primary/Text/Default | #FFFFFF | | Secondary button text | Button/Secondary/Text/Default | #006AFF |
          ### Design Notes * The pre-permission modal reduces drop-off by providing context before the OS permission. * Maintain a clear hierarchy between primary (Allow) and secondary (Don’t allow) actions. * Keep the dim overlay consistent to align with OS modal expectations. * Ensure high contrast between modal, text, and background elements. * Avoid adding extra steps or interaction on this screen.
          *** ## Capture Screens During capture, the user aligns their ID within the frame, and the system evaluates real-time conditions such as glare, blur, lighting, and edge visibility. When all conditions are met, the photo is taken automatically. Colors and text on screen can be customized to match your brand, while the capture frame and auto-capture behavior remain fixed to preserve system accuracy.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ---------------- | -------------------------------------------------------------------------------------- | --------------------------------- | | **Text** | Instruction and helper text (e.g., _“Fill the frame with your ID”_, _“Taking photo…”_) | Fully localizable | | **Brand Colors** | Countdown, borders, and progress indicators | Controlled via design tokens | | **Background** | Dark or neutral surfaces | Must maintain sufficient contrast | | **Iconography** | Help and info icons | Color can be customized only | | **Footer** | “All photos are encrypted” or “Verified by Incode” line | Optional |
          ### Fixed Elements | **Element** | **Why it is fixed** | | -------------------------- | --------------------------------------------- | | ID frame shape & safe area | Ensures correct edge and glare detection | | Auto-capture behavior | Guarantees consistency across devices | | Detection logic | Required for accurate system-level validation | | Layout & hierarchy | Preserves visual and functional consistency | | Minimum contrast | Required for accessibility compliance | | Countdown behavior | Animation and timing remain fixed |
          ### Token Reference | **UI Element** | **Token** | **Value** | | :------------------- | :------------------------------ | :-------- | | Background | Surface/Neutral/900 Static | #14151A | | Primary text | Text/Body/0 Static | #FFFFFF | | Secondary text | Text/Body/300 Static (Tertiary) | #A3A8B8 | | Icon | Icon/Neutral/0 Static | #FFFFFF | | Countdown background | Countdown/Surface/Default | #14151A | | Countdown text | Countdown/Text/Default | #FFFFFF | | Focus border | Border/Status/Focus | #006AFF | | Helper text | Text/Body/0 Static | #FFFFFF |
          ### Design Notes * The ID frame shape is fixed and cannot be altered, as it ensures correct alignment and document edge detection. * The progress and countdown indicators must retain their default behavior and timing to maintain capture consistency. * Apply brand colors subtly—use them for accents like borders or buttons, but avoid overpowering the document preview area. * Keep instruction text short and direct, guiding users with clear, actionable phrases (e.g., “Fill the frame with your ID”). * Maintain high contrast and accessible tap areas for key controls such as the help icon or retry button
          *** ## Manual Capture Manual capture is triggered after a period of inactivity (default: 30 seconds) when automatic detection conditions are not met. In this mode, the user aligns their ID within the capture frame and presses the button manually. This ensures users can complete verification even in low light, complex backgrounds, or edge-case scenarios where auto-capture cannot trigger.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ---------------- | --------------------------------------------------------------------------------------- | ------------------------------------------------------- | | **Text** | Instructional text (e.g., “Fill the frame with your ID”, “Press the button to capture”) | Fully localizable | | **Button** | Color, label, radius, and icon color | Must comply with accessibility and tap-target standards | | **Brand Colors** | Border, header, and accent elements | Driven by brand tokens | | **Background** | Dark or neutral surfaces | Must maintain sufficient contrast for ID visibility | | **Icons** | Help/info icons | Only icon color may be customized | | **Footer** | “All photos are encrypted” or “Verified by Incode” | Optional |
          ### Fixed Elements | **Element** | **Why it is fixed** | | --------------------------- | --------------------------------------------------- | | ID frame shape and position | Ensures accurate alignment and detection | | Manual button placement | Ensures reachability and consistency across devices | | Detection logic fallback | Manual mode always follows auto-mode failure | | Layout spacing & safe zones | Maintains visual and interaction consistency | | Accessibility contrast | Must meet WCAG AA requirements | | Button size & touch area | Required for usability and accessibility compliance |
          ### Token Reference | **UI Element** | **Token** | **Value** | | :----------------- | :------------------------- | :-------- | | Background | Surface/Neutral/900 Static | #14151A | | Primary text | Text/Body/0 Static | #FFFFFF | | Instruction text | Text/Body/0 Static | #FFFFFF | | Icon | Icon/Neutral/0 Static | #FFFFFF | | Tooltip background | Tooltip/Surface/Neutral | #14151A | | Tooltip text | Tooltip/Text/Neutral | #FFFFFF | | Secondary icon | Icon/Neutral/50 Static | #CFCFD0 | | Helper text | Text/Body/0 Static | #FFFFFF |
          ### Design Notes * The ID frame must remain fixed in shape to preserve detection accuracy. * Manual capture should always appear as a fallback after auto-capture timeout, never as a default. * Apply brand color accents sparingly (e.g., borders or buttons) to keep focus on the document. * Keep instructional copy short and directive (e.g., “Fill the frame and tap capture”). * Maintain clear tap areas and legible text for accessibility on all device size
          *** ## ID Capture Complete (Analzying & Success) Once the ID photo is captured — either automatically or manually — the user transitions to the Analyzing and Success screens. These stages reassure users that their ID is being securely processed and confirm when the image has passed all validation checks. Both the progress indicators and confirmation visuals can be adapted to match your brand identity..
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ---------------- | --------------------------------------------------------------------- | ----------------------------------------------------------- | | **Text** | “Analyzing…”, “Successfully processed!”, “Now let’s capture the back” | Fully localizable | | **Brand Colors** | Progress bar, success icon, and action button | Must follow brand tokens | | **Surfaces** | Background and card surfaces | Must ensure clarity and contrast against ID image | | **Button** | Color, label, and radius (e.g., _Scan the back_) | Must meet accessibility standards | | **Footer** | “All photos are encrypted” or “Verified by Incode” | Optional | | **Animation** | Progress fill color transitions | Only color may change; timing and animation curve are fixed |
          ### Fixed Elements | **Element** | **Why it is fixed** | | --------------------- | ---------------------------------------------------------------- | | Progress bar behavior | Maintains consistent feedback rhythm across capture steps | | Success timing | Ensures users clearly see confirmation before advancing | | Layout structure | Standardized for readability and predictable UX | | Minimum contrast | Required for WCAG AA compliance | | Animation pattern | Fixed to preserve continuity and visual stability across modules |
          ### Token Reference
          | **UI Element** | **Token** | **Value** | | :-------------------- | :---------------------- | :-------- | | Background | Surface/Neutral/0 | #FFFFFF | | Progress bar (active) | Icon/Status/Positive | #10B060 | | Card background | Surface/Neutral/100 | #EBECEF | | Primary text | Text/Body/800 (Primary) | #262831 | | Secondary surface | Surface/Secondary/900 | #14151A | | Helper text | Text/Body/800 (Primary) | #262831 | ### Design Notes * The progress bar and success icon should use brand-positive tones but remain subtle to avoid visual clutter. * The ID image always remains centered and visible throughout both stages — never obscured by overlays or text. * Keep status text brief and affirmative (“Analyzing…”, “Success!”) for faster comprehension. * Maintain high-contrast text against the background and avoid overlaid color effects on ID photos. * Button CTAs should appear only on success (e.g., Scan the back or Continue), never during analysis.

          *** ## Error Screens Error screens appear when an issue occurs during ID capture, such as glare, blur, cut-off edges, or when all capture attempts have been exhausted. While text and visual styling can be customized, the error event types are system-defined and cannot be removed or altered.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | ---------------- | ------------------------------------------------------------- | ------------------------------------------------- | | **Text** | Error titles, descriptions, and remaining attempts text | Fully localizable | | **Buttons** | CTA label (“Try again”, “Continue”), button color, and radius | Must maintain clear primary/secondary hierarchy | | **Brand Colors** | Header, accent colors, and button colors | Should follow brand token system | | **Icons** | Warning/error icon color | Only color may change — shapes are fixed | | **Background** | Light or neutral backgrounds | Must maintain strong contrast with text and icons | | **Footer** | “All photos are encrypted” or “Verified by Incode” | Optional |
          ### Fixed Elements | **Element** | **Why it is fixed** | | -------------------------- | ------------------------------------------------------------ | | Error event types | Linked to detection logic; cannot be reordered or removed | | Error icon shapes | Maintains universal recognition and visual consistency | | Error layout structure | Standardized for clarity and predictable behavior | | “Attempts remaining” logic | Ensures accuracy and reliable retry tracking | | Final error behavior | Must transition to manual review once attempts are exhausted | | Accessibility contrast | Must comply with WCAG AA for readability |
          ### Token Reference | **UI Element** | **Token** | **Value** | | :---------------- | :----------------------------- | :-------- | | Background | Surface/Neutral/0 | #FFFFFF | | Error icon | Icon/Status/Negative | #FF1111 | | Title text | Text/Body/800 (Primary) | #262831 | | Subtitle text | Text/Body/500 (Secondary) | #60667C | | Helper text | Text/Body/800 (Primary) | #262831 | | Secondary text | Text/Body/500 (Secondary) | #60667C | | Focus icon | Icon/Neutral/800 | #262831 | | Button background | Button/Primary/Surface/Default | #006AFF | | Button text | Button/Primary/Text/Default | #FFFFFF |
          ### Design Notes * Error messaging should remain clear, direct, and action-oriented. * Maintain consistent spacing and visual hierarchy for readability. * “Try again” should always feel like the primary action when applicable. * Final error screens should not offer a retry, only a “Continue” action guiding users into manual review logic. * Avoid long or overly technical messages; users should understand the issue at a glance. * Include the ID image preview where possible — it helps users understand what went wrong. --- - Path: `design-and-ux/id-capture-design` - URL: https://developer.incode.com/design-and-ux/id-capture-design/ - Markdown: https://developer.incode.com/design-and-ux/id-capture-design.md # ID Capture ID Capture is a core onboarding step. It collects high-quality images of a user’s government-issued ID. For two-sided IDs, both the front and back are captured. The module also extracts data using optical character recognition (OCR) and runs authenticity checks. *** ## Where it fits in the flow In an onboarding flow or workflow, **ID Capture** usually appears immediately after consent and document type selection and before Selfie Capture and final submission. Once the user provides valid images, the flow continues to data extraction, document liveness/authenticity checks, and any downstream logic (such as Face Match with later selfie). *** ## User experience flow The experience guides users from preparation to a successful ID capture. After granting camera permission, users see a short tutorial. During capture, the system evaluates framing, glare, blur, and edge alignment in real time. When requirements are met, the ID is auto-captured. If auto-capture doesn’t trigger in time, manual capture is available. In this case, images are then uploaded for quality checks with retry options on failure.

          *** ## Full Flow Map This diagram shows all **ID Capture** screens, from tutorial and permissions through front/back auto/manual capture, uploading, and feedback (success/error).
          *** ## Happy Path (Light & Dark) The ideal user journey occurs when the ID is captured successfully with no interruptions. The happy path represents the smoothest version of the experience: * The user grants camera access * The user follows the tutorial * The system detects proper alignment and lighting * The ID is captured automatically without requiring retries or manual intervention. In these images, both light and dark mode previews are included so teams can validate visual consistency across themes.
          *** ## Best practices for design and implementation **✅ Do** * Keep instructions short and actionable (for example, “Place your ID on a flat surface. Avoid glare”). * Use a high-contrast, uncluttered background. Ensure text remains readable. * Guide with real-time feedback, like, “Move closer,” “Avoid glare,” or “Show all corners.” * Provide retry options and clear error messages (for example, “Wrong document side”). * Respect accessibility with voiceover labels, adequate tap targets, and captions. **❌ Don’t** * Don’t reduce overlay opacity so much that the capturing frame edges become hard to see * Don’t rely solely on color for status. Add icons/text. * Don’t skip critical error states like glare, blur, or cut-off). * Don’t let UI elements obstruct the camera area. --- - Path: `design-and-ux/id-capture-screens-and-states` - URL: https://developer.incode.com/design-and-ux/id-capture-screens-and-states/ - Markdown: https://developer.incode.com/design-and-ux/id-capture-screens-and-states.md # Screens & States A complete view of all screens the user may encounter during the ID Capture experience. Each state includes a brief description and optionally a link to its source in Figma or screen-specs. *** ## Tutorial Introductory screen shown before the camera opens. It sets expectations (flat surface, good lighting, show full ID, avoid glare) and include an short animation.
          ## Permission Screens Shown when camera permissions have not been granted. Includes pre-permission context, OS-specific instructions, and fallback steps if the system dialog is dismissed.
          ## Auto Capture Primary capture method for the **ID Capture**. The camera view is active and the system monitors real-time quality gates (glare, cut-off, blur, edge visibility, barcode/MRZ presence if applicable). When all thresholds are met, the photo is captured automatically.
          ## Manual Capture (Fallback) If auto-capture doesn’t trigger (e.g., complex lighting, slow device, user delay) then after a timeout a manual capture button is shown and user can tap to take photo themselves.
          ## Feedback Messages (Real-Time Guidance) While the camera is active, real-time messages guide the user to correct issues such as: “Move closer”, “Avoid glare”, “Show all four corners”, “Flip to back side”, etc.
          ## Analyzing After capture (front/back) the images are being uploaded and processed (OCR, authenticity check). During this stage the UI prevents further interaction and shows progress.
          ## Success When the images pass quality checks and upload/processing succeeds, the user sees a success screen. The user can proceed to the next verification step without additional input.
          ## Retry Errors Displayed when **ID Capture** fails but attempts remain. Provides specific corrective guidance and a retry CTA. Attempts reset after a successful capture.

          ## Document Not Accepted Errors Document Not Accepted is a screen shown when the user’s ID can’t be verified—for example, due to an expired ID document or an unsupported document type. It displays a list of accepted documents for that country so the user can see which types are valid for verification.
          ## Final Errors (No Attempts Remaining) When all permitted attempts are exhausted, this screen indicates that manual review will follow (or next steps if applicable).
          ## Connection Error Displays when connectivity is lost during capture or upload. Users can retry once a stable connection is restored. --- - Path: `design-and-ux/id-capture-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/id-capture-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/id-capture-specs-guidelines.md # Specs & Guidelines The **ID Capture** module includes complete Figma specifications detailing spacing, layout rules, typography tokens, and language variants for **ID Capture** flows. These specifications ensure consistent behavior and appearance across all platforms, while allowing localized versions of the UI to scale correctly without breaking alignment or interfering with the document frame. They also define how the capture frame, overlay, and instruction text behave in both light and dark modes, ensuring visual clarity and compliance with accessibility and performance standards.
          *** ## Responsiveness & Viewport Adaptation The **ID Capture** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet. This ensures that key interactive areas—such as the capture frame, document preview, instructions, and action buttons—remain visible, accessible, and properly aligned across all platforms. The capture overlay automatically scales to preserve the correct document proportions and maintain edge detection accuracy, regardless of screen dimensions or orientation.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | ---------------------------------- | ------------------------------------------------------------------------------------------------------------ | | **Small phones (e.g., iPhone SE)** | UI elements stack vertically; the **ID frame** scales down to maintain visibility and safe padding. | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent between tutorial text, frame, and CTAs. | | **Tall/narrow Android devices** | Vertical spacing redistributes; capture instructions stay pinned above the frame and button area. | | **Foldables (e.g., Pixel Fold)** | The **ID frame** enlarges with balanced white space; document preview remains centered. | | **Tablets** | Increased layout margins; the **ID frame** scales proportionally without exceeding the 4:3 aspect ratio. | | **Desktop web** | Centered layout with controlled max-width and added safe-area padding; content stays proportionally aligned. |
          ### What is responsive (and customizable) | **Responsive Behavior** | **Element** | **Customizable** | | ------------------------------------------------------------------------------ | ----------------------- | --------------------------------- | | Scales proportionally with viewport height while maintaining a fixed 4:3 ratio | **ID frame area** | Color only (size/shape are fixed) | | Reflows to one or two lines depending on device width | **Instruction text** | Yes, text is fully localizable | | Width adjusts to container; vertical spacing adapts by breakpoint | **Buttons** | Color and label | | Pinned to bottom safe-area across screen sizes | **Footer / watermark** | Optional | | Expand to fill the full viewport; maintain contrast against ID image | **Background surfaces** | Yes | | Adjusts padding according to device safe-area insets | **Header area** | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | ----------------------------- | -------------------------------------------------------------------------------------- | | **Capture logic & detection** | Must remain consistent for accurate glare, blur, and edge validation across devices. | | **Frame proportions** | The 4:3 ratio is fixed to ensure correct document alignment and authenticity analysis. | | **Minimum text size** | Required for readability and WCAG AA accessibility compliance. | | **Minimum tap target sizes** | Ensures accessibility for manual capture and retry actions. | | **Overall hierarchy** | Maintains a predictable layout and cognitive flow across screen sizes. |
          ### Design Notes * The ID frame always remains the primary focal element, scaling proportionally across devices. * Horizontal spacing is fluid, while vertical spacing follows safe thresholds to avoid overlapping elements. * Avoid adding custom UI above or below the capture area, as it may disrupt detection accuracy or alignment. * Multiline instructional text is supported, but extremely long localized strings should be avoided to prevent overflow.
          *** ## Desktop & Tablet Guidelines The ID Capture module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices. In desktop and tablet environments, the ID frame automatically scales to preserve the document’s proportions and maintain detection accuracy. Spacing, typography, and button placement adjust to wider layouts, ensuring all key elements—such as the instruction text, capture button, and document preview—remain accessible and visually balanced.
          *** ## Prototype & Transitions ID Capture includes predefined transition rules and micro-interactions that ensure a smooth user experience across tutorial, capture, analyzing, and error flows. Timing, easing, and animation guidelines—such as frame scaling, progress transitions, and feedback states—are documented directly within the Figma prototypes.
          *** ## Localization The **ID Capture** module supports full localization and is designed to adapt seamlessly to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure that layouts remain stable across all regions and scripts. This ensures that user instructions, document type names, and error messages (such as “Glare present” or “ID scan failed”) remain readable and correctly positioned across languages.
          **Key considerations:** * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Buttons and CTAs automatically expand to fit translated labels. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable. * Incode supports a variety of languages
          --- - Path: `design-and-ux/id-capture-v1-vs-v2` - URL: https://developer.incode.com/design-and-ux/id-capture-v1-vs-v2/ - Markdown: https://developer.incode.com/design-and-ux/id-capture-v1-vs-v2.md # ID Capture V1 vs V2 Comparison
          In v1, the ID Capture experience begins with a simple tutorial slide followed by a native camera permission request. Once granted, the user enters the capture flow with minimal guidance. Instructions are limited to small tooltip-like titles inside a gray section box, with no dynamic feedback, onboarding messages, or additional support during document alignment. In v2, the experience introduces a richer and more supportive flow. The tutorial screen includes an animated illustration that sets expectations for the capture process. Camera permission is handled through a dedicated bottom sheet that explains why access is needed before invoking the system dialog. Once in the capture experience, the user sees clear on-screen instructions, supported by a timed guided animation (shown after ~10 seconds, fully configurable) that demonstrates how to properly position their document. Live cues provide real-time textual feedback paired with small illustrations, ensuring users receive immediate guidance when alignment or capture conditions need correction.


          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences).
          | **Capability** | **V1** | **V2** | **Notes** | | -------------------------------- | ------------------------------ | ----------------------------------- | ------------------------------------------------------------------------------------------------- | | **Auto-capture** | ✔️ | ✔️ (improved) | V2 introduces faster, more reliable detection for automatic capture. | | **Supported document types** | ID, DL, Passport, PoA | Expanded (incl. barcode scanning) | V2 adds barcode scanning capabilities. | | **Guidance timer** | ✖️ | ✔️ | V2 supports configurable timed guidance (e.g., animation after 10s). | | **Dynamic live cues** | ✖️ | ✔️ | V2 includes real-time textual + illustrated feedback; V1 shows static tooltips only. | | **Permission flow behavior** | Direct native permission popup | Pre-permission logic + native popup | V2 introduces an intermediate step explaining why permission is required (behavioral difference). | | **Customization options** | Limited | Full customization | V2 allows full control over text, colors, buttons, illustrations, and behavior. | | **Documentation completeness** | Minimal (key screens only) | Full module documentation | V2 provides complete, standardized documentation coverage. | | **Error states** | Basic | Basic (no new logic) | Error handling behavior remains the same between versions. | | **Developer events / callbacks** | Unchanged | Unchanged (no confirmed additions) | No known new callbacks or event changes in V2. |
          ***
          ## Behavior Differences How the module behaves during runtime. | **Behavior** | **V1** | **V2** | **Notes** | | -------------------------------- | -------------------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------- | | **Tutorial behavior** | Static slides with minimal instruction | Animated tutorial explaining the process | V2 sets clearer expectations and prepares user for capture flow. | | **Permission flow logic** | Immediate native popup is triggered | Pre-permission bottom sheet shown before native popup | V2 introduces an explanatory step to reduce permission drop-off. | | **In-capture guidance** | Only short static tooltips inside gray area | Continuous, clear instructions displayed on screen | V2 actively guides the user instead of relying on passive hints. | | **Timed guidance behavior** | None | After ~10s (configurable), a guided animation appears | Helps users correctly position their ID if they struggle initially. | | **Live feedback cues** | None (no dynamic feedback) | Real-time textual messages paired with small illustrations | V2 helps users correct issues such as misalignment or framing. | | **Behavior during auto-capture** | Basic auto-capture triggers with limited feedback | Improved auto-capture with alignment detection and feedback | V2 provides more consistent capture results with clearer state awareness. | | **Post-capture flow** | Immediate capture with no intermediate processing screen | Shows “Taking photo…” → “Analyzing…” → success confirmation | V2 communicates system activity, reducing uncertainty. | | **End-of-flow behavior** | Camera simply closes or proceeds silently | Explicit success screen with next-step guidance | V2 provides clarity, especially for multi-step document capture. |
          ***

          ## Performance Improvements Differences in efficiency, speed, stability, and quality of output.
          ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify. **For full details, visit the Customization tab of this module.**

          --- - Path: `design-and-ux/input` - URL: https://developer.incode.com/design-and-ux/input/ - Markdown: https://developer.incode.com/design-and-ux/input.md # Input Inputs collect text from users. Prizma includes a standard text field, OTP cells for verification codes, and a multiline variant. All inputs share the same token layer for border, surface, and typography. ## Try it live Click in and type — focus ring and placeholder come from the input tokens.

          Interactive — focus / type

          Variants
          Full name
          Text field.input

          The standard single-line field for names, emails, and free text.

          12
          OTP cells.input-otp

          One cell per digit for verification codes. Focus advances automatically.

          Tell us more…
          Multiline.input-multiline

          Grows for longer answers; used for notes and feedback.

          Tokens
          ```dh-comp-tokens --input-surface-default | Input background | Component --input-border-default | Border — rest | Component --input-border-focus | Border — focused | Component --input-border-error | Border — error | Component --input-border-disabled | Border — disabled | Component --input-text-default | Input text color | Component --input-placeholder | Placeholder text color | Component --input-helper-error | Error helper text color | Component --radius-input | Corner radius | Semantic ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/list` - URL: https://developer.incode.com/design-and-ux/list/ - Markdown: https://developer.incode.com/design-and-ux/list.md # List The List component shows a numbered sequence of steps with clear progress indicators. Each row is independently styled as done, active, or pending, giving users a clear view of where they are in a flow.
          Row states
          Position document in frame
          Done.gc-list-row__num--check

          Completed step. The number is replaced by a checkmark in brand success color.

          1Hold steady while scanning
          Active.gc-list-row (default)

          Current step in progress. The number is displayed normally in the active color.

          1Confirm captured image
          Pending.gc-list-row__num--pending

          Upcoming step. Number and text are muted to reduce visual weight.

          Full list
          ## All three states together A typical 3-step list showing steps 1 done, step 2 active, step 3 pending.
          Position document in frame2Hold steady while scanning3Confirm captured image
          Tokens
          ```dh-comp-tokens --list-num-done | Done step indicator bg | Component --list-num-active | Active step indicator bg | Component --list-num-pending | Pending step indicator bg | Component --list-text-active | Active step text color | Component --list-text-muted | Pending step text color | Component --list-connector | Vertical connector line | Component ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/loading` - URL: https://developer.incode.com/design-and-ux/loading/ - Markdown: https://developer.incode.com/design-and-ux/loading.md # Loading Loading components communicate that the system is working. Prizma provides a spinner for indeterminate states and a progress bar for determinate ones. Both are used extensively in biometric capture and verification screens. ## Try it live

          Live — indeterminate spinner and determinate progress

          Variants
          Spinner.loading-spinner

          Indeterminate. Use when the wait time is unknown — processing, uploading, verifying.

          Progress bar.loading-progress

          Determinate. Use when progress is measurable — multi-step flows, uploads with known size.

          Tokens
          ```dh-comp-tokens --spinner-track-color | Spinner ring — background arc | Component --spinner-fill-color | Spinner ring — active arc | Component --loading-bar-track | Progress bar track background | Component --loading-bar-fill | Progress bar fill color | Component --loading-bar-height | Bar height | Component --radius-loading-bar | Bar corner radius | Semantic ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/manual-upload-id-customization` - URL: https://developer.incode.com/design-and-ux/manual-upload-id-customization/ - Markdown: https://developer.incode.com/design-and-ux/manual-upload-id-customization.md # Customization This section outlines the elements you can customize within the **Manual Upload ID** module to match your brand while preserving Incode's core UX. It clarifies which areas are flexible, such as text, tab labels, and brand colors, and which elements remain fixed to ensure consistency, accessibility, and reliable document processing across platforms.
          ## Upload Your Documents The Upload Your Document screen is where the user selects their document type and uploads the front and back sides of their identity document. It presents upload prompts per document side, image quality hints, and a disabled Continue button that activates only once all required sides have been validated.
          ### Customizable Elements | Area | What can be customized | Notes | | --------------------- | --------------------------------------------------------- | ----------------------------------------------------------- | | **Text** | Title, subtitle, tab labels, upload row labels, hint text | Fully localizable; tone can be adapted to your brand voice. | | **Button — Upload** | Label, color, radius | Must follow platform guidelines. | | **Button — Continue** | Label, color, radius (active and disabled states) | Must follow platform guidelines. | | **Background Color** | Screen background | Must maintain strong contrast with text and elements. | | **Brand Colors** | Header text, tab indicator, accent color | Uses brand tokens. | | **Footer** | "Verified by Incode" line | Optional but recommended for trust and product consistency. |

          ### Fixed Elements | Element | Why it is fixed | | ---------------------------------- | --------------------------------------------------------------------- | | **Continue button disabled state** | Must remain inactive until all required document sides are validated. | | **Upload row structure** | Required to ensure both document sides are collected consistently. | | **Component spacing & safe areas** | Required for device compatibility and visual stability. | | **Text hierarchy** | Optimized to communicate requirements clearly. | | **WCAG contrast requirements** | Mandatory for accessibility and regulatory compliance. |

          ### Token Refearence | UI Element | Token | Value | | ----------------------------------------- | --------------------------------------------------------------------------- | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Tab label (active)** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Tab label (inactive)** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Upload row background** | Surface/Neutral/50 → Color/Gray/50 | #FCFCFD | | **Upload button background** | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Upload button text** | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Upload row icon** | Icon/Neutral/50 Static → Color/Gray/50 | #FCFCFD | | **Row label text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Row icon** | Icon/Neutral/500 → Color/Gray/500 | #60667C | | **Close icon** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Hint area background** | Surface/Brand/50 → Color/Brand/50 | #E5F0FF | | **Hint text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Continue button background (disabled)** | Button/Primary/Surface/Disabled → Surface/Neutral/100 → Color/Gray/100 | #EBECEF | | **Continue button text (disabled)** | Button/Primary/Text/Disabled → Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Footer text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C |
          ### Design Notes - Keep instructions clear about what document sides are required and the expected image quality. - The Continue button must stay visually distinct in its disabled state to communicate that action is still required. - Ensure tap targets on Upload buttons meet accessibility guidelines.
          *** ## Uploading Documents This screen appears while a selected file is being uploaded to the system. A spinner and a status message keep the user informed while the operation completes in the background.
          ### Customizable Elements | Area | What can be customized | Notes | | ---------------------------- | ------------------------------------------ | ---------------------------------------------- | | **Title text** | Loading message ("Hold on a sec...") | Fully localizable; should remain concise. | | **Subtitle text** | Supporting message ("Uploading your file") | Tone can match your brand voice; optional. | | **Spinner accent color** | Primary spinner stroke | Uses brand tokens; must remain visually clear. | | **Spinner background color** | Secondary spinner stroke | Should maintain contrast with accent. | | **Background Color** | Screen background | Must preserve readability and contrast. |
          ### Fixed Elements | Element | Why it is fixed | | --------------------------- | ------------------------------------------------------------- | | **Processing flow timing** | Linked to backend processing; cannot be shortened or skipped. | | **Spinner animation style** | Standardized across SDK for performance and recognizability. | | **Spacing & safe areas** | Required for device consistency. | | **Minimum contrast** | Required for accessibility and compliance. |
          ### Token Reference | UI Element | Token | Value | | ---------------------- | --------------------------------------------------------------- | ------- | | **Background** | Surface/Neutral/Light → Color/Neutral/light | #FFFFFF | | **Spinner background** | Spinner/surface/secondary → Surface/Primary/50 → Color/Brand/50 | #E5F0FF | | **Spinner accent** | Spinner/surface/primary → Surface/Primary/500 → Color/Brand/500 | #006AFF | | **Title text** | Spinner/text/title → Text/Body/primary → Color/Gray/800 | #262831 | | **Subtitle text** | Spinner/text/subtitle → Text/Body/secondary → Color/Gray/500 | #60667C | ### Design Notes - Keep copy short to minimize cognitive load during the wait. - Use subtitle text to set user expectations about what is happening. - Avoid adding imagery or additional UI elements that may distract from the upload state.
          *** ## Ready for Verification Shown once both document sides have been successfully uploaded and validated with a green checkmark per side. The Continue button becomes active, allowing the user to proceed to the verification step.
          ### Customizable Elements | Area | What can be customized | Notes | | -------------------------- | -------------------------------------------------- | ------------------------------------------------------------------- | | **Text** | Title, subtitle, tab labels, row labels, hint text | Fully localizable. | | **Success indicator icon** | Green checkmark per row | Can replace with custom success icon; must remain clearly positive. | | **Button — Continue** | Label, color, radius | Must follow platform guidelines. | | **Background Color** | Screen background | Must maintain contrast with content. | | **Brand Colors** | Header text, tab indicator, accent color | Uses brand tokens. | | **Footer** | "Verified by Incode" line | Optional but recommended. |

          ### Fixed Elements | Element | Why it is fixed | | -------------------------------- | ---------------------------------------------------------------- | | **Success logic per row** | Must reflect actual validation result per document side. | | **Status color mapping** | Green = positive; required for consistent semantics. | | **Continue button active state** | Only activates when all sides are validated; cannot be bypassed. | | **Button placement** | Standardized across modules. | | **WCAG contrast requirements** | Mandatory for accessibility and regulatory compliance. |
          ### Token Reference | UI Element | Token | Value | | ------------------------------ | --------------------------------------------------------------------------- | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Tab label (active)** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Tab label (inactive)** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Row background** | Surface/Neutral/50 → Color/Gray/50 | #FCFCFD | | **Row icon** | Icon/Neutral/500 → Color/Gray/500 | #60667C | | **Row label text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Close icon** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Success icon** | Icon/Status/Positive → Color/Positive/500 | #189F60 | | **Hint area background** | Surface/Brand/50 → Color/Brand/50 | #E5F0FF | | **Hint text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Continue button background** | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Continue button text** | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Footer text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C |
          ### Design Notes - The green checkmark per row gives users clear, per-side confirmation without requiring them to re-read the full screen. - Ensure the Continue button uses the brand 500 color to provide a clear and prominent next step. - Maintain visual consistency between the upload and validated states of each row.
          *** ## Error Screen Error screens appear inline within the upload flow when a document side is rejected or an incorrect file is submitted. The user is notified with a clear message directly below the affected upload row and prompted to upload the correct document. The Continue button remains disabled until the issue is resolved.
          ### Customizable Elements | Area | What can be customized | Notes | | ---------------------- | ----------------------------------------------------------- | ------------------------------------------------------------ | | **Title text** | Screen title | Fully localizable. | | **Tab labels** | Document type tab labels | Fully localizable. | | **Error message text** | Inline error message ("Please upload the correct document") | Fully localizable; tone should be neutral and non-blaming. | | **Error icon** | Inline error indicator | Can be replaced; must remain clearly negative. | | **Button — Upload** | Label, color, radius | Action should guide the user to retry with the correct file. | | **Background color** | Screen background | Must support strong contrast. | | **Brand Colors** | Header text, tab indicator | Uses brand tokens. | | **Footer** | "Verified by Incode" line | Optional but recommended. |
          ### Fixed Elements | Element | Why it is fixed | | ---------------------------------- | ----------------------------------------------------------------- | | **Error logic** | Must accurately reflect the document validation result. | | **Status color mapping** | Red = negative; required for clarity and consistency. | | **Continue button disabled state** | Cannot advance until the error is resolved. | | **Inline error placement** | Positioned directly below the affected row for clear attribution. | | **Button placement** | Consistent across modules. |
          ### Token Reference | UI Element | Token | Value | | ----------------------------------------- | ------------------------------------------------------------------------- | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Tab label (active)** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Tab label (inactive)** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Row background** | Surface/Neutral/50 → Color/Gray/50 | #FCFCFD | | **Row icon** | Icon/Neutral/500 → Color/Gray/500 | #60667C | | **Row label text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Success icon (validated row)** | Icon/Status/Positive → Color/Positive/500 | #189F60 | | **Error icon** | Icon/negative → Color/Negative/600 | #E71111 | | **Inline error text** | Input/Text/Helper/Negative → Text/Status/Negative → Color/Negative/500 | #E71111 | | **Hint area background** | Surface/Brand/50 → Color/Brand/50 | #E5F0FF | | **Hint text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Continue button background (disabled)** | Button/Primary/Surface/Disabled → Surface/Neutral/100 → Color/Gray/100 | #EBECEF | | **Continue button text (disabled)** | Button/Primary/Text/Disabled → Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Footer text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C |
          ### Design Notes - Error messaging should be clear, direct, and action-oriented. - Inline placement of the error message directly below the affected row ensures users understand exactly which side needs to be corrected. - Maintain consistent spacing and visual hierarchy for readability. - Avoid technical language; users should understand the issue at a glance.
          *** ##
          --- - Path: `design-and-ux/manual-upload-id-design` - URL: https://developer.incode.com/design-and-ux/manual-upload-id-design/ - Markdown: https://developer.incode.com/design-and-ux/manual-upload-id-design.md # Manual Upload ID **Manual Upload ID** allows users to submit photos of their physical identity document directly from their device's photo library or files as part of the verification flow. It supports multiple document types — such as ID and Passport — and requires the user to upload both the front and back sides, enabling verification without requiring a live camera capture. **Manual Upload ID** typically occurs at the beginning of the document verification step, as an alternative to camera-based ID capture. ![](https://developer.incode.com/assets/e1f38780f873132dc179022932ac4e94.gif)
          *** ## Where it fits in the flow **Manual Upload ID** usually appears at the beginning of the document verification step, as an alternative to real-time camera capture. Once the user successfully uploads both sides of their document and the files are validated, the flow continues to identity verification and any downstream verification logic required by the application. *** ## User Flow The **Manual Upload ID** experience moves through several clear stages that guide the user from document selection to successful submission. The user selects a document type — such as ID or Passport — and is prompted to upload the front and back sides of their document from their device's photo library or files. Once both sides are uploaded and confirmed, the module processes the files and validates the document. The user then receives a success state or an inline error message with the option to correct and retry before continuing to the next step.

          *** ## Full Flow Map This diagram presents the full sequence of screens involved in **Manual Upload ID**, from document type selection and file upload, through the uploading and verification states, to the final success or error feedback.
          **Open Full Flow Map in **Figma *** ## Happy Path (Light & Dark) The ideal user journey when both document sides are uploaded and verified successfully with no interruptions. The happy path represents the smoothest version of the experience, where the user selects the correct document type, uploads both sides from their library, the files are validated without errors, and the system successfully processes the document without requiring retries or corrections. Both light and dark mode previews are included so teams can validate visual consistency across themes.

          **Open Happy Path in **Figma *** ## Best Practices Recommended guidelines for designing and implementing the Manual Upload ID experience. **✅ Do** - Keep instructions clear about what document sides are required and the expected image quality. - Show upload status per document side so users always know what has been completed. - Provide clear inline error messages with actionable next steps when a file is rejected. - Always allow users to re-upload a side if it was rejected, without restarting the entire flow. - Include image quality hints (e.g. "Ensure text on ID is readable", "Photo must be sharp and glare-free") to reduce submission errors. **❌ Don’t** - Don't allow the Continue button to be active until all required document sides have been uploaded and validated. - Don't skip or reduce essential error states. - Don't rely solely on color to communicate upload status or validation feedback. - Don't remove the image quality hints, as they help users submit files that can be processed successfully.
          --- - Path: `design-and-ux/manual-upload-id-screens-states` - URL: https://developer.incode.com/design-and-ux/manual-upload-id-screens-states/ - Markdown: https://developer.incode.com/design-and-ux/manual-upload-id-screens-states.md # Screens & States A complete view of all screens the user may encounter during the **Manual Upload ID** experience. Each state includes a brief description and a direct link to its source in Figma. **Open Full Screen and Specs in **Figma
          Source of truth for layout, visual specs, interactions, and platform variations. *** ## Upload Your Documents The main upload screen where the user selects their document type — such as ID or Passport — and uploads the front and back sides of their document from their device's photo library or files. The Continue button remains disabled until both sides have been successfully uploaded and validated. Image quality hints are shown to help users submit files that can be processed correctly.
          ## Library The native file picker presented when the user taps an Upload button. The user can browse their photo library or files to select the appropriate document side. This screen is controlled by the operating system and opens directly within the upload flow.
          ## Uploading Shown while a selected file is being uploaded to the system. A loading spinner and a status message keep the user informed while the operation completes in the background.
          ## Ready for Verification Shown once both document sides have been successfully uploaded and confirmed with a green checkmark indicator per side. The Continue button becomes active, allowing the user to proceed to the verification step.
          ## Verifying Shown while the system processes the uploaded document files and verifies the identity. A loading spinner and a status message keep the user informed while the operation completes in the background.
          ## Success Shown when the identity has been successfully verified. The user receives a clear visual confirmation before the flow continues to the next step.
          ## Errors Shown inline on the upload screen when a document side is rejected or an incorrect file is uploaded. The user is notified with a clear error message directly below the affected upload row and prompted to upload the correct document. The Continue button remains disabled until the issue is resolved.
          --- - Path: `design-and-ux/manual-upload-id-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/manual-upload-id-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/manual-upload-id-specs-guidelines.md # Specs & Guidelines The **Manual Upload ID** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.
          **Open Screens Specs in **Figma
          *** ## Responsiveness & Viewport Adaptation The **Manual Upload ID** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet.
          ### How the layout adapts across devices | Breakpoint | Behavior | | ---------------------------------- | ------------------------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; upload rows and hint area scale down to maintain visibility. | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent. | | **Tall/narrow Android devices** | Vertical spacing is redistributed; title and upload rows remain pinned to the top. | | **Foldables (e.g., Pixel Fold)** | Larger upload area and more balanced white space; content remains centered. | | **Tablets** | Increased layout margins; upload rows and buttons scale proportionally. | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding. |
          ### What is responsive (and customizable) | Element | Responsive Behavior | Customizable | | ----------------------- | ---------------------------------------------------- | ------------------------------ | | **Upload rows** | Scale proportionally by viewport width | Limited (colors and labels) | | **Title text** | Remains centered in the layout and pinned at the top | Yes, text is fully localizable | | **Tab selector** | Width adjusts to container | Color & text | | **Buttons** | Width adjusts to container, vertical spacing adapts | Color & text | | **Hint area** | Expands to container width; text wraps gracefully | Color & text | | **Footer / watermark** | Pinned to bottom safe area | Optional | | **Background surfaces** | Expand to full viewport | Yes | | **Header area** | Scales padding according to device safe insets | Limited (color only) | | **Icons** | Remain centered and maintain distance to the title | Color & style |
          ### What remains fixed across breakpoints | Element | Reason | | ---------------------------------- | -------------------------------------------------------- | | **Upload validation logic** | Must remain consistent for accurate document collection. | | **Continue button disabled state** | Cannot be bypassed regardless of screen size. | | **Minimum text size** | Required for readability & WCAG compliance. | | **Minimum tap target sizes** | Ensures accessibility on mobile. | | **Overall hierarchy** | Prevents cognitive load at different sizes. |
          ### Design Notes - Upload rows always remain the dominant UI elements, regardless of screen size. - Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. - Avoid adding custom UI above or below the module — it may break alignment. - Multiline text is handled gracefully, but avoid extremely long localized strings in tab labels or button labels.
          **Open Screens Responsiveness in **Figma
          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.
          **Open Desktop & Tablet Guidelines in **Figma
          *** ## Prototype & Transitions **Manual Upload ID** includes predefined transition rules and micro-interactions that ensure a smooth user experience from document type selection and file upload, through the uploading state, to the ready for verification and error outcomes. Timing, easing, and animation guidelines are documented directly in Figma prototypes.
          **Open Prototype & Transitions in **Figma
          *** ## Localization The **Manual Upload ID** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** - All user-facing text is fully localizable, including tab labels, upload row labels, hint text, button labels, and error messages. - UI adjusts to prevent truncation and maintain readability. - Spacing and vertical rhythm adapt to accommodate longer languages. - Buttons and CTAs automatically expand to fit translated labels. - Tab labels should remain short to avoid overflow; use abbreviations where appropriate for longer language variants. - Ensure localized strings preserve clarity and follow regulatory requirements when applicable. - Incode supports a variety of languages.
          **Open Screens Localization in **Figma --- - Path: `design-and-ux/manual-upload-id-v1-vs-v2-comparison` - URL: https://developer.incode.com/design-and-ux/manual-upload-id-v1-vs-v2-comparison/ - Markdown: https://developer.incode.com/design-and-ux/manual-upload-id-v1-vs-v2-comparison.md # Manual Upload ID V1 vs V2 Comparison
          In V1, Manual Upload ID offers a basic experience for submitting identity document photos from a device. The flow covers the essential steps but provides limited guidance, and UI elements are not tokenized, which makes customization difficult and limits the ability to align the experience with your brand. In V2, Manual Upload ID focuses on clarity and confidence. The flow guides users through document type selection and per-side upload with inline validation feedback, image quality hints, and a disabled Continue button that activates only once all required sides are validated — resulting in a simpler, more direct experience.


          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences).
          | Capabilities | V1 | V2 | Notes | | ------------------------------ | -- | -- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | Document upload | ✅ | ✅ | Both versions allow the user to upload identity documents from their device. | | Document type selection | ✅ | ✅ | Both versions support selecting between document types such as ID and Passport. | | Per-side upload tracking | ✅ | ✅ | Both versions require the front and back sides to be uploaded separately. | | Image quality hints | ✅ | ✅ | Both versions display guidance to help users submit files that can be processed correctly. | | Inline validation feedback | ❌ | ✅ | V2 displays immediate inline error messages when an incorrect document is uploaded, allowing the user to correct it without leaving the screen. | | Continue button disabled state | ✅ | ✅ | Both versions prevent advancing until all required sides are validated. | | Error States | ✅ | ✅ | Both versions cover general error cases that users can encounter. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime.
          | Behavior | V1 | V2 | Notes | | ------------------------ | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | | Upload interface | Basic file picker with no additional guidance per side | Structured upload interface with document type tabs, per-side upload prompts, and image quality hints | V2 gives users clear context for each required document side, reducing submission errors. | | Validation feedback | Basic error states with no inline guidance | Immediate inline error message directly below the affected upload row when an incorrect file is detected | V2 actively communicates upload issues so users can correct them without leaving the screen. | | Continue button behavior | Disabled until all sides are uploaded | Disabled until all sides are uploaded and validated, with clear visual differentiation between disabled and active states | V2 makes the button state more predictable and visually consistent with the UXv2 system. | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. |
          ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: - Less engineering work to override UI elements - Consistent branding across modules - Predictable behavior when changing settings - Reduced risk of breaking flows - Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify. This includes button styles, tab indicator colors, upload row appearance, inline error styling, and the overall visual theme — making it straightforward to align the module with your brand without affecting core upload and validation logic. **For full details, visit the **Customization** tab of this module.**

          --- - Path: `design-and-ux/modal` - URL: https://developer.incode.com/design-and-ux/modal/ - Markdown: https://developer.incode.com/design-and-ux/modal.md # Modal Modals interrupt the current flow to deliver critical information or request a decision. Prizma modals always include a title, a supporting message, and a primary action. They are centered on screen and overlay a dimmed background.
          Anatomy
          Verification failed

          We couldn’t verify your identity. Please try again with better lighting.

          Variants
          Identity verified

          You can continue with your process.

          Confirmation.modal--confirm

          A single positive action to move forward.

          Verification failed

          We couldn’t verify your identity.

          Recovery.modal--error

          Explains what went wrong and offers a retry path.

          Camera access needed

          Allow access to continue with face verification.

          Permission.modal--permission

          Requests a decision before the flow can continue.

          Tokens
          ```dh-comp-tokens --modal-surface | Modal card background | Component --modal-border | Modal card border | Component --modal-title | Title text color | Component --modal-sub | Supporting text color | Component --modal-overlay | Background overlay color | Component --modal-close-icon | Close icon color | Component --radius-modal | Modal corner radius | Semantic ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/module-customization` - URL: https://developer.incode.com/design-and-ux/module-customization/ - Markdown: https://developer.incode.com/design-and-ux/module-customization.md # Module Customization This section documents the end user experience and customization options for each Incode module. It's the reference for frontend engineers integrating Incode SDKs who need to know what users will see, what can be branded or restyled, and what design constraints apply. ## Modules documented in this section Biometric capture: [ID Capture](/design-and-ux/id-capture-design/), [Face Capture](/design-and-ux/face-capture-design/), [Face Match](/design-and-ux/face-match-design/) Document handling: [Document Capture](/design-and-ux/document-capture-design/), [Upload Digital ID](/design-and-ux/upload-digital-id-design/), [NFC](/design-and-ux/nfc-design/), [Manual Upload ID](/design-and-ux/manual-upload-id-design/), [OCR Review](/design-and-ux/ocr-review-design/), [Fiscal QR OCR](/design-and-ux/fiscal-qr-ocr-design/) Data collection and consent: [Data Sharing Consent](/design-and-ux/data-sharing-consent-design/), [Geolocation](/design-and-ux/geolocation-design/), [Phone Number Input](/design-and-ux/phone-number-input-design/), [Email Input](/design-and-ux/email-input-design/), [Forms and Data Entry](/design-and-ux/forms-and-data-entry-design/) Identity verification: [Government Record Verification](/design-and-ux/government-record-verification-design/), [CURP](/design-and-ux/curp-design/), [eKYC](/design-and-ux/ekyc-design/), [eKYB](/design-and-ux/ekyb-design/) Signatures: [Electronic Signature](/design-and-ux/electronic-signature-design/), [Advanced Signature](/design-and-ux/advanced-signature-design/), [Qualified Signature](/design-and-ux/qualified-signature-design/), [Certificate Issuance](/design-and-ux/certificate-issuance-design/) Watchlists: [Watchlist and Custom Watchlist](/design-and-ux/watchlist-design/), [Watchlist for Business](/design-and-ux/watchlist-business-design/) ## What each module's pages cover Each module above is documented across four pages: **Screens & States.** Every screen the end user encounters during the module flow, including loading states, success states, error states, and permission prompts. Use this to understand what UI your integration will surface and when. **Customization.** What can be changed and how. Covers configurable colors, typography, copy, button styles, logos, and any module-specific customization hooks exposed through the SDK or Dashboard. **Specs & Guidelines.** Design specifications and constraints: minimum tap targets, safe areas, contrast requirements, accessibility considerations, and Prizma design system alignment. Use this to validate that your customizations stay within supported limits. **V1 vs V2 Comparison.** Visual and behavioral differences between the V1 and V2 experiences for modules that support both. Use this when planning a migration or deciding which version to integrate. --- - Path: `design-and-ux/navigation-bar` - URL: https://developer.incode.com/design-and-ux/navigation-bar/ - Markdown: https://developer.incode.com/design-and-ux/navigation-bar.md # Navigation Bar The Navigation Bar is the persistent header present on every step of a Prizma verification flow. It provides orientation (title), backward navigation (back button), and flow exit (close icon) — always in the same position.
          Anatomy
          Verify identity
          Variants
          Get started
          Back + close.navbar

          The default: back on the left, step title centered, close on the right.

          ID Capture
          Close only.navbar--no-back

          First step of a flow — there is nowhere to go back to.

          Tokens
          ```dh-comp-tokens --nav-bar-surface | Bar background | Component --nav-bar-border | Bottom border color | Component --nav-bar-title | Title text color | Component --nav-bar-back-text | Back label color | Component --nav-bar-icon | Icon color (back, close) | Component --nav-bar-height | Bar height | Component ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/nfc-customization` - URL: https://developer.incode.com/design-and-ux/nfc-customization/ - Markdown: https://developer.incode.com/design-and-ux/nfc-customization.md # Customization This section outlines the elements you can customize within the NFC Scan module to match your brand while preserving Incode's core UX. It clarifies which areas are flexible, such as text and brand colors, and which elements remain fixed to ensure consistency, accessibility, and reliable chip reading across platforms.
          ## NFC chip presence The optional entry screen that asks the user whether the NFC chip symbol is visible on their passport cover. Two actions are presented: "No" routes the user out of the NFC flow, and "Yes" proceeds to the scan tutorial.
          ### Customizable Elements | Area | What can be customized | Notes | | -------------------- | --------------------------- | ----------------------------------------------------------- | | **Text** | Title, question text | Fully localizable; tone can be adapted to your brand voice. | | **Button — No** | Label, border color, radius | Must remain visually distinct from the primary action. | | **Button — Yes** | Label, color, radius | Uses primary brand color. | | **Background Color** | Screen background | Must maintain strong contrast with text and elements. | | **Brand Colors** | Header text, button accent | Uses brand tokens. | | **Footer** | "Verified by Incode" line | Optional but recommended for trust and product consistency. |
          ### Fixed Elements | Element | Why it is fixed | | ---------------------------------- | ---------------------------------------------------------------------------------- | | **Yes / No binary choice** | Required to correctly gate the NFC flow; cannot be collapsed into a single action. | | **NFC symbol illustration** | Must remain recognizable to help users identify the chip on their document. | | **Component spacing & safe areas** | Required for device compatibility and visual stability. | | **WCAG contrast requirements** | Mandatory for accessibility and regulatory compliance. |
          ### Token Reference | UI Element | Token | Value | | --------------------------- | --------------------------------------------------------------------------- | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Subtitle text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Button — No text** | Button/Secondary/Text/Default → Text/Accent/Brand → Color/Brand/500 | #006AFF | | **Button — Yes background** | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Button — Yes text** | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Brand icon** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Footer icon** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Footer text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Footer background** | Icon/Neutral/0 Static → Color/Gray/0 | #FFFFFF |
          ### Design Notes - The question must be phrased clearly so users without technical knowledge can identify the NFC symbol on their document. - "Yes" should always be the primary (filled) button to guide the happy path. - The NFC symbol illustration is a functional reference — do not replace it with a decorative asset.
          *** ## Tutorial The screen that prepares the user before the scan begins. The user is instructed to hold their phone close to the front cover of their passport and taps "Start scanning" to initiate the session.
          ### Customizable Elements | Area | What can be customized | Notes | | --------------------------- | -------------------------- | ----------------------------------------------------------- | | **Text** | Title, subtitle | Fully localizable; should remain instructional and concise. | | **Button — Start scanning** | Label, color, radius | Uses primary brand color. | | **Background Color** | Screen background | Must maintain contrast with content. | | **Brand Colors** | Header text, button accent | Uses brand tokens. | | **Footer** | "Verified by Incode" line | Optional but recommended. |
          ### Fixed Elements | Element | Why it is fixed | | ---------------------------------- | ------------------------------------------------------------------------- | | **Passport illustration** | Must show the correct document positioning to guide the user accurately. | | **Single primary CTA** | The scan can only be initiated by the user; no auto-advance is permitted. | | **Component spacing & safe areas** | Required for device compatibility and visual stability. | | **WCAG contrast requirements** | Mandatory for accessibility and regulatory compliance. |
          ### Token Reference | UI Element | Token | Value | | -------------------------------------- | --------------------------------------------------------------------------- | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Subtitle text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Button — Start scanning background** | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Button — Start scanning text** | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Brand icon** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Footer icon** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Footer text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C |
          ### Design Notes - Keep the instruction brief — the user needs to understand one action: hold the phone against the passport cover. - Do not add extra steps or supplementary CTAs that could delay the user from starting the scan.
          *** ## Scanning Shown while the module is actively listening for and reading the NFC chip. A progress bar and "Hold still.." message keep the user informed. A bottom sheet displays real-time processing status and a Cancel option.
          ### Customizable Elements | Area | What can be customized | Notes | | ------------------------- | ----------------------------------- | ------------------------------------------------------------ | | **Title text** | Scanning state title ("Scanning..") | Fully localizable. | | **Subtitle text** | Supporting instruction | Should reinforce the hold-still guidance. | | **Progress bar color** | Active fill color | Uses success/brand token; must remain clearly visible. | | **Hold still label** | Bold status label | Fully localizable. | | **Bottom sheet title** | "Ready to scan" | Fully localizable. | | **Bottom sheet subtitle** | "Processing, don't move your phone" | Fully localizable. | | **Background Color** | Screen and bottom sheet background | Must maintain contrast. | | **Button — Cancel** | Label, color, radius | Should be visually de-emphasized relative to the scan state. |

          ### Fixed Elements | Element | Why it is fixed | | ------------------------------ | ------------------------------------------------------------------ | | **Progress bar behavior** | Tied to actual chip read progress; cannot be faked or accelerated. | | **Bottom sheet pattern** | Standardized scan UX across the SDK. | | **Cancel availability** | Must always be present to allow safe exit. | | **Spacing & safe areas** | Required for device consistency. | | **WCAG contrast requirements** | Mandatory for accessibility and compliance. |
          ### Token Reference | UI Element | Token | Value | | --------------------------- | ------------------------------------------ | ------- | | **Background (top area)** | Surface/Neutral/100 → Color/Gray/100 | #EBECEF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Subtitle text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Progress bar track** | Surface/Neutral/100 → Color/Gray/100 | #EBECEF | | **Progress bar fill** | Icon/success → Color/Positive/600 | #189F60 | | **Hold still label** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Bottom sheet background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Bottom sheet title** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Bottom sheet subtitle** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C |
          ### Design Notes - The progress bar is the primary trust signal during the scan — ensure its fill color meets contrast requirements against the background. - "Hold still.." copy is critical; do not replace with passive messaging that fails to reinforce the physical requirement. - The Cancel button should be accessible but visually secondary to avoid accidental taps.
          *** ## Try again Shown when a scan attempt fails. The user is given troubleshooting tips via a swipeable carousel and offered two actions: Help (opens Common Issues) and Try again (returns to the scan).
          ### Customizable Elements | Area | What can be customized | Notes | | ----------------------- | ---------------------------------------- | -------------------------------------------------- | | **Title text** | "Let's try again" | Fully localizable; tone should remain encouraging. | | **Subtitle text** | Troubleshooting instruction | Fully localizable. | | **Carousel indicators** | Active and inactive dot colors | Active uses brand token. | | **Button — Help** | Label, border color, radius | Should be visually secondary. | | **Button — Try again** | Label, color, radius | Uses primary brand color. | | **Background Color** | Screen background | Must maintain contrast. | | **Brand Colors** | Header text, carousel dot, button accent | Uses brand tokens. | | **Footer** | "Verified by Incode" line | Optional but recommended. |
          ### Fixed Elements | Element | Why it is fixed | | ------------------------------ | ------------------------------------------------------------------------ | | **Retry logic** | Must route the user back to the active scan session. | | **Help path** | Must lead to the Common Issues screen; cannot be removed. | | **Passport illustration** | Must show the same document reference as the tutorial for consistency. | | **Carousel content** | Troubleshooting tips are product-defined; layout must not suppress them. | | **WCAG contrast requirements** | Mandatory for accessibility and compliance. |
          ### Token Reference | UI Element | Token | Value | | --------------------------------- | --------------------------------------------------------------------------- | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Subtitle text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Carousel dot (active)** | Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Carousel dot (inactive)** | Surface/Neutral/100 → Color/Gray/100 | #EBECEF | | **Button — Help text** | Button/Secondary/Text/Default → Text/Accent/Brand → Color/Brand/500 | #006AFF | | **Button — Try again background** | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Button — Try again text** | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Brand icon** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Footer icon** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Footer text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | ### Design Notes - "Let's try again" framing keeps the tone supportive. Avoid error-heavy language that may cause the user to abandon the flow. - The carousel is a key UX element — ensure dot indicators are sized and spaced for easy touch interaction.
          *** ## Common Issues Shown when the user taps "Help" from the Try Again screen. A list of the most frequent reasons a scan fails is displayed, with a single "Ok, try again" CTA to return the user to the scan flow.
          ### Customizable Elements | Area | What can be customized | Notes | | -------------------------- | ----------------------- | --------------------------------------------------------------- | | **Title text** | "Common issues" | Fully localizable. | | **Issue list text** | Individual issue labels | Fully localizable; keep each item short and scannable. | | **Issue icons** | Per-row icons | Can be replaced; must remain clearly associated with the issue. | | **Button — Ok, try again** | Label, color, radius | Uses primary brand color. | | **Background Color** | Screen background | Must maintain contrast. |
          ### Fixed Elements | Element | Why it is fixed | | ------------------------------ | ----------------------------------------------------------------------- | | **Issue list content** | Product-defined based on the most common real-world failure causes. | | **Single CTA** | Must route back to the scan; no secondary exit should be provided here. | | **List structure** | Icon + label pattern required for scannability and accessibility. | | **WCAG contrast requirements** | Mandatory for accessibility and compliance. |
          ### Token Reference | UI Element | Token | Value | | ------------------------------------- | --------------------------------------------------------------------------- | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Issue row background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Issue row separator** | Surface/Neutral/500 → Color/Gray/500 | #60667C | | **Issue icon** | Surface/Neutral/500 → Color/Gray/500 | #60667C | | **Issue label text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Button — Ok, try again background** | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Button — Ok, try again text** | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF |
          ### Design Notes - Issue labels should be plain language, not technical error codes. - Each row should be immediately scannable — users should be able to identify their problem within 2–3 seconds. - Avoid adding a back button or secondary CTA that could increase drop-off.

          *** ## Verifying Identity Shown after a successful chip read while the system processes and verifies the extracted data. A loading spinner and status message keep the user informed.
          ### Customizable Elements | Area | What can be customized | Notes | | ---------------------------- | ------------------------------- | ------------------------------------------------------ | | **Title text** | "Hold on a sec.." | Fully localizable; should remain short and reassuring. | | **Subtitle text** | "We're verifying your identity" | Fully localizable. | | **Spinner accent color** | Primary spinner stroke | Uses brand token; must remain visually clear. | | **Spinner background color** | Secondary spinner stroke | Should maintain contrast with accent. | | **Background Color** | Screen background | Must preserve readability and contrast. |
          ### Fixed Elements | Element | Why it is fixed | | --------------------------- | --------------------------------------------------------------- | | **Processing flow timing** | Linked to backend verification; cannot be shortened or skipped. | | **Spinner animation style** | Standardized across SDK for performance and recognizability. | | **Spacing & safe areas** | Required for device consistency. | | **Minimum contrast** | Required for accessibility and compliance. |
          ### Token Reference | UI Element | Token | Value | | ---------------------- | -------------------------------------------------------------------- | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Spinner background** | Spinner/Surface/Secondary → Surface/Brand/50 → Color/Brand/50 | #E5F0FF | | **Spinner accent** | Spinner/Surface/Primary → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Title text** | Spinner/Text/Title → Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Subtitle text** | Spinner/Text/Subtitle → Text/Body/500 (Secondary) → Color/Gray/500 | #60667C |
          ### Design Notes - Keep copy short to minimize cognitive load during the wait. - Use the subtitle to set clear expectations about what is happening in the background. - Avoid adding buttons or interactive elements during this state.



          *** ## Identity Verified Shown when the identity has been successfully verified following the NFC scan. The user receives a clear visual confirmation with a green checkmark before the flow advances to the next step.
          ### Customizable Elements | Area | What can be customized | Notes | | ---------------------- | -------------------------------- | ---------------------------------------------------------- | | **Confirmation text** | "Identity successfully verified" | Fully localizable; tone should be positive and conclusive. | | **Success icon color** | Green checkmark background | Uses positive/success token. | | **Background Color** | Screen background | Must maintain contrast with content. |
          ### Fixed Elements | Element | Why it is fixed | | ------------------------------ | --------------------------------------------------------------- | | **Auto-advance behavior** | Screen advances automatically; no CTA is required or permitted. | | **Success icon shape** | Standardized across the SDK for visual consistency. | | **Status color mapping** | Green = positive; required for consistent semantics. | | **WCAG contrast requirements** | Mandatory for accessibility and compliance. |
          ### Token Reference | UI Element | Token | Value | | --------------------------- | ----------------------------------------- | ------- | | **Background** | Surface/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Success icon background** | Icon/Status/Positive → Color/Positive/500 | #189F60 | | **Success icon checkmark** | Icon/Neutral/0 Static → Color/Gray/0 | #FFFFFF | | **Confirmation text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | ### Design Notes - This screen is intentionally minimal — the confirmation message and icon are the only elements needed. - Do not add additional copy, CTAs, or decorative elements that could distract from the success state. - The green icon must remain high-contrast against the white background.
          --- - Path: `design-and-ux/nfc-design` - URL: https://developer.incode.com/design-and-ux/nfc-design/ - Markdown: https://developer.incode.com/design-and-ux/nfc-design.md # NFC NFC Scan allows users to verify their identity by reading the embedded chip in their NFC-enabled passport or identity document. It extracts cryptographically secured identity data directly from the document chip, providing a higher assurance level than optical capture alone. NFC Scan typically occurs after the document has been captured via OCR and before the final verification result is returned. ![](https://developer.incode.com/assets/52aee9692f1eab621e42d14b8038e3ec.gif)
          *** ## Where it fits in the flow NFC Scan appears after the initial document capture step, once the system has confirmed the document is NFC-capable. It reads the chip data to cross-validate the information extracted during OCR and strengthen the overall verification result. Once the user successfully completes the NFC scan, the flow continues to identity confirmation and any downstream verification logic required by the application. *** ## User Flow The NFC Scan experience moves through several clear stages that guide the user from chip detection to successful read. An optional NFC chip presence screen first confirms whether the user's document supports NFC. The user is then introduced to the process through a tutorial screen explaining how to position their phone. Once the scan begins, the module reads the chip and provides real-time feedback. The user receives a success state or an error message with options to retry before continuing to the next step.

          *** ## Full Flow Map This diagram presents the full sequence of screens involved in NFC Scan, from the optional chip presence check and tutorial, to the active scan, success confirmation, and error handling paths including retry logic.
          *** ## Happy Path (Light & Dark) The ideal user journey when the NFC chip is detected and read successfully with no interruptions. The happy path represents the smoothest version of the experience, where the user confirms their document supports NFC, positions their phone as instructed, and the system successfully reads the chip data without requiring retries or corrections. Both light and dark mode previews are included so teams can validate visual consistency across themes.

          *** ## Best Practices Recommended guidelines for designing and implementing the **Upload Digital ID** experience. **✅ Do** - Clearly instruct users to hold their phone steady against the front cover of the document throughout the scan - Show real-time progress feedback so users know the scan is actively running. - Provide clear error messages with actionable next steps when the chip read fails. - Always offer a retry option so users can reattempt without restarting the full flow. **❌ Don’t** - Don't proceed with the NFC step if the document has not been confirmed as NFC-capable. - Don't proceed with the NFC step if the document has not been confirmed as NFC-capable. - Don't skip or reduce essential error states, including timeout and authentication failure screens. - Don't remove the "hold still" guidance during active scanning, as movement is the most common cause of scan failure.


          --- - Path: `design-and-ux/nfc-screens-states` - URL: https://developer.incode.com/design-and-ux/nfc-screens-states/ - Markdown: https://developer.incode.com/design-and-ux/nfc-screens-states.md # Screens & States A complete view of all screens the user may encounter during the **NFC Scan** experience. Each state includes a brief description and a direct link to its source in Figma. *** ## NFC Chip presence The optional entry screen shown before the NFC scan begins. The user is asked whether the NFC chip symbol is visible on their passport cover. Selecting "Yes" moves them to the tutorial and scan flow. Selecting "No" routes them out of the NFC flow.
          ## Tutorial The introduction screen that prepares the user to begin the NFC scan. The user is instructed to hold their phone close to the front cover of their passport. Tapping "Start scanning" initiates the scan session.
          ## Ready to scan Shown once the scan session has started and the module is listening for the NFC chip. A bottom sheet appears with positioning guidance, prompting the user to hold the phone steady. A Cancel button is available if the user needs to exit the scan.
          ## Scanning Shown while the module is actively reading the chip. A progress bar and "Hold still.." message keep the user informed. The bottom sheet updates to indicate that processing is in progress and the phone must not be moved.
          ## Successfully scanned Shown when the chip has been read and the data is being finalized. The progress bar completes and the bottom sheet updates to confirm the scan was successful. The user is prompted to continue holding still until reading is finished.
          ## Identity verified Shown when the identity has been successfully verified following the NFC scan. The user receives a clear visual confirmation with a green checkmark before the flow advances to the next step.
          ## Try again Shown when the first scan attempt fails. The user is prompted to remove their passport from any folder or cover, then hold the phone close to the front cover again. A swipeable tip carousel provides additional guidance. Two actions are available: Help and Try again.
          ## Common issues Shown when the user taps "Help" from the Try Again screen. A list of the most frequent reasons a scan fails is displayed, including the passport being in a cover, the phone being too far from the document, the chip being on a different page, movement during scanning, and interference from a phone case. A single "Ok, try again" button returns the user to the scan flow.
          ## Unable to authenticate Shown when the chip cannot be authenticated after all retry attempts are exhausted. The user is informed that the document chip could not be verified and is presented with a Continue button to proceed with the flow despite the failed NFC read.
          --- - Path: `design-and-ux/nfc-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/nfc-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/nfc-specs-guidelines.md # Specs & Guidelines The **NFC Scan** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.

          *** ## Responsiveness & Viewport Adaptation The **NFC Scan** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet.
          ### How the layout adapts across devices | Breakpoint | Behavior | | ---------------------------------- | ---------------------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; passport illustration scales down to maintain visibility. | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent. | | **Tall/narrow Android devices** | Vertical spacing is redistributed; title and illustration remain pinned to the top. | | **Foldables (e.g., Pixel Fold)** | Larger illustration and more balanced white space; content remains centered. | | **Tablets** | Increased layout margins; illustration and bottom sheet scale proportionally. | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding applied. |
          ### What is responsive (and customizable) | Element | Responsive Behavior | Customizable | | --------------------- | ---------------------------------------------------- | ------------------------------ | | Passport illustration | Scales proportionally by viewport height | No | | Title text | Remains centered in the layout and pinned at the top | Yes, text is fully localizable | | Progress bar | Width adjusts to container width | Color | | Bottom sheet | Height adapts to content; anchored to bottom | Limited (background color) | | Buttons | Width adjusts to container; vertical spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Scales padding according to device safe insets | Limited (color only) | | Icons | Remain centered and maintain distance to the title | Color & style |
          ### What remains fixed across breakpoints | Element | Reason | | -------------------------- | ---------------------------------------------------- | | NFC chip reading logic | Must remain consistent for reliable chip detection. | | Progress bar behavior | Tied to actual scan progress; cannot be visual only. | | Cancel button availability | Must always be reachable regardless of screen size. | | Minimum text size | Required for readability & WCAG compliance. | | Minimum tap target sizes | Ensures accessibility on mobile. | | Overall hierarchy | Prevents cognitive load at different sizes. |
          ### Design Notes - The passport illustration always remains the dominant visual element, regardless of screen size. - Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. - The bottom sheet anchors to the bottom of the viewport — avoid adding custom UI that may overlap with it. - Multiline text is handled gracefully, but avoid extremely long localized strings.

          *** ## Prototype & Transitions **NFC Scan** includes predefined transition rules and micro-interactions that ensure a smooth user experience across all states — from the chip presence check and tutorial, through the active scan and progress feedback, to success and error outcomes. Timing, easing, and animation guidelines are documented directly in Figma prototypes.

          *** ## Localization The **NFC** Scan module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** - All user-facing text is fully localizable, including scan instructions, status messages, error labels, and button labels. - UI adjusts to prevent truncation and maintain readability across all screen states. - Spacing and vertical rhythm adapt to accommodate longer languages. - Buttons and CTAs automatically expand to fit translated labels. - The bottom sheet title and subtitle are independently localizable to allow precise control over tone per region.Ensure localized strings for scan instructions preserve clarity — ambiguous phrasing can cause users to move the phone and fail the scan. - Incode supports a variety of languages.
          --- - Path: `design-and-ux/nfc-v1-vs-v2-comparison` - URL: https://developer.incode.com/design-and-ux/nfc-v1-vs-v2-comparison/ - Markdown: https://developer.incode.com/design-and-ux/nfc-v1-vs-v2-comparison.md # NFC V1 vs V2 Comparison In V1, NFC Scan offers a basic chip reading experience with minimal user guidance, no dedicated intro screen with the Incode header, limited scan state feedback, and restricted customization options. The scanning flow runs with a simple bottom sheet and generic status labels. In V2, NFC Scan delivers a significantly improved experience with a dedicated tutorial screen, an NFC chip presence check, a cleaner bottom sheet design with bolder typography, real-time progress feedback through a green progress bar, structured error handling with a retry carousel, and full alignment with the token-based design system — resulting in a clearer, more guided, and more brandable flow.

          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | -------------------------- | -- | -- | --------------------------------------------------------------------------------------------------------- | | NFC chip scanning | ✅ | ✅ | Both versions read and extract data from NFC-enabled passport chips. | | NFC chip presence check | ❌ | ✅ | V2 includes an optional screen to confirm the document supports NFC before initiating the scan. | | Retry flow | ✅ | ✅ | Both versions allow the user to retry after a failed scan attempt. | | Common issues screen | ❌ | ✅ | V2 includes a dedicated help screen listing the most frequent causes of scan failure. | | Error states | ✅ | ✅ | Both versions handle general error cases the user may encounter. | | Dark mode support | ✅ | ✅ | Both versions support dark and light display modes. | | Customization options | ❌ | ✅ | V1 provides limited customization, while V2 allows full control over text, colors, buttons, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime. | Behavior | V1 | V2 | Notes | | -------------------- | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | | Tutorial behavior | Basic intro screen with a tilted passport illustration and back/close navigation | Dedicated intro screen with an upright passport illustration, Incode header, and a single "Start scanning" CTA | V2 is more focused and directs the user's attention toward the scanning instructions with a cleaner visual hierarchy. | | Scan state feedback | Simple bottom sheet with "Ready to scan" and "Hold still.." labels and a dot-row progress indicator | Bottom sheet with bold "Ready to scan" heading, descriptive subtitle, and a green linear progress bar at the top | V2 actively communicates scanning progress so users understand what the module is doing at each moment. | | Success confirmation | "Document chip scan success" with a green checkmark | "Identity successfully verified" with a green checkmark badge | V2 language reflects the full verification outcome rather than just the chip read result. | | Error handling | Generic error screen | Structured "Let's try again" screen with a swipeable tip carousel, Help CTA linking to Common Issues, and a Try again CTA | V2 gives users specific, actionable guidance on what went wrong and how to fix it. | | Navigation controls | Back arrow and X close button in the header | No navigation chrome; Incode header only | V2 removes distracting navigation elements to keep the user focused on completing the scan. | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. |
          *** ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: - Less engineering work to override UI elements - Consistent branding across all NFC Scan screens - Predictable behavior when changing settings - Reduced risk of breaking flows - Clear separation between visual tokens and experience configuration V2 centralizes all customization options under a single structure, so developers always know where to look and what they can modify. This includes button styles, progress bar color, bottom sheet typography, instructional text, error message styling, and the "Verified by Incode" footer — making it straightforward to align the module with your brand without affecting core chip reading and verification logic.

          --- - Path: `design-and-ux/ocr-review-design` - URL: https://developer.incode.com/design-and-ux/ocr-review-design/ - Markdown: https://developer.incode.com/design-and-ux/ocr-review-design.md # OCR Review The **OCR** **Review** module presents the information automatically extracted from the identity document using OCR. Relevant fields detected on the document—such as full name, date of birth, gender, document number, and expiration date—are pre-filled for the user to review and confirm. This step helps ensure the extracted data is accurate before continuing the verification or onboarding process. *** ## Where it fits in the flow The \*\*OCR Review\*\* module is typically performed immediately after the ID Capture step and before identity verification is finalized. During this stage, the information extracted from the identity document using Optical Character Recognition (OCR) is presented to the user for review and confirmation. This helps ensure the captured data is accurate and complete before continuing the onboarding or verification process.
          *** ## User Flow The **OCR Review** experience follows a four-step flow that begins immediately after the ID Capture step. First, the user captures their identity document. The system then processes the document and extracts the relevant information using Optical Character Recognition (OCR). Next, the extracted data is presented to the user for review and confirmation. Finally, once the information is verified, the user can continue the onboarding or identity verification process.
          *** ## Full Flow Map
          *** ## Happy Path (Light & Dark) The ideal user journey occurs when the information from the identity document is successfully extracted and displayed without errors or interruptions. The happy path represents the smoothest version of the OCR Review experience: the user captures their identity document, the system automatically extracts relevant information using Optical Character Recognition (OCR), and the extracted fields are presented for review and confirmation before continuing the verification process. The experience follows a simple three-step flow: the ID capture step, the OCR processing and extraction state, and the review and confirmation of the extracted information.


          ## Best Practices Recommended guidelines for designing and implementing the **OCR Review** experience. ✅ Do - Clearly display the extracted information so users can quickly review and confirm the data captured from the identity document. - Highlight editable fields and allow users to correct any inaccurate or incomplete information before continuing. - Provide clear progress indicators between the ID Capture, OCR processing, and review steps to maintain transparency during the verification flow. ❌ Don't - Don’t continue the verification process without giving users the opportunity to review the extracted information. - Don’t present incomplete, poorly formatted, or low-confidence OCR results without prompting the user to retry or recapture the document.
          --- - Path: `design-and-ux/phone-input-customization` - URL: https://developer.incode.com/design-and-ux/phone-input-customization/ - Markdown: https://developer.incode.com/design-and-ux/phone-input-customization.md # Customization This section outlines the elements you can customize within the **Phone Number Input** module to match your brand while preserving Incode’s core UX. It clarifies which areas are flexible, such as text, and brand colors and which elements remain fixed to ensure consistency, accessibility, and optimal capture performance across platforms.
          ## Empty Form Screen This screen represents the initial state of the Phone Number Input flow. The user is prompted to enter their phone number and country code. At this stage, no input is provided, and the Continue button is disabled.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :------------------------------------- | :------------------------------------------------ | | **Text** | Title, subtitle, button label | Fully localizable; tone can be adapted | | **Input Field** | Border, background, placeholder color | Must follow contrast and accessibility guidelines | | **Brand Colors** | Header, buttons, and accent elements | Uses Incode token structure for consistency | | **Buttons** | Label, color states (enabled/disabled) | Must meet WCAG contrast ratio |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------------------- | :----------------------------------------------- | | Layout structure | Ensures alignment across onboarding modules | | Input field shape and proportions | Must remain consistent with other form modules | | Spacing & safe areas | Optimized for readability and touch ergonomics | | Font hierarchy | Maintains visual clarity across all device sizes | | Close icon position | Standardized for user familiarity | | WCAG minimum contrast | Mandatory for accessibility compliance |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :--------------------------- | :-------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | Subtitle text | `text-body-secondary` | `#60667C` | | Input placeholder | `input-text-field-placeholder` | `#A3A8B8` | | Input border | `input-border-default` | `#EBECEF` | | Input surface | `input-surface-default` | `#FCFCFD` | | Dropdown text | `dropdown-text-input-default` | `#262831` | | Dropdown border | `dropdown-border-default` | `#EBECEF` | | Button background (disabled) | `button-primary-surface-disabled` | `#EBECEF` | | Button text (disabled) | `button-primary-text-disabled` | `#A3A8B8` |
          ### Design Notes * If customizing text, ensure clarity and brevity (e.g., “Enter your number” instead of “Please provide your mobile phone”). * When adjusting button color, maintain strong contrast for accessibility.
          *** ## Form Filling Screen (Focused State) This screen represents the focused input state of the Phone Number Input module. When the user begins typing, the input field becomes highlighted with the focused border color, and the Continue button activates once the phone number is valid. This state communicates interaction and readiness to proceed.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :-------------------------- | :-------------------------------------- | :------------------------------------------------ | | **Text** | Title, subtitle, button label | Fully localizable; tone can be adapted | | **Input Field (Focused)** | Border color, surface, placeholder text | Must meet accessibility and contrast requirements | | **Dropdown (Country Code)** | Icon, border, and surface colors | Uses shared input styles and tokens | | **Brand Colors** | Button and active states | Derived from brand token system | | **Buttons** | Label, enabled/disabled colors | Must align with WCAG standards |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :--------------------------- | :------------------------------------------------- | | Layout structure | Maintains alignment and consistency across modules | | Input shape and field height | Standardized for usability and accessibility | | Spacing & padding | Optimized for touch and visual rhythm | | Typography hierarchy | Ensures consistent information hierarchy | | Button dimensions | Fixed to meet platform accessibility requirements | | WCAG minimum contrast | Required for certification and compliance |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :-------------------------- | :------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | Subtitle text | `text-body-secondary` | `#60667C` | | Input border (focused) | `input-border-focused` | `#006AFF` | | Input text | `input-text-field-default` | `#262831` | | Input surface (focused) | `input-surface-focused` | `#FCFCFD` | | Dropdown text | `dropdown-text-input-default` | `#262831` | | Dropdown border | `dropdown-border-default` | `#EBECEF` | | Button background (enabled) | `button-primary-surface-default` | `#006AFF` | | Button text (enabled) | `button-primary-text-default` | `#FFFFFF` | | Background surface | `surface-neutral-0` | `#FFFFFF` |
          ### Design Notes * You can adjust the focus color to match your brand, but ensure it remains visually distinct from error states. * If modifying typography, preserve visual differences between title, subtitle, and input to maintain clarity. * Always test your custom color scheme in light and dark modes for accessibility consistency.
          *** ## OTP Entry Screen (Focused State) This screen appears after the user enters their phone number and the system sends a one-time passcode (OTP) via SMS. The user is prompted to enter the code in a series of clearly separated fields. As the input fields gain focus, the borders and surfaces adapt to indicate active interaction. A countdown below the button communicates when the user can resend the code.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :------------------- | :------------------------------------- | :------------------------------------------------------------- | | **Text** | Title, helper text, countdown label | Fully localizable; supports dynamic values (e.g., countdown) | | **OTP Fields** | Border and text color in focused state | Must maintain accessibility contrast and clarity | | **Buttons** | Label, color states (disabled/enabled) | Must meet WCAG 2.1 contrast requirements | | **Resend Code Text** | Color, hover/press state | Uses tertiary text token, consistent with interaction patterns | | **Brand Colors** | Primary accent and focus color | Derived from `brand-500` and related tokens |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :-------------------- | :---------------------------------------------------- | | Input field layout | Ensures consistency across all OTP verification steps | | Field spacing | Optimized for readability and tap accuracy | | Countdown behavior | Fixed duration to standardize retry experience | | Button placement | Standard alignment for visual rhythm and reachability | | Typography hierarchy | Maintains cross-platform readability | | WCAG minimum contrast | Required for accessibility certification |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :--------------------------- | :-------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | OTP input border (focused) | `input-border-focused` | `#006AFF` | | OTP input text | `input-text-field-default` | `#262831` | | OTP input surface (focused) | `input-surface-focused` | `#FCFCFD` | | Button background (disabled) | `button-primary-surface-disabled` | `#EBECEF` | | Button text (disabled) | `button-primary-text-disabled` | `#A3A8B8` | | Resend code text | `button-tertiary-text-disabled` | `#60667C` | | Countdown timer text | `text-body-secondary` | `#60667C` | | Background surface | `surface-neutral-0` | `#FFFFFF` |
          ### Design Notes * You can adjust the focus color to match your brand, but ensure it remains visually distinct from error states. * If modifying typography, preserve visual differences between title, subtitle, and input to maintain clarity. * Always test your custom color scheme in light and dark modes for accessibility consistency.
          *** ## OTP Checking (Verification Loading) Screen This screen represents the verification state of the Phone Number Input module. After the user submits the one-time passcode (OTP), the system verifies the input. The interface locks input field and transitions the button to a loading spinner, indicating that validation is in progress. During this state, interaction is temporarily disabled until the verification completes.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :------------------------------ | :---------------------------------- | :-------------------------------------------------- | | **Text** | Title and helper text | Fully localizable; tone can be adapted | | **OTP Fields (Disabled)** | Border, background, and text color | Should visually indicate a non-editable state | | **Buttons** | Spinner color, background, and text | Spinner inherits brand color for visual consistency | | **Resend / Change Number Text** | Color and link state | Uses tertiary text token | | **Brand Colors** | Button and header accents | Derived from `brand-500` and `brand-400` tokens |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :----------------------- | :--------------------------------------------------------- | | Layout structure | Ensures consistency across all verification states | | Button position | Aligned for accessibility and predictable interaction flow | | Input layout and spacing | Maintains readability during transition states | | Loading spinner size | Standardized for cross-platform consistency | | Typography hierarchy | Maintains readability and balance | | WCAG minimum contrast | Ensures accessible visual design |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :---------------------------------- | :------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | OTP input text (disabled) | `input-text-field-disabled` | `#A3A8B8` | | OTP input border (disabled) | `input-border-disabled` | `#EBECEF` | | OTP input surface (disabled) | `input-surface-disabled` | `#EBECEF` | | Button background (default/loading) | `button-primary-surface-default` | `#006AFF` | | Button text (default/loading) | `button-primary-text-default` | `#FFFFFF` | | Spinner accent | `surface-brand-400-static` | `#3388FF` | | Resend/change number text | `button-tertiary-text-disabled` | `#60667C` |
          ### Design Notes * Avoid introducing additional text or loaders elsewhere on the screen. * If modifying color schemes, ensure that disabled input states remain visibly distinct.
          *** ## Success Screen This screen appears after the user’s phone number has been successfully verified. It provides a clear confirmation of success before the flow transitions to the next module or completion step. The layout is intentionally minimal to maintain focus on the success feedback.
          ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :--------------- | :-------------------------- | :-------------------------------------- | | **Text** | Confirmation message | Fully localizable; tone can be adapted | | **Success Icon** | Color and animation | Must use approved positive color tokens | | **Brand Colors** | Header and accent | Based on `brand-500` values | | **Background** | Color and safe area padding | Must preserve contrast and clarity |
          ### Fixed Elements | **Element** | **Why it is fixed** | | :--------------------- | :------------------------------------------------------ | | Layout structure | Ensures consistent feedback presentation across modules | | Icon size and position | Optimized for recognition and accessibility | | Text alignment | Central alignment for visual balance | | Typography hierarchy | Maintains brand consistency and readability | | WCAG minimum contrast | Required for accessibility compliance |
          ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :----------------- | :--------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | Success icon | `icon-status-positive` | `#189F60` | | Background surface | `surface-neutral-0` | `#FFFFFF` |
          ### Design Notes * Keep the confirmation text short and positive; don’t include instructions or next steps here. * If using customized colors, ensure they don’t reduce the contrast of the success message or icon.
          *** ## OTP Error Screen This screen appears when the user enters an incorrect or expired code. It provides immediate visual feedback through red highlight states and an error message. The interface allows the user to resend the code or change their phone number before attempting verification again.  ### Customizable Elements | **Area** | **What can be customized** | **Notes** | | :-------------------------------- | :----------------------------- | :---------------------------------------------------- | | **Text** | Error message and helper text | Fully localizable; keep concise and polite tone | | **Input Fields (Error)** | Border, background, text color | Must maintain strong color contrast for accessibility | | **Error Icon** | Color | Uses negative (error) status color token | | **Buttons** | Label, color state | Maintain clear disabled and active visual distinction | | **Links (Resend / Change Email)** | Color and hover states | Use brand accent color for recognition | | **Brand Colors** | Header and accents | Should align with existing brand color tokens |  ### Fixed Elements | **Element** | **Why it is fixed** | | :---------------------------- | :-------------------------------------------- | | Layout structure | Maintains consistency across OTP states | | Input field shape and spacing | Optimized for error visibility | | Button placement | Standardized for user familiarity | | Typography hierarchy | Preserves consistent hierarchy and legibility | | Error message position | Fixed to align directly below input fields | | WCAG minimum contrast | Required for accessibility compliance |  ### Token Reference | **UI Element** | **Token** | **Raw Value** | | :---------------------------- | :-------------------------------- | :------------ | | Title text | `text-body-primary` | `#262831` | | Error border | `input-border-negative` | `#E71111` | | Error surface | `input-surface-negative` | `#EBECEF` | | Error text | `input-text-helper-negative` | `#E71111` | | Error icon | `input-icon-negative` | `#E71111` | | Input text (default) | `input-text-field-default` | `#262831` | | Button background (disabled) | `button-primary-surface-disabled` | `#EBECEF` | | Button text (disabled) | `button-primary-text-disabled` | `#A3A8B8` | | Links (Resend / Change Email) | `button-tertiary-text-default` | `#006AFF` | | Background surface | `surface-neutral-0` | `#FFFFFF` |  ### Design Notes * Error messaging should remain concise — don’t overload users with explanations. * Avoid replacing the red border with icons alone; border color communicates immediacy effectively. --- - Path: `design-and-ux/phone-input-screens-states` - URL: https://developer.incode.com/design-and-ux/phone-input-screens-states/ - Markdown: https://developer.incode.com/design-and-ux/phone-input-screens-states.md # Screens & States A complete view of all screens the user may encounter during the **Phone Number Input** experience. Each state includes a brief description. *** ## Enter Phone Number This screen prompts the user to input their phone number for verification. It’s the initial state of the Phone Number Input step, featuring a country code selector, number input field, and a disabled Continue button until a valid format is detected. Country Code selection appears when the user interacts with the country code dropdown. It allows selection from a list of international codes, ensuring compatibility with global users.

          ## Enter Code (OTP Input) Displayed after the user submits a valid phone number. The system sends an SMS with a one-time code, and this screen prompts the user to enter it. A countdown timer indicates when the “Resend code” option becomes available.

          ## Success After entering or auto-filling the correct code, the system verifies it and transitions to a success screen confirming “Phone verified!” before proceeding to the next module.

          ## Error States Displayed when the user enters an incorrect or expired code. The UI highlights the input fields in red and provides feedback such as: * “Incorrect code, please try again.” * “Code expired, please request a new one.” Retry and resend options remain accessible, ensuring a smooth recovery path. --- - Path: `design-and-ux/phone-input-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/phone-input-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/phone-input-specs-guidelines.md # Specs & Guidelines The **Phone Number Input** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout. *** ## Responsiveness & Viewport Adaptation The **Phone Number Input** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet. This ensures that key interactive areas, such as the input area, country selector, and primary CTA always remain visible and reachable without requiring scrolling or zooming.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | :--------------------------------- | :--------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | Components stack vertically; country selector and input field scale slightly | | **Standard phones (iPhone 12–16)** | Full layout displayed with consistent spacing and button hierarchy | | **Tall/narrow Android devices** | Vertical spacing adjusts dynamically to maintain visual balance | | **Foldables (e.g., Pixel Fold)** | Input group stays centered; margins expand symmetrically | | **Tablets** | Wider margins with proportional input scaling; buttons stay centered | | **Desktop web** | Content is centered with fixed max-width and extended safe padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | :------------------ | :--------------------------------------------------- | :-------------------------- | | Input field & label | Scale and align based on viewport width | Border, color, placeholder | | Country selector | Expands in width proportionally to maintain spacing | Icon, surface, border color | | Buttons | Width adjusts; spacing below inputs adapts | Color & text | | Countdown text | Reflows beneath inputs; stays visible on all devices | Yes, fully localizable | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Fill full viewport; safe padding adjusts per device | Yes | | Header area | Padding and alignment scale with safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | :----------------------- | :-------------------------------------------- | | OTP verification logic | Core function, must stay consistent | | Input field proportions | Ensures usability and recognition consistency | | Minimum text size | Maintains WCAG readability standards | | Minimum tap target sizes | Accessibility requirement across devices | | Layout hierarchy | Preserves visual predictability and rhythm |
          ### Design Notes - Input grouping (country code + phone field) should always be treated as a single logical component. - Button placement remains consistent across states (focused, disabled, success) to maintain predictability. - The module is built for fast entry; avoid introducing animations or long transitions between states. - Keep vertical spacing consistent with other verification steps (e.g., OTP entry) to support modular flow design. - Typography tokens ensure clear contrast and legibility even in dark mode; test brand overrides for sufficient color ratios. *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.
          *** ## Prototype & Transitions Phone Number Input includes predefined transition rules and micro-interactions that ensure a smooth user experience. Animation guidelines are documented directly in Figma prototypes.
          *** ## Localization The **Phone Number Input** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          ### Key considerations - All user-facing text (titles, labels, placeholders, buttons, countdowns) is fully localizable. - Text element's width and padding flex to accommodate longer translations (e.g., German, Portuguese). - Spacing tokens adjust dynamically to preserve vertical rhythm in longer translations.
          --- - Path: `design-and-ux/phone-input-v1-vs-v2-comparison` - URL: https://developer.incode.com/design-and-ux/phone-input-v1-vs-v2-comparison/ - Markdown: https://developer.incode.com/design-and-ux/phone-input-v1-vs-v2-comparison.md # Phone Number V1 vs V2 Comparison V1 provides a basic phone number input and verification experience. While it supports the necessary validation logic, the flow offers less flexibility in adapting the experience to different product needs, markets, or branding requirements. V2 rethinks the flow to be clearer, and easier to customize, introducing better error handling, and alignment with the token-based system. The V2 experience is designed to reduce user confusion, lower drop-off during verification, and ensure consistent look across platforms and markets.


          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | -------------------------- | ------- | -------- | ------------------------------------------------------------------ | | Phone number verification | ✅ | ✅ | Core functionality present in both versions | | Inline validation | ✅ | ✅ | Validation logic during entry supported in both versions | | Error states coverage | ✅ | ✅ | Both handle errors, V2 structures them better and improves clarity | | Customization options | Limited | Advanced | V2 supports token-based customization | | Documentation completeness | Basic | Enhanced | V2 provides enhanced, standardized documentation coverage |
          ***
          ## Behavior Differences How the module behaves during runtime. | Behavior | V1 | V2 | Notes | | --------------------- | -------------------------------------- | --------------------------------------------------------- | --------------------------------------------------------------------------- | | Error handling | Separate error states, less contextual | Clear, actionable error messages with improved UX writing | V2 reduces cognitive load | | State transitions | Default transitions | Defined transitions between states | V2 includes transition smoothness and consistency as part of the experience | | Flow and UI structure | Functional but less standardized | Structured and consistent | Aligned with the tokenized design system | ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.
          --- - Path: `design-and-ux/phone-number-input-design` - URL: https://developer.incode.com/design-and-ux/phone-number-input-design/ - Markdown: https://developer.incode.com/design-and-ux/phone-number-input-design.md # Phone Number Input The [Phone Number Input](/features-and-modules/phone-number-input/) module verifies a user's mobile number using either Silent Network Authentication (SNA) or an SMS-based one-time password (OTP). It ensures that the user has access to a valid phone number, which can be used for identity verification, account recovery, or two-factor authentication workflows. When available, Silent Network Authentication validates the phone number directly through the user's mobile network operator, without requiring the user to enter a code. If SNA is unavailable or unsuccessful, the system automatically falls back to SMS OTP verification. This ensures both a frictionless experience and maximum verification coverage. *** ## Where it fits in the flow Phone Number Input typically appears early in the onboarding or verification flow, often before ID and Selfie Capture modules. Once the phone number is successfully verified (via Silent Network Authentication or SMS OTP), the user proceeds to the next step. This may include biometric verification, document capture, or additional compliance checks depending on configuration. *** ## User Flow The sections below walk through each verification path: Silent Network Authentication first, then SMS OTP. ### Silent Network Authentication When SNA is enabled, verification begins automatically after the user enters their phone number. If the user's carrier and device support SNA, the number is verified silently in the background. If not, the flow falls back to SMS OTP. 1. The user enters their phone number and confirms. 2. The system initiates verification. If supported by the user's carrier and device: - A background network validation is triggered. - No SMS is sent. - The user does not need to enter a code. If validation succeeds, verification completes automatically. If SNA is unavailable or unsuccessful, the flow falls back to SMS OTP. ### OTP Verification The Phone Number Input experience guides the user from entering their phone number to completing verification via OTP. 1. The user enters their phone number and confirms. 2. The system sends a verification code via SMS. 3. The user inputs the received code to complete verification. If the code is incorrect or expired, the flow provides clear retry options, including resending the code or editing the phone number. Once the number is successfully verified, the user advances automatically to the next module. *** ## Full Flow Map SNA This diagram presents the full sequence of screens involved in the **Phone Number Input module**, including: - Phone number input and country code selection - Silent Network Authentication attempt - SMS OTP entry (if required) - Successful verification - Error handling and retry paths It visually represents both the ideal path and alternative fallback scenarios, helping teams understand all possible user interactions and system states within the module. ## Full Flow Map OTP This diagram presents the full sequence of screens involved in the **Phone Number Input** module, from initial input, country code selection, and OTP entry, to successful verification or error handling. It visually represents both the ideal path and alternative error or retry paths, helping teams understand all possible user interactions and system states within the module. *** ## Happy Path (Light & Dark) SNA When Silent Network Authentication is available, the happy path is fully automatic. The user enters their phone number and advances without entering a code. Phone Number Input module - Happy Path in Light mode
          Phone Number Input module - Happy Path in Dark mode ## Happy Path (Light & Dark) OTP The ideal user journey when the phone number is entered and verified successfully with no interruptions. The happy path represents the smoothest experience: the user inputs a valid phone number, receives the SMS code instantly, enters it correctly, and proceeds without retries. Both light and dark mode previews are included so design, product, and engineering teams can validate visual consistency and accessibility across themes. Phone Number Input module - Happy Path in Light mode
          Phone Number Input module - Happy Path in Dark mode *** ## Best Practices Recommended guidelines for designing and implementing the **Phone Number Input** experience. **✅ Do** - Keep validation instant and informative. - Provide clear feedback after OTP code submission (success or error). - Provide a resend option and allow time buffer for delivery. - Clearly communicate progress during background verification for SNA. **❌ Don't** - Avoid long delays or silent failures. - Create long loading states without user feedback.
          --- - Path: `design-and-ux/prizma-design-foundations` - URL: https://developer.incode.com/design-and-ux/prizma-design-foundations/ - Markdown: https://developer.incode.com/design-and-ux/prizma-design-foundations.md

          Design System

          Prizma.

          Prizma is Incode’s single source of truth for our design language. It provides the tokens, components, and guidelines that help teams build fast, consistent, accessible experiences without sacrificing flexibility.

          Vision

          Prizma Design System is a scalable product UI infrastructure.

          It defines the contract between design and development that enables consistent delivery, faster iteration, and reliable customization across platforms. Prizma is Incode’s single source of truth for our design language — tokens, components, and guidelines that help teams build fast, consistent, accessible experiences without sacrificing flexibility.

          Prizma is

          • A product UI foundation that keeps experiences consistent as products scale.
          • A shared contract between design and engineering, so what’s designed can be implemented predictably.
          • A system of tokens, components, patterns, and guidelines that supports reliable customization.

          Prizma is not

          • Just a component library or a style guide.
          • A static “Lego instruction manual.” Prizma is built to evolve with products and platforms.
          • A constraint. It balances consistency with the adaptability teams need to ship.
          Principles
          Single source of truth

          One place where design decisions live, versioned and accessible to every team.

          Design–dev contract

          Tokens connect Figma to code, so what’s designed is what gets built.

          Reliable customization

          Built to be extended without breaking. Override at the token layer, not the component.

          Scales with products

          Prizma is infrastructure, not a style guide. It grows as the product suite grows.

          The name

          Prizma draws inspiration from the optical properties of a prism.

          A prism bends and reflects light into a vibrant spectrum. In the same way, Prizma transforms a single foundation into many expressions — adapting to different products, platforms, and needs while maintaining a cohesive visual language. The name comes from the Serbian word for “prism” — призма.

          --- - Path: `design-and-ux/qualified-signature-design` - URL: https://developer.incode.com/design-and-ux/qualified-signature-design/ - Markdown: https://developer.incode.com/design-and-ux/qualified-signature-design.md # Qualified Signature **Qualified Signature** is a key step in onboarding and agreement workflows. It presents users with a document to review and a set of legally required consent statements to confirm before completing the signing process. *** ## Where it fits in the flow **Qualified Signature** is typically positioned after face capture, ID capture and OTP verification, after identity and document checks have been completed, depending on the configured workflow. *** ## User Flow The **Qualified Signature experience** guides users through Terms and conditions, review and sign, and creating the signature.
          *** ## Full Flow Map
          *** ## Happy Path (Light & Dark) The ideal user journey occurs when the user accepts the terms and conditions, reviews the document, accepts the terms and conditions again, creates the signature, and reaches the success screen without interruptions.
          **The happy path** represents the smoothest version of the experience: the user accepts the terms and conditions, opens and reviews the contract, accepts the terms and conditions, creates the signature, and the system processes and confirms it. The user reaches the success screen on the first attempt without encountering any errors.
          **Light and dark mode** previews are included to allow teams to validate visual consistency, accessibility, and contrast across themes and platforms.
          *** ## Best Practices **Best Practices for Designing and Implementing the Qualified Signature Experience** ✅ Do - Display the full contract or document with a clear link to open and read it before signing. - Require each consent checkbox to be checked individually before the "Finish signing" button becomes active. - Keep consent statements concise, specific, and easy to understand. - Provide clear visual feedback during processing to prevent duplicate submissions. ❌ Don't - Don't allow the "Finish signing" button to be tapped unless all checkboxes are checked. - Don't allow duplicate submissions by leaving the button active while the signature is being processed.
          --- - Path: `design-and-ux/radio` - URL: https://developer.incode.com/design-and-ux/radio/ - Markdown: https://developer.incode.com/design-and-ux/radio.md # Radio Button Radio buttons allow users to select exactly one option from a set. Unlike checkboxes, selecting one automatically deselects others. Prizma radios are always used in groups of two or more. ## Try it live Pick one — real radio inputs styled with the radio tokens.

          Interactive — select one

          States
          Selected.radio.is-selected

          The chosen option. The knob fills with brand color.

          Unselected.radio

          Available but not chosen. Selecting it automatically deselects the others in the group.

          Disabledopacity: 0.4

          Unavailable option, shown muted and non-interactive.

          Tokens
          ```dh-comp-tokens --radio-surface-default | Unselected background | Component --radio-surface-selected | Selected background | Component --radio-surface-disabled | Disabled background | Component --radio-border-default | Unselected border | Component --radio-border-selected | Selected border | Component --radio-border-disabled | Disabled border | Component --radio-dot-color | Inner dot color | Component ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/screen-states-ekyb` - URL: https://developer.incode.com/design-and-ux/screen-states-ekyb/ - Markdown: https://developer.incode.com/design-and-ux/screen-states-ekyb.md # Screens & States This section provides a complete overview of all possible user-facing states within the eKYB Verification experience. *** ## Entry Form Entry point of the eKYB module. This screen collects the business and beneficial ownership information required for electronic Know Your Business (eKYB) verification. The set of displayed fields depends on the selected verification source (e.g., Driver's License, Credit Bureau, Government Registry). In this example, the flow uses Driver's License verification.
          ## Form filling This state appears while the user is actively entering business and beneficial ownership information in the eKYB form. Focused fields are visually highlighted, and system components such as the keyboard are displayed. Real-time validation may occur as the user types, guiding accurate data entry before submission.

          ## Form Processing (Inline Submission State) Displayed once all required fields are completed with valid values. All form fields appear in a disabled, read-only state while the submission is in progress, preventing edits during the loading phase. A loading spinner replaces the Continue button label to indicate that the system is processing the request.
          ## Form Processing The form is replaced by a dedicated processing screen displaying a loading spinner and a "Processing..." label. This full-screen state indicates that the business data is being transmitted and validated against official registries
          ## Form Error Displayed when one or more fields contain invalid or mismatched data (e.g., incorrect UBO surname). Invalid fields are highlighted with a red border and inline error messaging beneath the affected field.
          ## Processing Screen Indicates that eKYB verification is in progress after successful submission. A full-screen loading state with spinner and “Processing…” message communicates that backend services are validating the provided data. No user interaction is available during this step.
          ## Failure Screen Shown when eKYB verification fails due to backend validation, service errors, or data mismatches. A clear error message and icon communicate the outcome. The Try again CTA allows the user to restart the verification attempt. Depending on configuration, retry limits or escalation logic may apply.
          ## Success Screen Displayed when eKYB verification is successfully completed. A confirmation icon and message (“eKYB verified!”) indicate completion of the module. The system may automatically advance to the next step or wait for user confirmation, depending on configuration. This marks the successful end of the eKYB verification stage. --- - Path: `design-and-ux/screen-states-ocr` - URL: https://developer.incode.com/design-and-ux/screen-states-ocr/ - Markdown: https://developer.incode.com/design-and-ux/screen-states-ocr.md # Screen & States This section provides a complete overview of all possible user-facing states within the **OCR Review module** *** ## Review data editable This screen displays the information extracted from the identity document in an editable format, allowing users to review and correct any inaccurate or incomplete data before continuing the verification process. Common fields include full name, date of birth, gender, document number, and expiration date. ## Review data non-editable This screen displays the information extracted from the identity document in a non-editable format, allowing users to review the captured data before continuing the verification process. Common fields include full name, date of birth, gender, document number, and expiration date.
          --- - Path: `design-and-ux/screen-states-watchlist-business` - URL: https://developer.incode.com/design-and-ux/screen-states-watchlist-business/ - Markdown: https://developer.incode.com/design-and-ux/screen-states-watchlist-business.md # Screens & States This section provides a complete overview of all possible user-facing states within the **Watchlist for business** *** ## Watchlist Empty The initial state displays a simple business information form where users provide the business name and country before starting the watchlist screening process.
          ## Watchlist Filled The filled state displays the completed business information form after the user has entered the business name and selected the country, preparing the screening request for submission.
          ## Watchlist Processing A loading indicator and processing message communicate that the screening is actively in progress while temporarily preventing duplicate submissions or interruptions.
          ## Watchlist Success The screen displays a success indicator and confirmation message, communicating that the user’s information has been successfully screened. --- - Path: `design-and-ux/screens-states-adsign` - URL: https://developer.incode.com/design-and-ux/screens-states-adsign/ - Markdown: https://developer.incode.com/design-and-ux/screens-states-adsign.md # Screens & States This section provides a complete overview of all possible user-facing states within the **Advanced Signature experience.** *** ## Signature empty Entry point of the Advanced Signature module. This screen presents the user with a consent form titled "Accept and sign," accompanied by a brief instruction to accept the terms before completing the signature. It displays a linked document with a "View" option, followed by three unchecked checkboxes listing the required consent statements. A "Finish signing" button appears at the bottom but remains disabled until all checkboxes are selected.
          ## Signature filled This screen reflects the state after the user has checked all three consent checkboxes. Each checkbox is now marked and highlighted in blue, confirming the user's agreement to the terms. The "Finish signing" button becomes active and is highlighted in blue, indicating the user can proceed to the signature step.
          ## Signature Loading Transitional state shown after the user taps "Finish signing." The screen retains the consent form layout while a loading spinner appears on the "Finish signing" button, providing visual feedback that the system is processing the request.
          ## Signature Processing Intermediate screen displayed while the system processes the signature submission. The screen shows a spinning progress indicator alongside the text "Processing…", communicating to the user that their action is being handled and they should wait. ## Signature Success Final confirmation screen of the Advanced Signature module. After processing completes, the screen displays a green checkmark icon along with the message "Signed successfully!" confirming that the signature has been captured and the process is complete. No further user action is required. --- - Path: `design-and-ux/screens-states-certificate-issuance` - URL: https://developer.incode.com/design-and-ux/screens-states-certificate-issuance/ - Markdown: https://developer.incode.com/design-and-ux/screens-states-certificate-issuance.md # Screens & States This section provides a complete overview of all possible user-facing states within the **Certificate Issuance** *** ## Create a password - Empty The initial state displays the password creation screen where users create and confirm their password before continuing with the Certificate Issuance process. Password requirements and validation guidance are provided to help users create a secure password and successfully proceed to the next step.
          ## Create a password - Filled The filled state displays the completed password creation form after the user has entered and confirmed their password. All required fields have been completed successfully, enabling the user to proceed to the Certificate Issuance process.
          ## Create a password - Loading A loading indicator and processing message communicate that the certificate issuance request is actively being processed. During this step, duplicate submissions and user interruptions are temporarily prevented to ensure a secure and successful certificate issuance experience.
          ## Create a password - Processing The screen displays a success indicator and confirmation message, communicating that the certificate has been successfully issued. This state confirms that the issuance process is complete and the user can proceed to the next step.
          ## Create a password - Download certificate The final state confirms that the certificate has been successfully generated and is ready for download. Users can review the confirmation message and download their certificate directly from this screen, completing the Certificate Issuance process. ## Create a password - Done The final state confirms that the certificate has been successfully downloaded and the Certificate Issuance process is complete. Users receive a clear confirmation that their certificate has been issued and saved, providing a successful end to the workflow.
          --- - Path: `design-and-ux/screens-states-ekyc` - URL: https://developer.incode.com/design-and-ux/screens-states-ekyc/ - Markdown: https://developer.incode.com/design-and-ux/screens-states-ekyc.md # Screens & States This section provides a complete overview of all possible user-facing states within the eKYC Verification experience. *** ## Enter your details The image below shows the Enter your details form in its empty state. **_First name_**, **_Last name_**, and **_Date of Birth_** are required fields marked with an asterisk. **_Middle name_** is optional. **Continue** submits the step. ## Enter your details - Filled The image below shows the Enter your details form with **_First name_**, **_Last name_**, and **_Date of Birth_** filled in. **Continue** advances to Driver’s License details. ## Driver’s License details The image below shows the Driver’s License details form in its empty state. **_Driver's License number_**, **_Driver's License state_**, and **_Driver's License expiration date_** are all required. **Continue** submits the step. ## Driver’s License details - Filled The image below shows the Driver's License details form with **_Driver's License number_**, **_Driver's License state_**, and **_Driver's License expiration date_** filled in. **Continue** submits the step. ## Processing A full-screen processing state shown right after submission. The screen reads “Processing…” while the request is in flight. ## Success The success state that closes the flow. Shows an “Information submitted!” message confirming the eKYC verification was successful. ## Error Shown when eKYC verification fails due to backend validation or service errors. Shows a “Something went wrong” message and a **Try again** button to let the user restart the attempt. --- - Path: `design-and-ux/screens-states-esign` - URL: https://developer.incode.com/design-and-ux/screens-states-esign/ - Markdown: https://developer.incode.com/design-and-ux/screens-states-esign.md # Screens & States This section provides a complete overview of all possible user-facing states within the **Electronic Signature experience.** *** ## Signature Canva Entry point of the Electronic Signature module. This screen presents the user with a blank drawing area where they can capture their signature using a finger or mouse. The canvas includes a "Sign here" placeholder to guide the user, a "Clear canvas" option to reset any input, and a "Done" button that remains disabled until a signature stroke is detected.
          ## Signature filled This screen reflects the state after the user has drawn their signature on the canvas. The "Clear canvas" link becomes active, allowing the user to erase and start over if needed. The "Done" button is now enabled and highlighted in blue, indicating the user can proceed to submit their signature.
          ## Success Final confirmation screen of the Electronic Signature module. After the user taps "Done," the system processes the signature and displays a green checkmark icon along with a "Signed successfully!" message. This screen confirms that the signature has been captured and the process is complete. No further user action is required.
          --- - Path: `design-and-ux/screens-states-forms` - URL: https://developer.incode.com/design-and-ux/screens-states-forms/ - Markdown: https://developer.incode.com/design-and-ux/screens-states-forms.md # Screens & States This section provides a complete overview of all possible user-facing states within the **Forms and Data Entry** *** ## Forms empty Entry point of the data entry module. This screen presents the user with a form containing four customizable required fields: ID number, Email, Country of residence, and Date of Birth . All fields are empty and the "Continue" button is disabled until the user provides valid input.
          ## Forms Filled This state confirms that the user has completed all required fields in the form. All four customizable fields — ID number, Email, Country of residence, and Date of Birth — contain valid input, and the "Continue" button is now enabled, allowing the user to proceed to the next step.
          ## Forms Loading This state is triggered after the user taps "Continue" with all required fields completed. The form remains visible with the filled data, while the primary button transitions to a loading state, displaying a spinner as the submission is being processed..
          ## Form Success This state confirms that the user's information has been successfully submitted. The screen displays a green checkmark icon accompanied by the message "Success!," indicating the process has been completed and the user can proceed to the next step in the flow. --- - Path: `design-and-ux/screens-states-qsign` - URL: https://developer.incode.com/design-and-ux/screens-states-qsign/ - Markdown: https://developer.incode.com/design-and-ux/screens-states-qsign.md # Screens & States This section provides a complete overview of all possible user-facing states within the **Qualified Signature experience.** *** ## T\&C Entry point of the Qualified Signature module. This screen presents the Terms & Conditions document for review, allowing the user to read the agreement before proceeding. The consent section is displayed below the document with five unchecked checkboxes containing the required consent statements, while the "Continue" button remains disabled until all required consents are accepted.
          ## T\&C Selected Entry point of the Qualified Signature module. This screen displays the selected Terms & Conditions document in full, allowing the user to review its contents before continuing. The consent section remains available below the document, with five unchecked checkboxes containing the required consent statements. The "Continue" button remains disabled until all required consents are accepted.
          ## Signature Entry point of the Qualified Signature signing flow. This screen presents the user with a "Review and sign" form, including a brief instruction explaining that a qualified certificate will be issued to create the signature. It displays a linked document with a "View" option, followed by three unchecked consent checkboxes containing the required consent statements. The "Sign" button remains disabled until all required consents are accepted.
          ## Signature filled This screen reflects the state after the user has checked all three consent checkboxes. Each checkbox is now selected and highlighted in blue, confirming the user's agreement to the required consent statements. The "Sign" button becomes active and highlighted in blue, indicating that the user can proceed with the qualified signature process.
          ## Signature Loading Transitional state displayed after the user taps the "Sign" button. The screen retains the "Review and sign" form layout while a loading spinner appears on the "Sign" button, providing visual feedback that the signature request is being submitted and processed.
          ## Signature Processing Intermediate screen displayed while the system processes the signature submission. The screen shows a spinning progress indicator alongside the text "Creating your signature…", communicating to the user that their action is being handled and they should wait. ## Signature Success Final confirmation screen of the Qualified Signature module. After the signature has been successfully created, the screen displays a green checkmark icon with the message "Signed successfully!" confirming that the signing process is complete. The screen also displays the signed user's name and a "Done" button, allowing the user to exit the flow.
          --- - Path: `design-and-ux/screens-states-watchlist` - URL: https://developer.incode.com/design-and-ux/screens-states-watchlist/ - Markdown: https://developer.incode.com/design-and-ux/screens-states-watchlist.md # Screens & States This section provides a complete overview of all possible user-facing states within the **Watchlist** *** ## Watchlist Processing A loading indicator and processing message communicate that the screening is actively in progress while temporarily preventing duplicate submissions or interruptions..
          ## Watchlist Success The screen displays a success indicator and confirmation message, communicating that the user’s information has been successfully screened. --- - Path: `design-and-ux/separator` - URL: https://developer.incode.com/design-and-ux/separator/ - Markdown: https://developer.incode.com/design-and-ux/separator.md # Separator Separators create visual breaks between content sections. Prizma offers a plain horizontal rule and a labeled variant — commonly used to separate primary and alternative authentication methods.
          Variants
          Plain rule.separator

          A horizontal rule between content sections.

          Or
          Labeled.separator--label

          Splits alternatives — an Or between two auth methods.

          Dashed.separator--dashed

          Lighter division inside a single section.

          Tokens
          ```dh-comp-tokens --separator-line-color | Horizontal rule color | Component --separator-text-color | Label text color | Component --separator-gap | Gap between line and label | Component ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/shape` - URL: https://developer.incode.com/design-and-ux/shape/ - Markdown: https://developer.incode.com/design-and-ux/shape.md # Shape Corner radius defines the personality of UI surfaces — from sharp precision to fully rounded pills. Always use semantic names like `small` or `medium`, not raw pixel values. ## Progression ```dh-strip kind: radius desc: The scale moves from no rounding (none) through functional steps (x-small → large) to decorative (xx-large) and full pill (full). Each step has a designated role — mixing steps within a component breaks visual logic. none | 0 x-small | 4 small | 8 medium | 16 large | 24 x-large | 40 xx-large | 64 full | 9999 ``` ```dh-principles #006aff | Token names, not pixels | Never write border-radius: 12px in component code. Reference the semantic token — it survives theming and global radius updates. #189f60 | Nested radius rule | An inner element's radius should be: outer-radius − padding. A card with medium (16px) and 8px padding → inner radius ≈ small (8px). #820ad1 | Full is intentional | Use full (9999px) only where circular form carries semantic meaning — avatars, icon buttons, pill badges, toggle tracks. ``` ## Step context ```dh-principles #006aff | Controls | Interactive elements — inputs, buttons, selects, list items. Steps: none, x-small, small. #189f60 | Containers | Surfaces that wrap content — cards, panels, modals, sheets. Steps: medium, large, x-large. #820ad1 | Decorative | Art-directed surfaces and circular elements. Steps: xx-large, full. ``` ```dh-scale kind: radius none | Border.Radius.none | 0 | --border-radius-none x-small | Border.Radius.x-small | 4 | --border-radius-x-small small | Border.Radius.small | 8 | --border-radius-small medium | Border.Radius.medium | 16 | --border-radius-medium large | Border.Radius.large | 24 | --border-radius-large x-large | Border.Radius.x-large | 40 | --border-radius-x-large xx-large | Border.Radius.xx-large | 64 | --border-radius-xx-large full | Border.Radius.full | 9999 | --border-radius-full ``` ```dh-usage kind: radius none | 0px | Reserved for structural elements that span full width — dividers, progress fills, full-bleed images. No rounding. | Dividers, Progress bars, Full-bleed images x-small | 4px | Keeps elements sharp and precise. Best for dense inline elements where rounding would consume too much visual space. | Chips, Tags, Badges small | 8px | The default for interactive controls. Inputs, buttons, and selects all use this step. | Inputs, Dropdowns, Buttons, List items medium | 16px | The default for containers — cards, sheets, and informational panels. | Cards, Panels, Dialogs, Drawers large | 24px | For emphasis. Modal dialogs, bottom sheets, and featured content areas. | Modals, Bottom sheets, Featured cards x-large | 40px | Rare. Used for hero-level surfaces that need strong visual distinction. | Hero cards, Large overlays xx-large | 64px | Decorative only. Avoid for functional UI. | Decorative surfaces full | 9999px | A fully rounded pill. Avatars, icon buttons, toggle tracks, and pill-style badges. | Avatars, Icon buttons, Pill badges, Toggles ``` --- - Path: `design-and-ux/signature` - URL: https://developer.incode.com/design-and-ux/signature/ - Markdown: https://developer.incode.com/design-and-ux/signature.md # Signature Pad The Signature Pad captures a freehand signature from the user. It supports an empty waiting state and a signed state that confirms capture. Used in consent, contracts, and identity affirmation flows.
          Anatomy
          States
          Empty.signature-pad

          The dashed canvas invites the user to sign with finger or stylus.

          Signed.signature-pad.has-ink

          Once ink exists, Clear and Confirm actions become available.

          Tokens
          ```dh-comp-tokens --sig-surface | Pad background | Component --sig-border | Pad border color | Component --sig-baseline | Signature baseline color | Component --sig-ink | Drawn stroke color | Component --sig-signed-bg | Signed state background | Component --radius-sig | Pad corner radius | Semantic ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/snackbar` - URL: https://developer.incode.com/design-and-ux/snackbar/ - Markdown: https://developer.incode.com/design-and-ux/snackbar.md # Snackbar Snackbars deliver brief, contextual feedback after a user action or system event. They appear at the bottom of the screen, auto-dismiss after a few seconds, and come in four semantic variants: positive, negative, warning, and neutral.
          Variants
          Your session will expire in 2 minutesDocument captured successfullyLow light detected — find a brighter spotWe couldn’t read your document
          Four tones map to the snackbar tokens: neutral (brand), positive, warning, and negative — surface and border per tone, text always primary.
          Tokens
          ```dh-comp-tokens --snackbar-positive-bg | Positive background | Component --snackbar-negative-bg | Negative background | Component --snackbar-warning-bg | Warning background | Component --snackbar-neutral-bg | Neutral background | Component --snackbar-text | Message text color | Component --snackbar-icon-positive | Positive indicator color | Component --radius-snackbar | Corner radius | Semantic ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/spacing` - URL: https://developer.incode.com/design-and-ux/spacing/ - Markdown: https://developer.incode.com/design-and-ux/spacing.md # Spacing An 8-point base grid keeps rhythm consistent across every component and layout. All values are multiples of 4px. Reference tokens as `Scale.*` — never hardcode pixel values. ## Grid rhythm ```dh-strip kind: spacing desc: Dense range (4–16px) grows in 4px steps for precise component internals. Above 16px the scale shifts to 8px steps to govern layout-level spacing. 4 | 4 8 | 8 12 | 12 16 | 16 24 | 24 32 | 32 48 | 48 64 | 64 ``` ```dh-principles #006aff | 8-point base grid | The core rhythm is 8px. Every layout spacing value is a multiple of 8. This keeps vertical rhythm consistent across components and pages. #189f60 | 4px for precision | The 4px subdivisions handle tight internal spacing — icon gaps, input padding, inline label offsets — without breaking the larger rhythm. #ff9900 | Context governs density | Compact UI elements (4–12px), comfortable containers (16–24px), page-level layout (32px+). Density is intentional, not arbitrary. ``` ## Density in practice ```dh-principles #006aff | Compact | Badges, chips, tags, inline icons — 8px padding, 4px gaps. #189f60 | Comfortable | Buttons, cards, inputs, modals — 16px padding, 8px gaps. #820ad1 | Spacious | Page sections, hero areas — 32px padding, 16px gaps. ``` ```dh-scale kind: spacing none | Scale.0 | 0 | --scale-0 2 | Scale.2 | 2 | --scale-2 4 | Scale.4 | 4 | --scale-4 8 | Scale.8 | 8 | --scale-8 12 | Scale.12 | 12 | --scale-12 16 | Scale.16 | 16 | --scale-16 20 | Scale.20 | 20 | --scale-20 24 | Scale.24 | 24 | --scale-24 32 | Scale.32 | 32 | --scale-32 40 | Scale.40 | 40 | --scale-40 48 | Scale.48 | 48 | --scale-48 56 | Scale.56 | 56 | --scale-56 64 | Scale.64 | 64 | --scale-64 72 | Scale.72 | 72 | --scale-72 80 | Scale.80 | 80 | --scale-80 88 | Scale.88 | 88 | --scale-88 96 | Scale.96 | 96 | --scale-96 104 | Scale.104 | 104 | --scale-104 120 | Scale.120 | 120 | --scale-120 128 | Scale.128 | 128 | --scale-128 200 | Scale.200 | 200 | --scale-200 ``` ```dh-usage group: Compact — 4–12px | #006aff Icon-to-label gap | Scale.4–8 | Gap between an icon and its adjacent label text. | Scale.4, Scale.8 Inline element padding | Scale.8–12 | Horizontal padding inside badges, chips, and tag elements. | Scale.8, Scale.12 Input helper text offset | Scale.4 | Margin between an input and its helper or error text. | Scale.4 group: Comfortable — 16–24px | #189f60 Button padding | Scale.16 | Horizontal padding inside primary, secondary, and tertiary buttons. | Scale.16 Card internal padding | Scale.16–24 | Padding inside card and panel components. | Scale.16, Scale.24 Form field gap | Scale.16 | Vertical gap between stacked form fields. | Scale.16 Modal padding | Scale.24 | Internal padding for dialog and bottom-sheet containers. | Scale.24 group: Layout — 32–64px | #820ad1 Section vertical margin | Scale.32–40 | Vertical space between major page sections. | Scale.32, Scale.40 Page horizontal gutter | Scale.24–40 | Left/right padding on the main content container. | Scale.24, Scale.40 ``` --- - Path: `design-and-ux/specs-guidelines-adsign` - URL: https://developer.incode.com/design-and-ux/specs-guidelines-adsign/ - Markdown: https://developer.incode.com/design-and-ux/specs-guidelines-adsign.md # Specs & Guidelines The **Advanced Signature** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.

          *** ## Responsiveness & Viewport Adaptation The **Advanced Signature** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | ---------------------------------- | ---------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; images scale down to maintain visibility | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing is redistributed; title and images remain pinned to the top | | **Foldables (e.g., Pixel Fold)** | Larger images and more balanced white space; content remains centered | | **Tablets** | Increased layout margins; silhouette scales proportionally | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | ------------------- | ---------------------------------------------------- | ------------------------------ | | Images size | Scale proportionally by viewport height | No | | Title text | Remains centered in the layout and pinned at the top | Yes, text is fully localizable | | Buttons | Width adjusts to container, vertical spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Scales padding according to device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | -------------------------- | ------------------------------------------ | | Matching logic & detection | Must remain consistent for accuracy | | Minimum text size | Required for readability & WCAG compliance | | Minimum tap target sizes | Ensures accessibility on mobile | | Overall hierarchy | Prevents cognitive load at different sizes |
          ### Design Notes * The images always remain the dominant elements, regardless of screen size. * Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. * Avoid adding custom UI above or below the module, it may break alignment. * Multiline text is handled gracefully, but avoid extremely long localized strings.

          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions **Advanced Signature** includes predefined transition rules and micro-interactions that ensure a smooth user experience from the image comparison, to the successful and error states. Timing, easing, and animation guidelines are documented directly in Figma prototypes.
          *** ## Localization The **Advanced Signature** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Buttons and CTAs automatically expand to fit translated labels. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable. * Incode supports a variety of languages
          --- - Path: `design-and-ux/specs-guidelines-certificate-issuance` - URL: https://developer.incode.com/design-and-ux/specs-guidelines-certificate-issuance/ - Markdown: https://developer.incode.com/design-and-ux/specs-guidelines-certificate-issuance.md # Specs & Guidelines The **Certificate Issuance** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.

          *** ## Responsiveness & Viewport Adaptation The **Certificate Issuance **module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | ---------------------------------- | ---------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; images scale down to maintain visibility | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing is redistributed; title and images remain pinned to the top | | **Foldables (e.g., Pixel Fold)** | Larger images and more balanced white space; content remains centered | | **Tablets** | Increased layout margins; silhouette scales proportionally | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | ------------------- | ---------------------------------------------------- | ------------------------------ | | Images size | Scale proportionally by viewport height | No | | Title text | Remains centered in the layout and pinned at the top | Yes, text is fully localizable | | Buttons | Width adjusts to container, vertical spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Scales padding according to device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | -------------------------- | ------------------------------------------ | | Matching logic & detection | Must remain consistent for accuracy | | Minimum text size | Required for readability & WCAG compliance | | Minimum tap target sizes | Ensures accessibility on mobile | | Overall hierarchy | Prevents cognitive load at different sizes |
          ### Design Notes - The images always remain the dominant elements, regardless of screen size. - Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. - Avoid adding custom UI above or below the module, it may break alignment. - Multiline text is handled gracefully, but avoid extremely long localized strings.

          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions **Certificate Issuance** includes predefined transition rules and micro-interactions that ensure a smooth user experience from the image comparison, to the successful and error states. Timing, easing, and animation guidelines are documented directly in Figma prototypes.
          *** ## Localization The **Certificate Issuance **module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** - All user-facing text is fully localizable. - UI adjusts to prevent truncation and maintain readability. - Spacing and vertical rhythm adapt to accommodate longer languages. - Ensure localized strings preserve clarity and follow regulatory requirements when applicable. - Incode supports a variety of languages
          --- - Path: `design-and-ux/specs-guidelines-ekyc` - URL: https://developer.incode.com/design-and-ux/specs-guidelines-ekyc/ - Markdown: https://developer.incode.com/design-and-ux/specs-guidelines-ekyc.md # Specs & Guidelines The [eKYC module](/features-and-modules/ekyc/) includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.
          *** ## Responsiveness & Viewport Adaptation The [eKYC module](/features-and-modules/ekyc/) is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet. ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | ---------------------------------- | ---------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; images scale down to maintain visibility | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing is redistributed; title and images remain pinned to the top | | **Foldables (e.g., Pixel Fold)** | Larger images and more balanced white space; content remains centered | | **Tablets** | Increased layout margins; silhouette scales proportionally | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding | ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | ------------------- | ---------------------------------------------------- | ------------------------------ | | Images size | Scale proportionally by viewport height | No | | Title text | Remains centered in the layout and pinned at the top | Yes, text is fully localizable | | Buttons | Width adjusts to container, vertical spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Scales padding according to device safe insets | Limited (color only) | | Icons | Remain centered and maintain distance to the title | Color & style | ### What remains fixed across breakpoints | **Element** | **Reason** | | -------------------------- | ------------------------------------------------- | | Matching logic & detection | Must remain consistent for accuracy | | Images displayed | Automatic depending on users ID and selfie images | | Minimum text size | Required for readability & WCAG compliance | | Minimum tap target sizes | Ensures accessibility on mobile | | Overall hierarchy | Prevents cognitive load at different sizes | ### Design Notes * The images always remain the dominant elements, regardless of screen size. * Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. * Avoid adding custom UI above or below the module, it may break alignment. * Multiline text is handled gracefully, but avoid extremely long localized strings. *** ## Desktop & Tablet Guidelines The [eKYC module](/features-and-modules/ekyc/) is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.
          *** ## Prototype & Transitions The [eKYC module](/features-and-modules/ekyc/) includes predefined transition rules and micro-interactions that ensure a smooth user experience from the image comparison, to the successful and error states. Timing, easing, and animation guidelines are documented directly in Figma prototypes. *** ## Localization The [eKYC module](/features-and-modules/ekyc/) supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions. **Key considerations:** * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Buttons and CTAs automatically expand to fit translated labels. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable. * Incode supports a variety of languages --- - Path: `design-and-ux/specs-guidelines-esign` - URL: https://developer.incode.com/design-and-ux/specs-guidelines-esign/ - Markdown: https://developer.incode.com/design-and-ux/specs-guidelines-esign.md # Specs & Guidelines The **Electronic Signature** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.

          *** ## Responsiveness & Viewport Adaptation The **Electronic Signature** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | ---------------------------------- | ---------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; images scale down to maintain visibility | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing is redistributed; title and images remain pinned to the top | | **Foldables (e.g., Pixel Fold)** | Larger images and more balanced white space; content remains centered | | **Tablets** | Increased layout margins; silhouette scales proportionally | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | ------------------- | ---------------------------------------------------- | ------------------------------ | | Images size | Scale proportionally by viewport height | No | | Title text | Remains centered in the layout and pinned at the top | Yes, text is fully localizable | | Buttons | Width adjusts to container, vertical spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Scales padding according to device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | -------------------------- | ------------------------------------------ | | Matching logic & detection | Must remain consistent for accuracy | | Minimum text size | Required for readability & WCAG compliance | | Minimum tap target sizes | Ensures accessibility on mobile | | Overall hierarchy | Prevents cognitive load at different sizes |
          ### Design Notes * The images always remain the dominant elements, regardless of screen size. * Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. * Avoid adding custom UI above or below the module, it may break alignment. * Multiline text is handled gracefully, but avoid extremely long localized strings.

          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions **Electronic Signature** includes predefined transition rules and micro-interactions that ensure a smooth user experience from the image comparison, to the successful and error states. Timing, easing, and animation guidelines are documented directly in Figma prototypes.


          *** ## Localization The **Electronic Signature** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Buttons and CTAs automatically expand to fit translated labels. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable. * Incode supports a variety of languages
          --- - Path: `design-and-ux/specs-guidelines-forms` - URL: https://developer.incode.com/design-and-ux/specs-guidelines-forms/ - Markdown: https://developer.incode.com/design-and-ux/specs-guidelines-forms.md # Specs & Guidelines The **Forms and data entry** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.

          *** ## Responsiveness & Viewport Adaptation The **Forms and data entry** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | ---------------------------------- | ---------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; images scale down to maintain visibility | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing is redistributed; title and images remain pinned to the top | | **Foldables (e.g., Pixel Fold)** | Larger images and more balanced white space; content remains centered | | **Tablets** | Increased layout margins; silhouette scales proportionally | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | ------------------- | ---------------------------------------------------- | ------------------------------ | | Images size | Scale proportionally by viewport height | No | | Title text | Remains centered in the layout and pinned at the top | Yes, text is fully localizable | | Buttons | Width adjusts to container, vertical spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Scales padding according to device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | -------------------------- | ------------------------------------------ | | Matching logic & detection | Must remain consistent for accuracy | | Minimum text size | Required for readability & WCAG compliance | | Minimum tap target sizes | Ensures accessibility on mobile | | Overall hierarchy | Prevents cognitive load at different sizes |
          ### Design Notes * The images always remain the dominant elements, regardless of screen size. * Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. * Avoid adding custom UI above or below the module, it may break alignment. * Multiline text is handled gracefully, but avoid extremely long localized strings. *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.
          *** ## Prototype & Transitions **Forms and data entry** includes predefined transition rules and micro-interactions that ensure a smooth user experience from the image comparison, to the successful and error states. Timing, easing, and animation guidelines are documented directly in Figma prototypes.
          *** ## Localization The **Forms and data entry** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Buttons and CTAs automatically expand to fit translated labels. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable. * Incode supports a variety of languages
          --- - Path: `design-and-ux/specs-guidelines-ocr` - URL: https://developer.incode.com/design-and-ux/specs-guidelines-ocr/ - Markdown: https://developer.incode.com/design-and-ux/specs-guidelines-ocr.md # Specs & Guidelines The **OCR Review** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout. ## Responsiveness & Viewport Adaptation The **OCR Review **module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet. ***
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | ---------------------------------- | ---------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; images scale down to maintain visibility | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing is redistributed; title and images remain pinned to the top | | **Foldables (e.g., Pixel Fold)** | Larger images and more balanced white space; content remains centered | | **Tablets** | Increased layout margins; silhouette scales proportionally | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | ------------------- | ---------------------------------------------------- | ------------------------------ | | Images size | Scale proportionally by viewport height | No | | Title text | Remains centered in the layout and pinned at the top | Yes, text is fully localizable | | Buttons | Width adjusts to container, vertical spacing adapts | Color & text | | Background surfaces | Expand to full viewport | Yes | | Header area | Scales padding according to device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | -------------------------- | ------------------------------------------ | | Matching logic & detection | Must remain consistent for accuracy | | Minimum text size | Required for readability & WCAG compliance | | Minimum tap target sizes | Ensures accessibility on mobile | | Overall hierarchy | Prevents cognitive load at different sizes |
          ### Design Notes - The images always remain the dominant elements, regardless of screen size. - Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. - Avoid adding custom UI above or below the module, it may break alignment. - Multiline text is handled gracefully, but avoid extremely long localized strings.
          *** ## Prototype & Transitions **OCR Review **includes predefined transition rules and micro-interactions that ensure a smooth user experience from the image comparison, to the successful and error states. Timing, easing, and animation guidelines are documented directly in Figma prototypes.
          --- - Path: `design-and-ux/specs-guidelines-qsign` - URL: https://developer.incode.com/design-and-ux/specs-guidelines-qsign/ - Markdown: https://developer.incode.com/design-and-ux/specs-guidelines-qsign.md # Specs & Guidelines The **Qualified Signature** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.

          *** ## Responsiveness & Viewport Adaptation The **Qualified Signature** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | ---------------------------------- | ---------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; images scale down to maintain visibility | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing is redistributed; title and images remain pinned to the top | | **Foldables (e.g., Pixel Fold)** | Larger images and more balanced white space; content remains centered | | **Tablets** | Increased layout margins; silhouette scales proportionally | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | ------------------- | ---------------------------------------------------- | ------------------------------ | | Images size | Scale proportionally by viewport height | No | | Title text | Remains centered in the layout and pinned at the top | Yes, text is fully localizable | | Buttons | Width adjusts to container, vertical spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Scales padding according to device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | -------------------------- | ------------------------------------------ | | Matching logic & detection | Must remain consistent for accuracy | | Minimum text size | Required for readability & WCAG compliance | | Minimum tap target sizes | Ensures accessibility on mobile | | Overall hierarchy | Prevents cognitive load at different sizes |
          ### Design Notes * The images always remain the dominant elements, regardless of screen size. * Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. * Avoid adding custom UI above or below the module, it may break alignment. * Multiline text is handled gracefully, but avoid extremely long localized strings.

          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions **Qualified Signature** includes predefined transition rules and micro-interactions that ensure a smooth user experience from the image comparison, to the successful and error states. Timing, easing, and animation guidelines are documented directly in Figma prototypes.
          *** ## Localization The **Qualified Signature** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Buttons and CTAs automatically expand to fit translated labels. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable. * Incode supports a variety of languages
          --- - Path: `design-and-ux/specs-guidelines-watchlist` - URL: https://developer.incode.com/design-and-ux/specs-guidelines-watchlist/ - Markdown: https://developer.incode.com/design-and-ux/specs-guidelines-watchlist.md # Specs & Guidelines The **Watchlist** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.

          *** ## Responsiveness & Viewport Adaptation The **Watchlist** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | ---------------------------------- | ---------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; images scale down to maintain visibility | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing is redistributed; title and images remain pinned to the top | | **Foldables (e.g., Pixel Fold)** | Larger images and more balanced white space; content remains centered | | **Tablets** | Increased layout margins; silhouette scales proportionally | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | ------------------- | ---------------------------------------------------- | ------------------------------ | | Images size | Scale proportionally by viewport height | No | | Title text | Remains centered in the layout and pinned at the top | Yes, text is fully localizable | | Buttons | Width adjusts to container, vertical spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Scales padding according to device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | -------------------------- | ------------------------------------------ | | Matching logic & detection | Must remain consistent for accuracy | | Minimum text size | Required for readability & WCAG compliance | | Minimum tap target sizes | Ensures accessibility on mobile | | Overall hierarchy | Prevents cognitive load at different sizes |
          ### Design Notes * The images always remain the dominant elements, regardless of screen size. * Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. * Avoid adding custom UI above or below the module, it may break alignment. * Multiline text is handled gracefully, but avoid extremely long localized strings. *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions **Watchlist** includes predefined transition rules and micro-interactions that ensure a smooth user experience from the image comparison, to the successful and error states. Timing, easing, and animation guidelines are documented directly in Figma prototypes.
          *** ## Localization The **Watchlist** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable. * Incode supports a variety of languages
          --- - Path: `design-and-ux/specs-guidelines-watchlist-business` - URL: https://developer.incode.com/design-and-ux/specs-guidelines-watchlist-business/ - Markdown: https://developer.incode.com/design-and-ux/specs-guidelines-watchlist-business.md # Specs & Guidelines The **Watchlist for business** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.

          *** ## Responsiveness & Viewport Adaptation The **Watchlist for business** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet.
          ### How the layout adapts across devices | **Breakpoint** | **Behavior** | | ---------------------------------- | ---------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; images scale down to maintain visibility | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent | | **Tall/narrow Android devices** | Vertical spacing is redistributed; title and images remain pinned to the top | | **Foldables (e.g., Pixel Fold)** | Larger images and more balanced white space; content remains centered | | **Tablets** | Increased layout margins; silhouette scales proportionally | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding |
          ### What is responsive (and customizable) | **Element** | **Responsive Behavior** | **Customizable** | | ------------------- | ---------------------------------------------------- | ------------------------------ | | Images size | Scale proportionally by viewport height | No | | Title text | Remains centered in the layout and pinned at the top | Yes, text is fully localizable | | Buttons | Width adjusts to container, vertical spacing adapts | Color & text | | Footer / watermark | Pinned to bottom safe area | Optional | | Background surfaces | Expand to full viewport | Yes | | Header area | Scales padding according to device safe insets | Limited (color only) |
          ### What remains fixed across breakpoints | **Element** | **Reason** | | -------------------------- | ------------------------------------------ | | Matching logic & detection | Must remain consistent for accuracy | | Minimum text size | Required for readability & WCAG compliance | | Minimum tap target sizes | Ensures accessibility on mobile | | Overall hierarchy | Prevents cognitive load at different sizes |
          ### Design Notes * The images always remain the dominant elements, regardless of screen size. * Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. * Avoid adding custom UI above or below the module, it may break alignment. * Multiline text is handled gracefully, but avoid extremely long localized strings.

          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions **Watchlist for business** includes predefined transition rules and micro-interactions that ensure a smooth user experience from the image comparison, to the successful and error states. Timing, easing, and animation guidelines are documented directly in Figma prototypes.
          *** ## Localization The **Watchlist for business** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** * All user-facing text is fully localizable. * UI adjusts to prevent truncation and maintain readability. * Spacing and vertical rhythm adapt to accommodate longer languages. * Ensure localized strings preserve clarity and follow regulatory requirements when applicable. * Incode supports a variety of languages
          --- - Path: `design-and-ux/states` - URL: https://developer.incode.com/design-and-ux/states/ - Markdown: https://developer.incode.com/design-and-ux/states.md # States Block The States Block is a full-screen layout used to communicate a process state: loading, success, or error. It centers a status icon, a title, and supporting text — replacing the standard screen layout while the system processes or delivers a result.
          Anatomy
          Identity verified

          You’re all set. You can now continue with your application.

          Variants
          Success

          Verification complete.

          Success.states--success

          Positive outcome with a single continue action.

          Failed

          We couldn’t verify you.

          Error.states--error

          Explains the failure and offers a retry.

          Attention

          Something needs review.

          Warning.states--warning

          A recoverable issue that needs user attention.

          Tokens
          ```dh-comp-tokens --states-icon-success | Success icon background | Component --states-icon-error | Error icon background | Component --states-icon-loading | Spinner arc color | Component --states-title | Title text color | Component --states-sub | Supporting text color | Component --states-gap | Vertical gap between items | Component ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/stepper` - URL: https://developer.incode.com/design-and-ux/stepper/ - Markdown: https://developer.incode.com/design-and-ux/stepper.md # Stepper Steppers show users where they are in a multi-step verification flow. Each segment is in one of three states: done, active, or pending. Prizma steppers support 3 to 5 steps.
          Anatomy
          Track segments fill with brand blue as steps complete; inactive segments stay light gray. Both colors are static tokens — they don’t change with the theme.
          Tokens
          ```dh-comp-tokens --stepper-bar-done | Completed segment color | Component --stepper-bar-active | Current segment color | Component --stepper-bar-pending | Upcoming segment color | Component --stepper-bar-height | Track bar height | Component --stepper-gap | Gap between bars | Component --radius-stepper | Bar corner radius | Semantic ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/timer` - URL: https://developer.incode.com/design-and-ux/timer/ - Markdown: https://developer.incode.com/design-and-ux/timer.md # Timer The Timer component displays a visible countdown before a biometric capture event. It prepares users for the moment of capture, reducing failed attempts caused by user unreadiness.
          Anatomy
          0:45
          The countdown ring drains as time passes. The component always renders dark-on-dark regardless of page mode — its surface, border, and text are static tokens.
          Tokens
          ```dh-comp-tokens --timer-surface | Cell background | Component --timer-border | Cell border color | Component --timer-text | Digit text color | Component --timer-font-size | Digit font size | Component --radius-timer | Cell corner radius | Semantic ``` > 📘 Component tokens > > The color tokens for this component live in [Color → Tokens](/design-and-ux/color/), and its spacing, radius, and type map to the shared foundation scales. --- - Path: `design-and-ux/typography` - URL: https://developer.incode.com/design-and-ux/typography/ - Markdown: https://developer.incode.com/design-and-ux/typography.md # Typography Two typefaces, one cohesive system. **Rethink Sans** for display and impactful headings. **DM Sans** for all UI text: body, labels, buttons, inputs. Every style maps to a token used identically in Figma and CSS.
          Display / Headings
          Ag
          Rethink Sans400 · 500 · 600 · 700 · 800

          Used exclusively for Display and Headline categories. Brings personality and visual impact to large-scale text without sacrificing legibility at high weights.

          Body / UI
          Ag
          DM Sans400 · 500 · 600 · 700 · 800

          The workhorse of the UI. Used for Body, Button, Label, Input, and Tooltip. Optimised for small sizes and high-density layouts — reads cleanly at 11px.

          ```dh-principles #006aff | Tokens, not raw values | Every type style is a named token. Font size, weight, and line-height are bundled — never set individually. Use the token, not the number. #189f60 | Two families, strict roles | Rethink Sans is for impact. DM Sans is for function. Mixing them outside their designated categories breaks visual hierarchy. #820ad1 | Weight is semantic | Weight within a type style is fixed by the token. Bold is reserved for headings and emphasis — don't apply it to body or label styles arbitrarily. ``` ## Category roles ```dh-usage Display | Rethink Sans | Hero headlines, onboarding titles, verification outcomes at large scale. | Headline | Rethink Sans | Section headers, modal titles, step titles within a flow. | Feedback | DM Sans | Real-time capture guidance shown over the camera. | Body | DM Sans | Paragraphs, descriptions, and supporting copy. | Button | DM Sans | Labels inside primary, secondary, and tertiary buttons. | Label / Link / Tooltip | DM Sans | Form labels, inline links, and tooltip copy. | ```
          ## Display ```dh-type-ramp desc: Rethink Sans. Hero moments and top-level screen titles. D1 | Rethink Sans | 80/84 | 800 | -1.5 | Verify identity D2 | Rethink Sans | 48/50.4 | 800 | -0.5 | Verify identity ``` ## Headline ```dh-type-ramp desc: DM Sans. Section and card titles inside product surfaces. H1 | DM Sans | 32/36.8 | 700 | -1.5 | Keep a neutral expression H2 | DM Sans | 24/27.6 | 700 | -1 | Keep a neutral expression H3 | DM Sans | 20/23 | 700 | -0.5 | Keep a neutral expression H4 | DM Sans | 18/20.7 | 500 | -0.5 | Keep a neutral expression H5 | DM Sans | 16/18.4 | 500 | -0.5 | Keep a neutral expression ``` ## Feedback ```dh-type-ramp desc: DM Sans. Real-time capture guidance shown over the camera. L | DM Sans | 24/28.8 | 700 | -0.5 | Ensure good lighting S | DM Sans | 18/21.6 | 500 | -0.5 | Ensure good lighting ``` ## Body ```dh-type-ramp desc: DM Sans. Paragraphs, descriptions, and supporting copy. M Bold | DM Sans | 14/18.2 | 700 | 0 M Regular | DM Sans | 14/16.8 | 400 | 0 S Bold | DM Sans | 12/15.6 | 700 | 0 S Regular | DM Sans | 12/15.6 | 400 | 0 ``` ## Button ```dh-type-ramp desc: DM Sans. Labels inside primary, secondary, and tertiary buttons. M | DM Sans | 18/18 | 500 | 0 | Continue M Underlined | DM Sans | 18/18 | 500 | 0 | Continue S | DM Sans | 14/14 | 500 | -0.5 | Continue ``` ## Label, Link and Tooltip ```dh-type-ramp desc: DM Sans. Form labels, inline links, and tooltip copy. Label M | DM Sans | 14/14 | 700 | 0 | Date of birth Link M Bold | DM Sans | 14/17.5 | 700 | 0 | Learn more Link M ExtraBold | DM Sans | 14/17.5 | 800 | 0 | Learn more Link S Bold | DM Sans | 12/15.6 | 700 | -0.5 | Learn more Link S Medium | DM Sans | 12/15.6 | 500 | 0 | Learn more Tooltip M | DM Sans | 16/18.4 | 500 | -0.5 | Position your face in the frame ``` ```dh-usage Display | D1–D2 | Reserved for hero surfaces and top-level screen titles; inside product UI, start hierarchies at Headline. | Onboarding hero, Success screens Headline | H1–H5 | Section and card titles. Pick the level by hierarchy, not by the size you want — sizes follow the scale. | Screen titles, Card titles, Section headers Feedback | L, S | Real-time guidance over the camera; L for the primary instruction, S for secondary hints. | Capture overlay, Liveness hints Body | M, S | Paragraphs and supporting copy; Bold variants only for inline emphasis, never for headings. | Descriptions, Help text, Legal copy Button | M, S | Button labels; M for standalone CTAs, S for compact and inline buttons. | Primary CTA, Secondary actions Label / Link / Tooltip | M, S | Form labels, inline links, and tooltip copy — never re-purpose these for body text. | Form fields, Inline links, Tooltips ```
          --- - Path: `design-and-ux/upload-digital-id-customization` - URL: https://developer.incode.com/design-and-ux/upload-digital-id-customization/ - Markdown: https://developer.incode.com/design-and-ux/upload-digital-id-customization.md # Customization This section outlines the elements you can customize within the Upload Digital ID module to match your brand while preserving Incode's core UX. It clarifies which areas are flexible, such as text, illustrations, and brand colors, and which elements remain fixed to ensure consistency, accessibility, and reliable document processing across platforms.
          ## Tutorial Screen The Intro Screen prepares the user for the Upload Digital ID step, explains what type of document is required, and sets clear expectations before the user selects a file.
          ### Customizable Elements | Area | What can be customized | Notes | | -------------------- | --------------------------------- | ----------------------------------------------------------- | | **Text** | Title, subtitle, descriptive line | Fully localizable; tone can be adapted to your brand voice. | | **Illustration** | Digital ID illustration | Can be replaced or recolored using brand tokens. | | **Button** | Label, color, radius | Must follow platform guidelines. | | **Background Color** | Screen background | Must maintain strong contrast with text and elements. | | **Brand Colors** | Header text, accent color | Uses brand tokens. | | **Footer** | "Verified by Incode" line | Optional but recommended for trust and product consistency. |

          ### Fixed Elements | Element | Why it is fixed | | ---------------------------------- | ---------------------------------------------------------- | | **File type requirement (PDF)** | Required to ensure consistent document processing. | | **Component spacing & safe areas** | Required for device compatibility and visual stability. | | **Text hierarchy** | Optimized to communicate requirements clearly. | | **Close icon position** | Standardized across all modules for consistent navigation. | | **WCAG contrast requirements** | Mandatory for accessibility and regulatory compliance. |

          ### Token Refearence | UI Element | Token | Value | | --------------------- | --------------------------------------------------------------------------- | ------- | | **Brand name** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Subtitle text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Button background** | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Button text** | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Footer text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Footer icon** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Close icon** | Icon/Neutral/0 Static → Color/Gray/0 | #FFFFFF | | **Background** | Surface/Neutral/0 | #FFFFFF | ### Design Notes - Keep instructions clear and specific about the required file type and format. - The illustration should reinforce what document the user needs to locate before proceeding. - Ensure tap targets meet accessibility guidelines.ns.
          *** ## Review Document Screen The Review Document Screen allows the user to confirm they have selected the correct file before proceeding. It displays a preview of the uploaded PDF and the filename, with options to continue or replace the file.
          ### Customizable Elements | Area | What can be customized | Notes | | ------------------------- | ------------------------------------ | ------------------------------------------------------ | | **Text** | Title, subtitle, confirmation prompt | Fully localizable. | | **Button — Continue** | Label, color, radius | Must follow platform guidelines. | | **Button — Replace file** | Label, color, radius | Must remain visually distinct from the primary action. | | **Background Color** | Screen background | Must maintain contrast with preview and text. | | **Brand Colors** | Header text, accent color | Uses brand tokens. | | **Footer** | "Verified by Incode" line | Optional but recommended. |
          ### Fixed Elements | Element | Why it is fixed | | ------------------------------ | ------------------------------------------------------------ | | **Document preview** | Required so users can confirm the correct file was selected. | | **Filename display** | Provides essential reference for the user before submission. | | **Button placement** | Standardized across modules. | | **Close icon position** | Standardized across all modules for consistent navigation. | | **WCAG contrast requirements** | Mandatory for accessibility and regulatory compliance. |
          ### Token Reference | UI Element | Token | Value | | -------------------------------- | --------------------------------------------------------------------------- | ------- | | **Brand name** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Subtitle text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Filename text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Button background (Continue)** | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Button text (Continue)** | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Button text (Replace file)** | Button/Secondary/Text/Default → Text/Accent/Brand → Color/Brand/500 | #006AFF | | **Footer text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Footer icon** | Icon/Brand/500 Static → Color/Brand/500 | #006AFF | | **Close icon** | Icon/Neutral/0 Static → Color/Gray/0 | #FFFFFF | | **Background** | Surface/Neutral/0 | #FFFFFF |
          ### Design Notes - Keep messaging focused on helping the user confirm their selection. - The Replace file button must remain clearly available so users can correct mistakes without friction. - Maintain clear visual separation between the primary and secondary actions.
          *** ## Analyzing Screen The Analyzing Screen is shown while the module processes the uploaded PDF and extracts identity data and QR code information. It keeps users informed during the operation with a progress indicator and a document preview.
          ### Customizable Elements | Area | What can be customized | Notes | | ---------------------------- | ---------------------------------- | ---------------------------------------------- | | **Title text** | Processing message ("Analyzing..") | Fully localizable; should remain concise. | | **Progress indicator color** | Accent and background stroke | Uses brand tokens; must remain visually clear. | | **Document border color** | Preview frame accent | Uses status positive token. | | **Background Color** | Screen background | Must preserve readability and contrast. |

          ### Fixed Elements | Element | Why it is fixed | | ---------------------------- | ------------------------------------------------------------- | | **Document preview** | Provides visual continuity from the review step. | | **Processing flow timing** | Linked to backend processing; cannot be shortened or skipped. | | **Progress indicator style** | Standardized across SDK for performance and recognizability. | | **Spacing & safe areas** | Required for device consistency. | | **Minimum contrast** | Required for accessibility and compliance. |
          ### Token Reference | UI Element | Token | Value | | --------------------------- | ----------------------------------------- | ------- | | **Progress bar accent** | Icon/Status/Positive → Color/Positive/500 | #189F60 | | **Progress bar background** | Surface/Neutral/100 → Color/Gray/100 | #EBECEF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Document border** | Icon/Status/Positive → Color/Positive/500 | #189F60 | | **Background** | Surface/Neutral/0 | #FFFFFF |
          ### Design Notes - Keep copy short to minimize cognitive load during the wait. - Avoid adding imagery or additional UI elements that may distract from the processing state. - The green border on the document preview reinforces that the file was accepted and is being processed.
          *** ## Success Screen If the document is successfully processed and identity data extracted, the user moves into the Success state. This screen provides clear confirmation before they continue to the next step in the flow.
          ### Customizable Elements | Area | What can be customized | Notes | | ------------------------- | ------------------------------------------- | -------------------------------------------------------- | | **Title text** | Success message ("Successfully processed!") | Fully localizable. | | **Subtitle text** | Supporting message ("Let's continue") | Tone can match your brand voice. | | **Status icon** | Green checkmark | Can replace with custom success icon; must remain clear. | | **Document border color** | Preview frame accent | Uses status positive token. | | **Button** | Label, color, radius | Must follow platform guidelines. | | **Background color** | Full-screen background | Keep high contrast with icon and text. |
          ### Fixed Elements | Element | Why it is fixed | | ------------------------ | --------------------------------------------------------- | | **Success logic** | Must reflect actual backend validation; not customizable. | | **Status color mapping** | Green = positive; required for consistent semantics. | | **Icon placement** | Ensures clarity and recognition. | | **Button placement** | Standardized across modules. |
          ### Token Reference | UI Element | Token | Value | | --------------------- | --------------------------------------------------------------------------- | ------- | | **Document border** | Border/Status/Positive/Static → Color/Positive/500 | #189F60 | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Subtitle text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Button background** | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Button text** | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Background** | Surface/Neutral/0 | #FFFFFF |
          ### Design Notes - Keep messaging short and reassuring; users should feel confident before proceeding. - The green border and checkmark icon reinforce the positive outcome consistently. - Ensure the button uses the brand 500 color to provide a clear next step with strong visual prominence.
          *** ## Error Screen Error screens appear when the system cannot process the uploaded document. This screen informs the user that the file they uploaded is not a supported digital ID type and prompts them to try a different document. While text and styling can be branded, the error itself is fixed, as it reflects the outcome of the document validation and cannot be altered or removed.
          ### Customizable Elements | Area | What can be customized | Notes | | -------------------- | ----------------------------------------- | ---------------------------------------------------------------- | | **Title text** | Error message ("ID type is not accepted") | Fully localizable; tone should be neutral and non-blaming. | | **Subtitle text** | Supporting message | Fully localizable. | | **Status icon** | Error indicator | Can be replaced; must remain clearly negative. | | **Button** | Label, color, radius | Action should guide the user to retry with the correct document. | | **Background color** | Full screen | Must support strong contrast. |
          ### Fixed Elements | Element | Why it is fixed | | ------------------------ | ------------------------------------------------------- | | **Error logic** | Must accurately reflect the document validation result. | | **Status color mapping** | Red = negative; required for clarity and consistency. | | **Title hierarchy** | Emphasizes the issue clearly. | | **Button placement** | Consistent across modules. |
          ### Token Reference | UI Element | Token | Value | | -------------------------- | --------------------------------------------------------------------------- | ------- | | **Status icon background** | Icon/Status/Negative → Color/Negative/500 | #E71111 | | **Icon (X mark)** | Icon/Neutral/0 → Color/Gray/0 | #FFFFFF | | **Title text** | Text/Body/800 (Primary) → Color/Gray/800 | #262831 | | **Subtitle text** | Text/Body/500 (Secondary) → Color/Gray/500 | #60667C | | **Button background** | Button/Primary/Surface/Default → Surface/Brand/500 Static → Color/Brand/500 | #006AFF | | **Button text** | Button/Primary/Text/Default → Text/Body/0 Static → Color/Gray/0 | #FFFFFF | | **Background** | Surface/Neutral/0 | #FFFFFF |
          ### Design Notes - Error messaging should be clear, direct, and action-oriented. - Avoid technical language; users should understand the issue at a glance. - Maintain consistent spacing and visual hierarchy for readability.
          --- - Path: `design-and-ux/upload-digital-id-customization-overview` - URL: https://developer.incode.com/design-and-ux/upload-digital-id-customization-overview/ - Markdown: https://developer.incode.com/design-and-ux/upload-digital-id-customization-overview.md # Upload Digital ID Customization Overview
          ## **Customization Overview** Customization is significantly simple and consistent across module.
          The customization system makes it easy to tailor the experience to your brand while maintaining consistency across the entire module. Benefits include: - Consistent branding across all screens and user flows - Simplified customization with fewer settings to manage - Faster implementation and reduced engineering effort - Predictable visual and behavioral outcomes when making changes - Clear separation between appearance and functional configuration - Lower risk of introducing unintended UI or flow inconsistencies - Centralized customization options that are easy to discover and maintain - Flexible control over themes, colors, component styling, error states, and interaction patterns without impacting core functionality This approach enables teams to create a branded, cohesive experience while keeping customization straightforward, scalable, and maintainable.


          --- - Path: `design-and-ux/upload-digital-id-design` - URL: https://developer.incode.com/design-and-ux/upload-digital-id-design/ - Markdown: https://developer.incode.com/design-and-ux/upload-digital-id-design.md # Upload Digital ID Upload Digital ID allows users to submit a government-issued digital identity document in PDF format as part of the verification flow. It extracts identity data and QR code information from the uploaded file, enabling verification without requiring a physical document capture. Upload Digital ID typically occurs after the onboarding session is initiated and before the final verification result. ![](https://developer.incode.com/assets/abb40b60a91059b550707b125db8d1d3.gif)
          *** ## Where it fits in the flow Upload Digital ID usually appears at the beginning of the document verification step, as an alternative to camera-based ID capture. Once the user successfully uploads and confirms their digital ID, the flow continues to data extraction and any downstream verification logic required by the application. *** ## User Flow The Upload Digital ID experience moves through several clear stages that guide the user from document selection to successful submission. The user is introduced to the process through an intro screen explaining what type of file is required. After selecting a PDF from their device, a review screen allows them to confirm the file before proceeding. Once confirmed, the module processes the document and extracts the identity data and QR code. The user then receives a success state or an error message with options to retry before continuing to the next step.

          *** ## Full Flow Map This diagram presents the full sequence of screens involved in Upload Digital ID, from the intro and file selection, to document review, processing, and final feedback.
          *** ## Happy Path (Light & Dark) The ideal user journey when the document is uploaded and processed successfully with no interruptions. The happy path represents the smoothest version of the experience, where the user selects the correct PDF file, confirms the document on the review screen, and the system successfully extracts the identity data without requiring retries or corrections. Both light and dark mode previews are included so teams can validate visual consistency across themes.

          *** ## Best Practices Recommended guidelines for designing and implementing the **Upload Digital ID** experience. **✅ Do** - Keep instructions clear about the specific file type and format required. - Display a document preview so users can confirm they selected the correct file. - Provide clear error messages with actionable next steps when a file is rejected. - Always offer a replace option so users can correct mistakes without restarting the flow. **❌ Don’t** - Don't accept file formats other than the supported PDF structure. - Don't skip or reduce essential error states. - Don't remove the file size limit feedback, as it helps users understand why a submission failed.
          --- - Path: `design-and-ux/upload-digital-id-screens-and-states` - URL: https://developer.incode.com/design-and-ux/upload-digital-id-screens-and-states/ - Markdown: https://developer.incode.com/design-and-ux/upload-digital-id-screens-and-states.md # Screens & States A complete view of all screens the user may encounter during the **Upload Digital ID** experience. Each state includes a brief description and a direct link to its source in Figma. *** ## Tutorial Screen Introductory screen that prepares the user for the **Upload Digital ID** step. It displays an illustration of a government-issued digital ID and explains what type of file is required before the user proceeds to upload.
          ## Review Document Shown after the user selects a PDF file from their device. Displays a preview of the uploaded document and its filename so the user can confirm it is the correct file before continuing. The user can either proceed or replace the file.
          ## Analyzing Shown immediately after the user confirms their document. A progress indicator and a preview of the file are displayed while the module processes the PDF and extracts the identity data and QR code information.
          ## Success Shown when the document has been successfully processed and the identity data extracted. The user receives a clear visual confirmation and can proceed to the next step in the verification flow.
          ## Error Shown when the uploaded file does not correspond to a supported digital ID type. The user is informed and prompted to try uploading a different document.
          --- - Path: `design-and-ux/upload-digital-id-specs-guidelines` - URL: https://developer.incode.com/design-and-ux/upload-digital-id-specs-guidelines/ - Markdown: https://developer.incode.com/design-and-ux/upload-digital-id-specs-guidelines.md # Specs & Guidelines The **Upload Digital ID** module includes complete Figma specifications documenting spacing, layout rules, typography tokens, and language variants. These specs ensure consistency across platforms and allow localized versions of the UI to scale without breaking the layout.
          **Open Screens Specs in **Figma
          *** ## Responsiveness & Viewport Adaptation The **Upload Digital ID** module is fully responsive and adapts seamlessly to a wide range of device sizes and aspect ratios. The layout is designed to remain consistent and predictable whether the user is on a small phone, large phone, foldable device, or tablet.
          ### How the layout adapts across devices | Breakpoint | Behavior | | ---------------------------------- | ----------------------------------------------------------------------------------- | | **Small phones (e.g., iPhone SE)** | UI elements adjust vertically; document preview scales down to maintain visibility. | | **Standard phones (iPhone 12–16)** | Full layout shown; spacing and hierarchy remain consistent. | | **Tall/narrow Android devices** | Vertical spacing is redistributed; title and preview remain pinned to the top. | | **Foldables (e.g., Pixel Fold)** | Larger preview and more balanced white space; content remains centered. | | **Tablets** | Increased layout margins; document preview scales proportionally. | | **Desktop web** | Centered layout with controlled max-width; additional safe area padding. |
          ### What is responsive (and customizable) | Element | Responsive Behavior | Customizable | | ----------------------- | ---------------------------------------------------- | ------------------------------ | | **Document preview** | Scales proportionally by viewport height | No | | **Title text** | Remains centered in the layout and pinned at the top | Yes, text is fully localizable | | **Buttons** | Width adjusts to container, vertical spacing adapts | Color & text | | **Footer / watermark** | Pinned to bottom safe area | Optional | | **Background surfaces** | Expand to full viewport | Yes | | **Header area** | Scales padding according to device safe insets | Limited (color only) | | **Icons** | Remain centered and maintain distance to the title | Color & style |
          ### What remains fixed across breakpoints | Element | Reason | | ---------------------------- | ------------------------------------------------------ | | **File processing logic** | Must remain consistent for accurate data extraction. | | **Document preview content** | Automatically generated from the user's uploaded file. | | **Minimum text size** | Required for readability & WCAG compliance. | | **Minimum tap target sizes** | Ensures accessibility on mobile. | | **Overall hierarchy** | Prevents cognitive load at different sizes. |
          ### Design Notes - The document preview always remains a dominant visual element, regardless of screen size. - Horizontal spacing is fluid; vertical spacing uses fixed-safe thresholds. - Avoid adding custom UI above or below the module — it may break alignment. - Multiline text is handled gracefully, but avoid extremely long localized strings.

          *** ## Desktop & Tablet Guidelines The module is fully responsive and adapts gracefully to larger viewports. The Figma file includes guidelines for layout adjustments, safe areas, proportion scaling, and interaction differences between touch and pointer-based devices.

          *** ## Prototype & Transitions **Upload Digital ID** includes predefined transition rules and micro-interactions that ensure a smooth user experience from document selection and review, through the analyzing state, to the success and error outcomes. Timing, easing, and animation guidelines are documented directly in Figma prototypes.

          *** ## Localization The **Upload Digital ID** module supports full localization and is designed to adapt to languages with different lengths, line breaks, and reading patterns. The Figma file includes examples for long, short, and multi-line translations to ensure layouts remain stable across regions.
          **Key considerations:** - All user-facing text is fully localizable. - UI adjusts to prevent truncation and maintain readability. - Spacing and vertical rhythm adapt to accommodate longer languages. - Buttons and CTAs automatically expand to fit translated labels. - Ensure localized strings preserve clarity and follow regulatory requirements when applicable. - Incode supports a variety of languages.
          --- - Path: `design-and-ux/v1-vs-v2-comparison-adsign` - URL: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-adsign/ - Markdown: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-adsign.md # Advanced Signature V1 vs V2 Comparison V1 delivers a basic Advanced Electronic Signature flow with limited guidance. The experience focuses on completing required steps—reviewing a document, selecting checkboxes, and continuing—without clearly explaining the significance of those actions. V2 transforms the flow into a guided and trust-centered Advanced Electronic Signature experience. The interface introduces clearer structure and hierarchy, helping users understand what they are agreeing to and why it matters.

          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | -------------------------- | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | Signature experience | ✅ | ✅ | Core functionality present in both versions. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime.
          | Behavior | V1 | V2 | Notes | | ------------------- | ------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------ | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. | | Processing behavior | Static processing screen | Branded processing state with consistent loading behavior | V2 aligns loading behavior with the overall system patterns |
          ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.

          --- - Path: `design-and-ux/v1-vs-v2-comparison-certificate-issuance` - URL: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-certificate-issuance/ - Markdown: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-certificate-issuance.md # Certificate Issuance V1 vs V2 Comparison V1 provides a basic Certificate Issuance experience with limited visibility into processing states and minimal customization options. V2 enhances the Certificate Issuance experience with clearer progress and confirmation states, improved visual guidance, and full alignment with the token-based design system for a more consistent and branded workflow.

          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | ---------------------------------- | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | Certificate Issuance Functionality | ✅ | ✅ | Core functionality present in both versions. | | Customization Options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation Completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime.
          | Behavior | V1 | V2 | Notes | | ------------------- | ------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------ | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. | | Processing behavior | Static processing screen | Branded processing state with consistent loading behavior | V2 aligns loading behavior with the overall system patterns |
          *** ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: - Less engineering work to override UI elements - Consistent branding across modules - Predictable behavior when changing settings - Reduced risk of breaking flows - Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.

          --- - Path: `design-and-ux/v1-vs-v2-comparison-ekyb` - URL: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-ekyb/ - Markdown: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-ekyb.md # eKYB V1 vs V2 Comparison In V1, eKYB Verification presents a functional but generic credentials form experience. The screen focuses on collecting user information user information with standard input fields and minimal contextual structure. Processing and success state are simple and isolated, with little continuity between steps. The experience feels transactional, with basic feedback once the form is submitted. In V2, eKYB Verification introduces a more structured, branded and guided experience. The interface is organized into clear sections, improving readability and reducing cognitive load. Processing and success states feel more cohesive with smoother visual transitions and clearer confirmation messaging making the flow feel complete and intentional.


          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences).
          | Capabilities | V1 | V2 | Notes | | -------------------------- | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | eKYB data collection | ✅ | ✅ | Core eKYB data capture supported in both versions. | | Inline validation | ✅ | ✅ | Field-level validation during input available in both versions. | | Error States | ✅ | ✅ | Both versions cover general error cases that users can encounter. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime. | Behavior | V1 | V2 | Notes | | --------------------- | ----------------------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------ | | Feedback presentation | Brief contextual instructions | Clear, actionable feedback for a successful capture | V2 has updated feedback instructions for users to correct their action faster. | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. | | Processing behavior | Static processing screen | Branded processing state with consistent loading behavior | V2 aligns loading behavior with the overall system patterns |
          ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.

          --- - Path: `design-and-ux/v1-vs-v2-comparison-ekyc` - URL: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-ekyc/ - Markdown: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-ekyc.md # eKYC V1 vs V2 Comparison In V1, **eKYC** Verification presents a functional but generic credentials form experience. The screen focuses on collecting user information with standard input fields and minimal contextual structure. Processing and success states are simple and isolated, with little continuity between steps. The experience feels transactional, with basic feedback once the form is submitted. In V2, **eKYC** Verification introduces a more structured, branded and guided experience. The interface is organized into clear sections, improving readability and reducing cognitive load. Processing and success states feel more cohesive with smoother visual transitions and clearer confirmation messaging, making the flow feel complete and intentional.

          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | -------------------------- | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | eKYC exprience | ✅ | ✅ | Core functionality present in both versions. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime. | Behavior | V1 | V2 | Notes | | ------------------- | ------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------ | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. | | Processing behavior | Static processing screen | Branded processing state with consistent loading behavior | V2 aligns loading behavior with the overall system patterns |
          ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.

          --- - Path: `design-and-ux/v1-vs-v2-comparison-esign` - URL: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-esign/ - Markdown: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-esign.md # Electronic Signature V1 vs V2 Comparison In V1, the **Electronic Signature** experience presents a functional but generic capture flow. The screen focuses on collecting the user's signature with a basic canvas, minimal instruction text, and a simple "Continue" button. Processing and success states are simple and isolated, with little continuity between steps. The experience feels transactional, with basic feedback once the signature is submitted. In V2, the **Electronic Signature** experience introduces a more structured, branded, and guided flow. The interface includes clearer instructional hierarchy, a "Verified by Incode" trust badge, and distinct visual states for the canvas, "Clear canvas" action, and "Done" button. Processing and success states feel more cohesive with smoother visual transitions and clearer confirmation messaging, making the flow feel complete and intentional.


          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | -------------------------- | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | Signature experience | ✅ | ✅ | Core functionality present in both versions. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime. | Behavior | V1 | V2 | Notes | | ------------------- | ------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------ | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. | | Processing behavior | Static processing screen | Branded processing state with consistent loading behavior | V2 aligns loading behavior with the overall system patterns |
          *** ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.

          --- - Path: `design-and-ux/v1-vs-v2-comparison-forms` - URL: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-forms/ - Markdown: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-forms.md # Forms and Data Entry V1 vs V2 Comparison V1 provides a basic custom fields capture experience, focused primarily on collecting additional user data — such as name, date of birth, or city — through simple form inputs with limited customization and visual feedback. V2 redesigns the data entry flow for greater clarity, consistency, and customization — introducing improved field states, enhanced validation feedback, and full alignment with the token-based design system.

          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | -------------------------- | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | Forms experience | ✅ | ✅ | Core functionality present in both versions. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime. | Behavior | V1 | V2 | Notes | | ------------------- | ------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------ | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. | | Processing behavior | Static processing screen | Branded processing state with consistent loading behavior | V2 aligns loading behavior with the overall system patterns |
          *** ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.

          --- - Path: `design-and-ux/v1-vs-v2-comparison-ocr` - URL: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-ocr/ - Markdown: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-ocr.md # OCR V1 vs V2 Comparison V1 provides a basic OCR Review experience with limited review states, minimal guidance during data confirmation, and limited customization options. V2 enhances the OCR Review experience with clearer review and processing states, improved editable and non-editable data handling, stronger visual guidance, and full alignment with the token-based design system for a more consistent and branded verification workflow.

          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | -------------------------- | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | OCR review Functionality | ✅ | ✅ | Core functionality present in both versions. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime.
          | Behavior | V1 | V2 | Notes | | ------------------- | ------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------ | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. | | Processing behavior | Static processing screen | Branded processing state with consistent loading behavior | V2 aligns loading behavior with the overall system patterns |
          *** ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: - Less engineering work to override UI elements - Consistent branding across modules - Predictable behavior when changing settings - Reduced risk of breaking flows - Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.

          --- - Path: `design-and-ux/v1-vs-v2-comparison-qsign` - URL: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-qsign/ - Markdown: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-qsign.md # Qualified Signature V1 vs V2 Comparison
          V1 delivers a basic Qualified Electronic Signature flow with limited guidance. The experience focuses on completing required steps—reviewing a document, selecting checkboxes, and continuing—without clearly explaining the significance of those actions. V2 transforms the flow into a guided and trust-centered Qualified Electronic Signature experience. The interface introduces clearer structure and hierarchy, helping users understand what they are agreeing to and why it matters.

          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | -------------------------- | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | Signature experience | ✅ | ✅ | Core functionality present in both versions. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime.
          | Behavior | V1 | V2 | Notes | | ------------------- | ------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------ | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. | | Processing behavior | Static processing screen | Branded processing state with consistent loading behavior | V2 aligns loading behavior with the overall system patterns |
          ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.

          --- - Path: `design-and-ux/v1-vs-v2-comparison-watchlist` - URL: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-watchlist/ - Markdown: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-watchlist.md # Watchlist V1 vs V2 Comparison V1 provides a basic watchlist screening experience with minimal status feedback and limited customization. V2 improves the watchlist screening experience with clearer processing and success states, better visual feedback, and alignment with the token-based design system.

          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | -------------------------- | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | Watchlist Functionality | ✅ | ✅ | Core functionality present in both versions. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime.
          | Behavior | V1 | V2 | Notes | | ------------------- | ------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------ | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. | | Processing behavior | Static processing screen | Branded processing state with consistent loading behavior | V2 aligns loading behavior with the overall system patterns |
          ***
          ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: * Less engineering work to override UI elements * Consistent branding across modules * Predictable behavior when changing settings * Reduced risk of breaking flows * Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.

          --- - Path: `design-and-ux/v1-vs-v2-comparison-watchlist-business` - URL: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-watchlist-business/ - Markdown: https://developer.incode.com/design-and-ux/v1-vs-v2-comparison-watchlist-business.md # Watchlist for Business V1 vs V2 Comparison V1 provides a basic Watchlist for Business screening experience with limited visibility into processing states and minimal customization options. V2 enhances the Watchlist for Business experience with clearer verification and review states, improved visual guidance, and full alignment with the token-based design system for a more consistent and branded workflow.

          ***
          ## Feature Comparison Functional capabilities of the module (objective features only; no UX or performance differences). | Capabilities | V1 | V2 | Notes | | -------------------------- | -- | -- | -------------------------------------------------------------------------------------------------------------------------------- | | Watchlist Functionality | ✅ | ✅ | Core functionality present in both versions. | | Customization options | ❌ | ✅ | V1 provides limited customization options, while V2 allows full control over text, colors, buttons, illustrations, and behavior. | | Documentation completeness | ❌ | ✅ | V2 provides complete, standardized documentation coverage. |
          ***
          ## Behavior Differences How the module behaves during runtime.
          | Behavior | V1 | V2 | Notes | | ------------------- | ------------------------ | ----------------------------------------------------------------- | ------------------------------------------------------------------------------ | | State transitions | Default transitions | Specifically designed screen-by-screen transitions for smoothness | V2 includes transition guidelines as part of the module documentation package. | | Processing behavior | Static processing screen | Branded processing state with consistent loading behavior | V2 aligns loading behavior with the overall system patterns |
          *** ## **Customization Overview** Customization in V2 is significantly simpler and more consistent across modules.
          Instead of having isolated configuration options per screen or component, V2 uses a unified token-based system that allows developers to control visuals, behaviors, and experience patterns with fewer parameters and predictable outcomes. This means: - Less engineering work to override UI elements - Consistent branding across modules - Predictable behavior when changing settings - Reduced risk of breaking flows - Clear separation between visual tokens and experience configuration V2 also centralizes all customization options under a single structure, so developers always know where to look and what they can modify.

          --- - Path: `design-and-ux/watchlist-business-design` - URL: https://developer.incode.com/design-and-ux/watchlist-business-design/ - Markdown: https://developer.incode.com/design-and-ux/watchlist-business-design.md # Watchlist for Business The **Watchlist for Business** module screens business entities against global sanctions lists, Politically Exposed Persons (PEPs), adverse media sources, and other compliance watchlists during onboarding and verification. It helps organizations identify potential compliance risks before account approval or activation. *** ## Where it fits in the flow The **Watchlist for Business** module is typically performed after the business information form has been completed and before onboarding is finalized. The screening process validates the submitted business data against global compliance databases to support AML and KYC requirements.. *** ## User Flow The **Watchlist for Business** experience follows a three-step flow.
          *** ## Full Flow Map
          *** ## Happy Path (Light & Dark) The ideal user journey occurs when the business screening process completes successfully without interruptions, delays, or potential watchlist matches requiring additional review. The **happy path** represents the smoothest version of the experience: the user submits the business name and country, the system performs automated screening against sanctions lists, Politically Exposed Persons (PEPs), adverse media sources, and compliance watchlists, and the verification completes successfully. The experience follows a simple three-step flow: the business information form, the processing and screening state, and the successful verification result.

          ## Best Practices Recommended guidelines for designing and implementing the **Watchlist for Business** experience. ✅ Do * Clearly communicate that screening is in progress by displaying loading states and processing indicators during verification. * Provide immediate visual feedback during watchlist screening to reassure users that the verification process is active. * Display a clear success state once screening is completed successfully so users understand they can continue onboarding. ❌ Don't * Don’t allow users to interrupt or resubmit the screening process while verification is still in progress. --- - Path: `design-and-ux/watchlist-design` - URL: https://developer.incode.com/design-and-ux/watchlist-design/ - Markdown: https://developer.incode.com/design-and-ux/watchlist-design.md # Watchlist and Custom Watchlist The **Watchlist** module checks customer identities against global sanctions lists, Politically Exposed Persons (PEPs), and other compliance watchlists during the onboarding and identity verification process. *** ## Where it fits in the flow The **Watchlist** module is typically performed after customer information has been collected and identity data is available for screening. It is positioned before onboarding completion or account approval to ensure the user is checked against sanctions lists, Politically Exposed Persons (PEPs), and other compliance watchlists as part of the risk evaluation process.. *** ## User Flow The **Watchlist** experience guides users through an automated compliance screening process that checks customer identities against sanctions lists, Politically Exposed Persons (PEPs), and other global watchlists before returning a final verification result..
          *** ## Full Flow Map
          *** ## Happy Path (Light & Dark) The ideal user journey occurs when the customer screening process completes successfully without interruptions, delays, or potential watchlist matches requiring additional review. The **happy path** represents the smoothest version of the experience: the user submits their information, the system performs automated screening against sanctions lists, Politically Exposed Persons (PEPs), and compliance watchlists, and the verification completes successfully. The user proceeds to the next step without encountering validation issues, manual review requirements, or blocking compliance matches. Light and dark mode previews are included to help teams validate visual consistency, accessibility, and contrast across themes and platforms.
          *** ## Best Practices Recommended guidelines for designing and implementing the **Watchlist** ✅ Do * Clearly communicate that screening is in progress by displaying loading states and processing indicators during verification. * Provide immediate visual feedback during watchlist screening to reassure users that the verification process is active. * Use concise and user-friendly messaging to explain screening outcomes without exposing sensitive compliance logic. ❌ Don't * Don’t allow users to interrupt or resubmit the screening process while verification is still in progress. * Don’t expose internal compliance logic, risk rules, or watchlist matching criteria to end users. --- - Path: `ecosystem-workforce/account-resets-recovery-with-okta-idv` - URL: https://developer.incode.com/ecosystem-workforce/account-resets-recovery-with-okta-idv/ - Markdown: https://developer.incode.com/ecosystem-workforce/account-resets-recovery-with-okta-idv.md # Account Resets & Recovery with Okta IDV Standard You can use Incode identity verification (IDV) as the authentication method in Okta's Account Management Policy, enabling employees to recover access to their accounts through biometric and document verification instead of or in addition to traditional recovery factors. This page covers configuring Okta to trigger an Incode IDV session during password reset and MFA recovery flows. *** ## Prerequisites Ensure you have the following before you begin: - [Okta IDV Standard](/ecosystem-workforce/okta-idv-standard/) setup page complete - An Okta Identity Engine (OIE) instance - An Okta administrator account with permissions to manage Authentication Policies and the Account Management Policy *** ## Understand IDV for Account Recovery Okta's Account Management Policy controls what authentication factors a user must satisfy before completing a self-service recovery action such as a password or MFA reset. By adding Incode IDV as an allowed factor in this policy, Okta routes users through an Incode identity verification session before granting recovery access. When triggered: 1. The user initiates a password reset or MFA recovery from the Okta login page. 2. Okta evaluates the Account Management Policy and determines that Incode IDV is required. 3. Okta redirects the user to an Incode verification session. 4. The user completes the configured verification session on their mobile device. The Workflow you selected when configuring the [Okta IDV Standard](/ecosystem-workforce/okta-idv-standard/) integration determines the requirements of this session. 5. Incode returns a verification result to Okta. 6. On success, Okta allows the user to complete the recovery action. *** ## Set Up IDV for Account Recovery ### Confirm Incode IDV Is Configured in Okta In your Okta instance, navigate to **Security** > **Identity Providers** and verify that the Incode IDV Standard integration appears in the list. If it is not yet configured, complete the [Incode IDV Integration with Okta](/ecosystem-workforce/okta-idv-standard/) setup page. ### Configure the Account Management Policy 1. Log in to your Okta Admin Console. 2. Navigate to **Security** > **Authentication Policies**. 3. Select **Account Management Policy**. 4. Add or edit a rule for the users or groups you want to require identity verification for recovery. 5. Under **Then**, set the authentication requirement to include **Incode IDV** as an allowed or required factor. 6. Click **Save**. ### Test the Recovery Flow 1. Go to your Okta organization's sign-in page. 2. Select **Forgot Password** or trigger an MFA recovery for a test user. 3. Confirm that Okta routes the user to an Incode verification session. 4. Complete the verification and confirm that Okta allows the recovery action to proceed.
          --- - Path: `ecosystem-workforce/alloy` - URL: https://developer.incode.com/ecosystem-workforce/alloy/ - Markdown: https://developer.incode.com/ecosystem-workforce/alloy.md # Alloy Alloy is a KYC- and fraud-decisioning middleware platform used by banks and fintechs to orchestrate identity checks at account opening and throughout the customer lifecycle. In the Incode and Alloy integration, Incode is the document and biometric verification node inside an Alloy decision graph. When an applicant opens an account, Alloy routes them to Incode for ID capture and face match. Incode returns the verified result to Alloy, which combines it with additional data signals, such as bureau checks and watchlist screening, to make an automated decision: approve, decline, or review. This integration is designed for US fintechs and digital banks using Alloy for identity orchestration. It adds biometric verification without replacing your existing decisioning infrastructure. *** ## Availability This integration is available through the Incode OEM and MSP partner program. Alloy maintains a formal partner marketplace where Incode is listed as a verified identity verification connector. To get started, contact your Incode Representative. --- - Path: `ecosystem-workforce/ashby` - URL: https://developer.incode.com/ecosystem-workforce/ashby/ - Markdown: https://developer.incode.com/ecosystem-workforce/ashby.md # Ashby This page covers integrating Incode identity verification into Ashby ATS. You can verify candidates at key stages to reduce fraud and meet compliance requirements. *** ## Candidate Journey ### Key Stages 1. **Application submission**: Candidate applies through Ashby. 2. **eKYC check**: Incode runs the candidate's phone number and email through its electronic Know Your Customer (eKYC) risk engine. 3. **Risk scoring and routing**: Candidates are routed based on their risk score: - **High risk**: Immediate identity verification through document and selfie capture. - **Medium risk**: Verification before recruiter and hiring manager interviews. - **Low risk**: Direct progression to interviews. 4. **Final verification**: Candidate completes a final identity check before the offer. 5. **Results sync**: Identity verification results—including status, risk score, and timestamp—are written back into Ashby, stored on the candidate's profile. *** ## Understand eKYC eKYC (electronic Know Your Customer) is a digital identity verification process. It was developed for banking and compliance, but it applies equally to hiring. For Ashby, eKYC: - Uses candidate data— including email, phone, and IP/device signals—to detect risk. - Checks for fraud history, synthetic identity patterns, and data mismatches. - Returns a risk score—low, medium, or high—to guide the level of additional verification needed. *** ## Integration with Ashby Using Tines This integration uses Tines, a powerful automation platform, to orchestrate the verification flow between Ashby and Incode. > 📘 Note > > A prebuilt Tines story for this integration is coming soon. ### Example Flow 1. **Trigger**: A candidate submits an application in Ashby. 2. **Action**: Tines retrieves candidate data—name, email, and phone—through the Ashby API. 3. **Verification**: Tines sends the candidate an Incode verification link. 4. **Callback**: Incode returns verification results to Tines. 5. **Update**: Tines pushes the results back into Ashby. *** ## Step Up the Ashby Integration ### Prerequisites - An Ashby ATS account with API access - An Incode developer account - A Tines workspace for automation orchestration ### Configure Ashby Webhooks Set up a webhook in Ashby to trigger when a candidate is created or changes stage. Go to **Admin** > **Integrations** > **Webhooks** and configure the following: - **Event**: `Application Submitted` and `Candidate Application Changed Stage`. ![](https://developer.incode.com/assets/ef28726d55ad22c0b159e934164c29f2.png)
          - **Payload**: Candidate details, including name, email, and phone. - **Destination**: Your Tines webhook URL. ### Configure Custom Candidate Fields In Ashby, go to **Admin** > **Organization Setup** > **Custom Fields**. Under **Candidate**, create custom fields for the following Incode results: - Phone Risk Score \[Incode] - Email Risk Score \[Incode] - First Name \[Incode] - Last Name \[Incode] - Verification Result \[Incode] - Selfie Image \[Incode] ![](https://developer.incode.com/assets/f08c757cc022052cdc5909ead08be7f2.png)
          ### Built Tines Story Import the Tines example story and do the following: - Update credentials for your Ashby and Incode APIs. - Add routing logic based on eKYC risk scoring. ### Connect to the Incode API Use the Incode API to initiate and track identity verification. The following endpoints are available: - `POST /ekyc/check`: Starts risk screening - `POST /identity/verify`: Sends a document and selfie verification link - `GET /identity/status/{id}`: Retrieves real-time verification results. ### Sync Results to Ashby Use the Ashby API to push results, including custom fields such as `Verification Status` and `Risk Score`, back into candidate profiles. You can also configure Ashby automation rules to advance or hold candidates based on verification results. *** ## Example Use Cases - **High-volume recruiting**: Automatically filter out fraudulent applications at scale. - **Sensitive roles**: Enforce mandatory verification before final interviews. - **Global compliance**: Meet KYC/AML requirements in hiring. *** ## What's Next - Map your Ashby hiring stages to the verification checkpoints above. - Import and adapt the Tines story (or other SOAR tool of choice) to Ashby. - Test with sample candidates before rolling out to recruiters.
          --- - Path: `ecosystem-workforce/auth0-post-login-action` - URL: https://developer.incode.com/ecosystem-workforce/auth0-post-login-action/ - Markdown: https://developer.incode.com/ecosystem-workforce/auth0-post-login-action.md # Auth0 Post-Login Action You can integrate Incode identity verification (IDV) into your Auth0 tenant using a post-login Action. When a user logs in, they are redirected to Incode to complete identity verification. The results are stored in their Auth0 profile and included in the ID token. This integration uses the Incode OIDC solution and Auth0 Actions. It supports on-the-fly identity creation, reverification periods, and face authentication for returning users. *** ## Prerequisites Ensure you have the following before you begin: - An Auth0 tenant with Actions enabled. - Access to the Integrations page in Dashboard. Contact your Incode Representative if you do not see it. - An Incode OIDC Client ID and Client Secret—see [Find Integration Details](/dashboard-platform-administration/manage-integrations/#find-integration-details)​. - Your Incode auth server URL (`https://auth.demo.incode.com` for demo, `https://auth.incode.com` for production). *** ## Integration Flow by Persona - **First login (new user)**: The user is redirected to Incode for full identity verification—ID document capture, liveness detection, and face match. Results are stored in `app_metadata` and included in the ID token. - **Returning user within the reverification window**: IDV is skipped. Existing verification claims are re-stamped onto the ID token. - **Returning user requiring reverification**: The user is sent back to Incode. Their stored `incode_identity_id` is passed as the `login_hint`, enabling face authentication instead of full IDV. *** ## Set Up the Auth0 Integration ### Register the Auth0 Redirect URI in Dashboard Before creating the Auth0 action, add Auth0's callback URL as an allowed redirect URI in your Incode OIDC integration. 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. From the Custom tab, open your **OIDC** integration. 4. Add the following as an allowed **Redirect URI**: `https://YOUR_AUTH0_DOMAIN/continue`. 5. Replace `YOUR_AUTH0_DOMAIN` with your Auth0 tenant domain: for example, `your-tenant.us.auth0.com`. ### Create the Post-Login Action in Auth0 1. In your Auth0 Dashboard, go to **Actions** > **Library**. 2. Click **Build Custom Action**. 3. Enter a name: for example, `Incode IDV`. 4. Select **Login/Post Login** as the trigger. 5. Click **Create**. 6. Paste the action code below into the editor, then click **Save Draft**. ```javascript /** * Auth0 Post-Login Action — Incode Identity Verification (OIDC) * Trigger: post-login */ const DEFAULT_AUTH_SERVER = "https://auth.demo.incode.com"; function needsVerification(event, reverificationHours) { const meta = event.user.app_metadata || {}; if (!meta.incode_idv_completed) return true; const lastVerified = meta.incode_idv_completed_at; if (!lastVerified) return true; if (reverificationHours === 0) return false; const hoursSince = (Date.now() - new Date(lastVerified).getTime()) / 36e5; return hoursSince >= reverificationHours; } async function exchangeCodeForTokens(code, redirectUri, tokenEndpoint, event) { const body = new URLSearchParams({ grant_type: "authorization_code", code, redirect_uri: redirectUri, client_id: event.secrets.INCODE_CLIENT_ID, client_secret: event.secrets.INCODE_CLIENT_SECRET, }); const resp = await fetch(tokenEndpoint, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", "Accept": "application/json" }, body: body.toString(), }); if (!resp.ok) { const err = await resp.text(); throw new Error(`Incode token exchange failed (${resp.status}): ${err}`); } return resp.json(); } async function fetchUserInfo(accessToken, userInfoEndpoint) { const resp = await fetch(userInfoEndpoint, { headers: { Authorization: `Bearer ${accessToken}` }, }); if (!resp.ok) { const err = await resp.text(); throw new Error(`Incode userinfo fetch failed (${resp.status}): ${err}`); } return resp.json(); } exports.onExecutePostLogin = async (event, api) => { const authServer = event.secrets.INCODE_SERVER_URL || DEFAULT_AUTH_SERVER; const authEndpoint = `${authServer}/oauth2/authorize`; const reverificationHours = parseFloat(event.secrets.REVERIFICATION_HOURS || "720"); const scopes = event.secrets.SCOPES || "openid"; const auth0Domain = event.secrets.AUTH0_DOMAIN; const blockOnFailure = (event.secrets.BLOCK_ON_FAILURE || "false").toLowerCase() === "true"; if (!needsVerification(event, reverificationHours)) { const meta = event.user.app_metadata || {}; if (meta.incode_idv) { api.idToken.setCustomClaim("https://incode.com/idv", meta.incode_idv); } return; } const redirectUri = `https://${auth0Domain}/continue`; const storedIdentityId = (event.user.app_metadata || {}).incode_identity_id || null; const loginHint = storedIdentityId || event.user.email || null; let sessionToken; try { sessionToken = api.redirect.encodeToken({ secret: event.secrets.REDIRECT_SECRET, expiresInSeconds: 3600, payload: { userId: event.user.user_id }, }); } catch (err) { console.error("[Incode IDV] encodeToken failed:", err.message); if (blockOnFailure) api.access.deny("identity_verification_failed"); return; } const authParams = new URLSearchParams({ response_type: "code", client_id: event.secrets.INCODE_CLIENT_ID, redirect_uri: redirectUri, scope: scopes, state: sessionToken, ...(loginHint ? { login_hint: loginHint } : {}), }); api.redirect.sendUserTo(`${authEndpoint}?${authParams.toString()}`); }; exports.onContinuePostLogin = async (event, api) => { const authServer = event.secrets.INCODE_SERVER_URL || DEFAULT_AUTH_SERVER; const tokenEndpoint = `${authServer}/oauth2/token`; const userInfoEndpoint = `${authServer}/userinfo`; const blockOnFailure = (event.secrets.BLOCK_ON_FAILURE || "false").toLowerCase() === "true"; const auth0Domain = event.secrets.AUTH0_DOMAIN; const redirectUri = `https://${auth0Domain}/continue`; const rawCode = event.request?.query?.code; const rawError = event.request?.query?.error; const rawErrorDescription = event.request?.query?.error_description; if (!rawCode) { console.error("[Incode IDV] No code returned. Error:", rawError, rawErrorDescription); api.user.setAppMetadata("incode_idv_completed", false); api.user.setAppMetadata("incode_idv_error", rawError ? `${rawError}: ${rawErrorDescription}` : "no_code_returned" ); if (blockOnFailure) api.access.deny("identity_verification_failed"); return; } let tokenResponse; try { tokenResponse = await exchangeCodeForTokens(rawCode, redirectUri, tokenEndpoint, event); } catch (err) { console.error("[Incode IDV] Token exchange error:", err.message); api.user.setAppMetadata("incode_idv_completed", false); api.user.setAppMetadata("incode_idv_error", err.message); if (blockOnFailure) api.access.deny("identity_verification_failed"); return; } let userInfo = {}; try { userInfo = await fetchUserInfo(tokenResponse.access_token, userInfoEndpoint); } catch (err) { console.warn("[Incode IDV] UserInfo fetch failed (non-fatal):", err.message); } let idTokenClaims = {}; try { const idTokenPayload = tokenResponse.id_token.split(".")[1]; idTokenClaims = JSON.parse(Buffer.from(idTokenPayload, "base64url").toString("utf8")); } catch (err) { console.warn("[Incode IDV] ID token parse failed (non-fatal):", err.message); } const now = new Date().toISOString(); const interviewId = idTokenClaims.interview_id || userInfo.interview_id || null; const identityId = idTokenClaims.identity_id || userInfo.identity_id || userInfo.sub || null; const pii = { ...(userInfo.name ? { name: userInfo.name } : {}), ...(userInfo.given_name ? { given_name: userInfo.given_name } : {}), ...(userInfo.family_name ? { family_name: userInfo.family_name } : {}), ...(userInfo.birthdate ? { birthdate: userInfo.birthdate } : {}), ...(userInfo.email ? { email: userInfo.email } : {}), ...(userInfo.phone_number ? { phone_number: userInfo.phone_number } : {}), ...(userInfo.address ? { address: userInfo.address } : {}), }; api.user.setAppMetadata("incode_idv", { id_token: tokenResponse.id_token || null, access_token: tokenResponse.access_token || null, token_type: tokenResponse.token_type || null, expires_in: tokenResponse.expires_in || null, interview_id: interviewId, identity_id: identityId, auth_overall_score: idTokenClaims.auth_overall_score || null, auth_overall_status: idTokenClaims.auth_overall_status || null, pii, userinfo: userInfo, }); api.user.setAppMetadata("incode_idv_completed", true); api.user.setAppMetadata("incode_idv_completed_at", now); api.user.setAppMetadata("incode_idv_error", null); if (interviewId) api.user.setAppMetadata("incode_interview_id", interviewId); if (identityId) api.user.setAppMetadata("incode_identity_id", identityId); api.idToken.setCustomClaim("https://incode.com/idv", { completed: true, completed_at: now, interview_id: interviewId, identity_id: identityId, auth_overall_score: idTokenClaims.auth_overall_score || null, auth_overall_status: idTokenClaims.auth_overall_status || null, pii, }); }; ``` ### Configure Action Secrets In the Action editor, click the key icon in the left sidebar to open the Secrets panel. Add the following secrets:
          Secret key Description Example value
          `INCODE_CLIENT_ID` Your Incode OIDC Client ID `4cacb025...`
          `INCODE_CLIENT_SECRET` Your Incode OIDC Client Secret `your-secret`
          `INCODE_SERVER_URL` Incode auth server base URL Use `https://auth.demo.incode.com` for demo and `https://auth.incode.com` for production.
          `REDIRECT_SECRET` Random 32+ character string for signing session tokens Run the following in your browser console to generate a secure random value: ```javascript crypto.getRandomValues(new Uint8Array(32)).reduce((a,b) => a + b.toString(16).padStart(2,'0'), '') ```
          `AUTH0_DOMAIN` Your Auth0 tenant domain `your-tenant.us.auth0.com`
          `REVERIFICATION_HOURS` Hours between re-verifications (`0` = never re-verify) `720`
          `SCOPES` Space-separated OIDC scopes `openid`
          `BLOCK_ON_FAILURE` Set to `true` to deny login if IDV fails `true` or `false`
          ### Deploy the Action After adding all secrets, click **Deploy** in the top right corner of the Action editor. Saving the draft alone is not sufficient; the Action must be deployed before it will run. ### Attach the Action to the Login Flow 1. In the Auth0 Dashboard, go to **Actions** > **Triggers**. 2. Click **post-login**. 3. In the right sidebar under **Custom**, find your `Incode IDV` action. 4. Drag it into the pipeline between **Start** and **Complete**. 5. Click **Apply** to save the flow. *** ## Stored Data After a successful verification, the following is written to the user's `app_metadata` in Auth0: ```json { "incode_idv_completed": true, "incode_idv_completed_at": "2026-04-07T17:28:25.150Z", "incode_interview_id": "69d53e7a...", "incode_identity_id": "69d52eca...", "incode_idv": { "interview_id": "69d53e7a...", "identity_id": "69d52eca...", "auth_overall_score": "100.0", "auth_overall_status": "OK", "pii": {}, "userinfo": { "sub": "69d53e7a..." } } } ``` The following custom claim is also added to the Auth0 ID token under the `https://incode.com/idv` namespace: ```json { "completed": true, "completed_at": "2026-04-07T17:28:25.150Z", "interview_id": "69d53e7a...", "identity_id": "69d52eca...", "auth_overall_score": "100.0", "auth_overall_status": "OK" } ``` *** ## Reverification Period The `REVERIFICATION_HOURS` secret controls how often users must re-verify. | Value | Behavior | | ------ | --------------------------------------------- | | `0` | Never re-verify after completing once | | `24` | Re-verify every 24 hours | | `720` | Re-verify every 30 days (recommended default) | | `8760` | Re-verify once per year | *** ## PII Claims By default, the `openid` scope returns only basic identity identifiers. To receive personally identifiable information (PII) such as name, date of birth, email, and address, contact your Incode Representative to enable additional scopes on your OIDC client, then update the `SCOPES` secret accordingly. | Scope | Data returned | | -------------------- | --------------------------------------- | | `profile` | Name, date of birth | | `email` | Email address | | `phone` | Phone number | | `address` | Physical address | | `id_attestation` | ID document data | | `identity_assurance` | Assurance level and verification status | Example `SCOPES` value with additional scopes enabled: ``` openid profile email id_attestation ``` *** ## Troubleshooting ### **IDV Is Skipped for a User I Expect to be Re-Verified** The user has completed IDV and is within the reverification window. To force re-verification for testing, set `REVERIFICATION_HOURS` to a small value like `1`, or clear `incode_idv_completed` and `incode_idv_completed_at` from the user's `app_metadata` in **Auth0 Dashboard > User Management > Users**. ### **Error: **`invalid_scope` The scope you are requesting is not enabled on your Incode OIDC client. Revert `SCOPES` to `openid` and contact your Incode Representative to enable additional scopes. ### **Error: **`invalid_client` The `INCODE_CLIENT_ID` or `INCODE_CLIENT_SECRET` does not match what is registered in Incode, or `INCODE_SERVER_URL` is pointing to the wrong environment. Verify your credentials in Dashboard and confirm you are using the correct server URL. ### **Error: **`identity_verification_failed` Incode returned an error during the authorization or token exchange step. Check the Auth0 action logs under **Monitoring > Logs** for the specific error. Common causes are an expired authorization code (codes are single-use and expire in approximately 60 seconds) or a redirect URI mismatch. ### **Error: **`no_code_returned` Incode did not return an authorization code. The IDV session may have failed or the user abandoned the flow. If `BLOCK_ON_FAILURE` is `true`, the user is denied login. Check the `incode_idv_error` field in `app_metadata` for the specific error. *** ## OIDC Endpoints Reference | Endpoint | Demo | Production | | ------------- | --------------------------------------------------------------- | ---------------------------------------------------------- | | Authorization | `https://auth.demo.incode.com/oauth2/authorize` | `https://auth.incode.com/oauth2/authorize` | | Token | `https://auth.demo.incode.com/oauth2/token` | `https://auth.incode.com/oauth2/token` | | UserInfo | `https://auth.demo.incode.com/userinfo` | `https://auth.incode.com/userinfo` | | JWKS | `https://auth.demo.incode.com/oauth2/jwks` | `https://auth.incode.com/oauth2/jwks` | | Discovery | `https://auth.demo.incode.com/.well-known/openid-configuration` | `https://auth.incode.com/.well-known/openid-configuration` |
          --- - Path: `ecosystem-workforce/authentication-strengths-conditional-access-with-entra-eam` - URL: https://developer.incode.com/ecosystem-workforce/authentication-strengths-conditional-access-with-entra-eam/ - Markdown: https://developer.incode.com/ecosystem-workforce/authentication-strengths-conditional-access-with-entra-eam.md # Authentication Strengths & Conditional Access with Entra EAM This page covers using Microsoft Entra ID's Authentication Strengths and Conditional Access policies together with Incode EAM. Authentication Strengths define the assurance level required for a given access scenario. Conditional Access policies enforce those requirements based on conditions like user, app, location, or risk. When Incode EAM is configured as a Federated Multifactor method, it can satisfy Authentication Strength requirements directly. *** ## Prerequisites Ensure you have the following before you begin: - [Microsoft Entra EAM](/ecosystem-workforce/microsoft-entra-eam/) setup complete - A Microsoft Entra administrator account with permissions to manage Authentication Methods and Conditional Access policies - A Microsoft Entra ID P1 or P2 subscription *** ## Understand How It Works Microsoft Entra Authentication Strengths define a set of allowed authentication method combinations at a given assurance level. By creating a custom Authentication Strength that includes Federated Multifactor, which covers external authentication methods like Incode EAM, you can then reference that strength in a Conditional Access policy. When a user triggers that policy, Entra requires them to satisfy the Authentication Strength, routing them to Incode for verification. *** ## Set Up Authentication Strengths and Conditional Access ### Create an Authentication Strength 1. Log in to your Microsoft Entra Admin Center as an administrator. 2. Go to **Authentication Methods** > **Authentication Strengths**. 3. Click **New Authentication Strength**. 4. Enter a unique name. 5. Under **Multifactor Authentication**, select **Federated Multifactor**. 6. Click **Next**, then **Create**. ### Create a Conditional Access Policy 1. Go to **Conditional Access** > **Policies**. 2. Click **New Policy** and enter a unique name. 3. Configure the policy: - **Users:** Select the users or groups this policy applies to. - **Conditions:** Define when the policy triggers—by app, location, risk level, etc. See [Microsoft's Conditional Access conditions documentation](https://learn.microsoft.com/en-us/entra/identity/conditional-access/concept-conditional-access-conditions) for details. - **Grant:** Select **Grant access** and then **Require Authentication Strength**. - Select the Authentication Strength created in the previous steps. 4. Click **Select**, then **Create**. *** ## Test the Integration 1. Go to a Microsoft application that meets your configured conditions. 2. Sign in with an Entra account in the target group. 3. After entering your password, confirm you are redirected to Incode to complete identity verification. 4. Complete verification and confirm access is granted.
          --- - Path: `ecosystem-workforce/banking-and-fintech-integrations` - URL: https://developer.incode.com/ecosystem-workforce/banking-and-fintech-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/banking-and-fintech-integrations.md # Banking and Fintech Integrations Banking and fintech integrations embed Incode identity verification directly into core banking platforms, digital account opening workflows, and lending origination systems. They are designed for financial institutions that need to satisfy Know Your Customer (KYC), Customer Identification Program (CIP), and Anti-Money Laundering (AML) requirements as part of a fully digital onboarding experience without requiring applicants to complete verification outside the banking platform. When a new applicant submits an account opening request or a loan application, the banking platform triggers an Incode verification session. The applicant scans their government-issued ID and completes a liveness check on their mobile device. The result is returned to the banking platform to gate credit decisioning, account activation, or compliance recordkeeping. > 📘 **Note** > > Banking and fintech platform integrations are on the Incode roadmap. If you are a financial institution or fintech looking to integrate Incode with your core banking platform, contact your Incode Representative to
          discuss your use case and timeline. *** ## Platforms on the Roadmap The following platforms are planned for integration: | Platform | Use case | | ------------------- | ------------------------------------------------------------------------------------------------------------------- | | Mambu | KYC verification at loan origination and account opening for fintech lenders and embedded finance providers | | Apiture | CIP-compliant identity verification for community banks and credit unions during digital account opening | | FIS / Worldpay | Automated IDV as part of digital account opening and KYC refresh cycles for tier-one banks | | Temenos | Mobile-first KYC for digital challenger banks and neobanks built on Temenos Transact or Infinity | | nCino | Identity verification of business owners and signatories as part of KYB and AML workflows for commercial banks | | Sopra Banking Suite | Payment Services Directive 2 (PSD2) strong customer authentication and AML onboarding compliance for European banks |
          --- - Path: `ecosystem-workforce/ciam-integrations` - URL: https://developer.incode.com/ecosystem-workforce/ciam-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/ciam-integrations.md # CIAM Integrations Customer Identity and Access Management (CIAM) integrations add Incode identity verification as a step within your customer-facing authentication flows. They are designed for use cases where verifying the identity of a customer, not an employee, is required as part of sign-up, login, or a sensitive transaction. You can embed Incode IDV directly into the authentication platform your application already uses. The verified result is returned to the CIAM platform and can be used to gate access, populate user profile attributes, or trigger downstream compliance workflows. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Available CIAM Integrations | Integration | Description | Availability | | :----------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------- | | [Auth0 Post-Login Action](/ecosystem-workforce/auth0-post-login-action/) | Triggers an Incode verification session as a post-login action in Auth0, storing results in the user's Auth0 profile and ID token. | Available | | [Ping DaVinci](/ecosystem-workforce/ping-davinci/) | Connects verified real-world identities to Ping Identity user profiles through OpenID Connect (OIDC), enabling identity verification and face authentication as drag-and-drop nodes in DaVinci flows. | Available | | [Descope](/ecosystem-workforce/descope/) | Adds biometric identity verification as a native step inside any Descope flow. Useful for sign-up, step-up authentication on high-risk events, or identity verification during account recovery. | Available | --- - Path: `ecosystem-workforce/configure-claims-matching-with-okta-idv-standard` - URL: https://developer.incode.com/ecosystem-workforce/configure-claims-matching-with-okta-idv-standard/ - Markdown: https://developer.incode.com/ecosystem-workforce/configure-claims-matching-with-okta-idv-standard.md # Configure Claims Matching with Okta IDV Standard When using Incode IDV with Okta, claims matching verifies that the person completing an identity verification session is the same person on record in your Okta directory. Okta sends the claims it wants Incode to validate as part of the authentication request, and Incode matches those claims against the verified data from the user's ID. This page covers how claims matching works with the [Okta IDV Standard integration](/ecosystem-workforce/okta-idv-standard/) and how to configure it. *** ## Prerequisites Ensure you have the following before you begin: - [Okta IDV Standard](/ecosystem-workforce/okta-idv-standard/) setup page complete. - Claims Matching module enabled in Dashboard for your organization. Contact your Incode Representative if you do not see this module in Workflows. *** ## Understand Claims Matching with Okta IDV When a user is routed through an Incode verification session via the Okta IDV Standard integration, Okta sends a Pushed Authorization Request (PAR) to Incode. This request includes the claims Okta wants validated and the matching logic for each claim. Incode receives these claims and evaluates them against the identity data captured during the verification session: OCR data from the user's government-issued ID, selfie liveness result, and any other modules included in the linked Workflow. ### **Matching Strictness** Okta controls the matching strictness for each claim via the PAR request: - **Exact matching**: The attribute value from the verified ID must match the directory record precisely. Recommended for fields such as date of birth and document number. - **Fuzzy matching**: Allows for minor variations such as name abbreviations, hyphenation differences, or OCR normalization. Recommended for name fields where formatting may vary across documents. *** ## Set Up Claims Matching with Okta IDV ### Add Claims Matching Module to Workflow 1. In the left menu, click **Workflows**. 2. Open the Workflow linked to your Okta IDV Standard integration. 3. From the **Processes** menu, add **Claims Matching** to the Workflow. 4. Click the three dots > **Edit** to open the module configuration. 5. Ensure **External Policy** is selected. This setting instructs Incode to use the claims and matching logic sent by Okta in the PAR request, rather than a locally defined policy. 6. Click **Save Configurations** on the Claims Matching module, then **Save & Publish** for the Workflow. > ⚠️ **Note** > > Do not select **Module Defined Policy** for Okta IDV Standard integrations. That setting is used for non-Okta flows where Incode defines the claims policy locally. For Okta, the claims are always controlled by Okta via the PAR request. ### Configure Claims in Okta Claims sent to Incode are configured on the Okta side as part of your Okta IDV Standard integration settings. Refer to Okta's documentation on Identity Verification claims for details on which attributes can be sent and how to configure matching strictness per claim. *** ## Review Claims Manually If a session's claims cannot be automatically matched, the session is routed to manual review. This may occur when data does not match within the strictness level configured in Okta: for example, a name on the ID differs significantly from the directory record. To review flagged sessions: 1. In the left menu, click **Sessions**. 2. Filter by **Pending review**. 3. Open the session and review the claims match result alongside the captured ID and selfie. 4. Click **Approve** or **Reject** and add a note for audit purposes. *** ## What's Next - Account resets & recovery - Passwordless sign-in with Okta IDV - [Incode IDP integration with Okta](/ecosystem-workforce/okta-idp/)
          --- - Path: `ecosystem-workforce/configure-entra-self-service-to-redirect-to-incode-verification` - URL: https://developer.incode.com/ecosystem-workforce/configure-entra-self-service-to-redirect-to-incode-verification/ - Markdown: https://developer.incode.com/ecosystem-workforce/configure-entra-self-service-to-redirect-to-incode-verification.md # Configure Entra Self-Service to Redirect to Incode Verification By default, Microsoft Entra's **Forgot Password** link on the sign-in page initiates Entra's native Self-Service Password Reset (SSPR) flow. This page covers how to redirect that link to the Incode Self-Service Portal instead, routing employees through biometric identity verification before they can reset their password or MFA credentials. This is useful when you want Incode to be the gating mechanism for all password and MFA resets, rather than relying solely on Entra's native recovery options. *** ## Prerequisites Ensure you have the following before you begin: - A Microsoft Entra administrator account with permissions to manage company branding and SSPR settings - The Incode **Self-Serve Portal** integration configured and the portal URL available. See [Self-Serve Portal](/ecosystem-workforce/self-serve-portal/). - The **Microsoft Entra Directory Sync** integration active so Incode can look up users by email. See [Microsoft Entra Directory](/ecosystem-workforce/microsoft-entra-directory/). *** ## Set Up Redirect Forgot Password to Incode ### Retrieve Your Self-Serve Portal URL 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. Click the Custom tab and open your **Self-Serve Portal** integration. 4. Copy the portal URL. ### Configure a Custom SSPR Link in Microsoft Entra 1. Log in to your Microsoft Entra Admin Center as an administrator. 2. Go to **User Settings** or **Company Branding**, depending on your Entra configuration. 3. Locate the **Self-Service Password Reset** or **Custom Helpdesk Link** setting. 4. Paste your Incode Self-Serve Portal URL as the custom link. 5. Click **Save**. Once configured, users who click **Forgot password** on the Entra sign-in page will be redirected to the Incode Self-Serve Portal, where they complete biometric verification before resetting their credentials. --- - Path: `ecosystem-workforce/configure-incode-as-sso-provider-with-okta-idp` - URL: https://developer.incode.com/ecosystem-workforce/configure-incode-as-sso-provider-with-okta-idp/ - Markdown: https://developer.incode.com/ecosystem-workforce/configure-incode-as-sso-provider-with-okta-idp.md # Configure Incode as SSO Provider with Okta IDP You can configure Incode as a Single Sign-On (SSO) provider for your Okta-connected applications, enabling users to authenticate with Incode biometric verification as their primary login method across your app portfolio. This configuration builds on the [Okta IDP Integration](/ecosystem-workforce/okta-idp/) and assumes the OIDC identity provider and authenticator are already set up. *** ## Prerequisites Ensure you have the following before you begin: - [Okta Authenticator (Preview/OIE)](/ecosystem-workforce/okta-authenticator-previewoie/) or [Okta Authenticator (Classic)](/ecosystem-workforce/okta-authenticator-classic/) steps complete - The Incode OIDC Identity Provider active in your Okta instance - An Okta administrator account with permissions to manage Applications and Authentication Policies *** ## Understand SSO with Okta IDP When configured as an SSO provider, Incode acts as the IDP for application sign-on. Users who attempt to access an Okta-connected application are routed to an Incode verification session instead of or in addition to the standard Okta login page. On successful verification, Incode issues a signed token that Okta uses to authenticate the user into the application. This is typically used in combination with a passwordless authentication policy, where the Incode biometric factor replaces the password entirely. *** ## Set Up Incode as an SSO Provider ### Assign the Incode IDP to Applications 1. Log in to your Okta Admin Console. 2. Go to **Applications** and open the application you want to protect with Incode SSO. 3. Click the **Sign On** tab. 4. In the **Identity Provider** settings, select the Incode OIDC IDP you configured during the authenticator setup. 5. Click **Save**. ### Configure the Authentication Policy 1. Go to **Security** > **Authentication Policies**. 2. Select the policy assigned to the application or create a new one. 3. Add or edit a rule: - Assign the user group you want to use Incode SSO. - Set **User must authenticate with** to the Incode authenticator as the required factor. - You can set Password to **Optional** to enable a fully passwordless experience. 4. Click **Save**, then assign the policy to the application. *** ## Test the SSO Flow Test the SSO flow for the application with a user in the configured group. Confirm that the login flow routes through Incode verification and that the user is successfully authenticated into the application. --- - Path: `ecosystem-workforce/crm-integrations` - URL: https://developer.incode.com/ecosystem-workforce/crm-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/crm-integrations.md # CRM Integrations Customer Relationship Management (CRM) integrations connect Incode identity verification to the platforms your sales and operations teams use to manage customer relationships. They are designed for use cases where verifying a customer's identity is a required step before activating an account, completing a regulated transaction, or progressing through an onboarding workflow. Verification is triggered directly from within the customer record and results are written back automatically. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Available CRM Integrations | Integration | Description | Availability | | :--------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :----------- | | [Salesforce](/ecosystem-workforce/salesforce/) | Triggers an identity verification request from any Contact, Lead, or Account record and receives the results back into that same record: no code, no switching between systems. | Available | --- - Path: `ecosystem-workforce/custom-integrations` - URL: https://developer.incode.com/ecosystem-workforce/custom-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/custom-integrations.md # Custom Integrations Custom integrations connect Incode to any system that does not have a dedicated pre-built connector. They are designed for organizations that want to integrate identity verification into internal tools, custom-built applications, ticketing systems, automation pipelines, or any workflow that can be reached through API or standard authentication protocols. All custom integration types follow the same data model and are managed from the Integrations page in Dashboard. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Integration Mechanisms You must choose one of these mechanisms to build a custom integration: - **OIDC**: Use the OIDC mechanism to connect any system that supports the OpenID Connect protocol. Incode acts as the identity provider, issuing a signed ID token after a successful verification session. This is the right choice for applications that already use OIDC for authentication. > 📘 Note > > The OIDC integration type is also used under the hood by the Okta IDP Authenticator and similar IAM configurations. See [Incode IDP Integration with Okta](/ecosystem-workforce/okta-idp/) for details. - **API**: Use the API mechanism to trigger identity verification sessions from any system using the [Request New Onboarding API](/features-and-modules/b2b-request-new-onboarding-api/). This is the most flexible option and works with anything that can make an HTTP request: ticketing systems, automation tools, custom applications, and more. ### Set Up an OIDC Integration 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. Click **New Integration**. 4. From the **Custom **tab, click **OIDC**, then click **Continue**. 5. Enter a **Name** for this integration. This name appears in analytics and identifies verifications completed through this integration. 6. Configure the **Redirect URI**. This is the endpoint in your system that Incode will redirect to after verification is complete. 7. **Select a Workflow for this Integration **from the drop-down. 8. Click **Save**. A client ID and client secret are generated for your integration. ### Set Up an API Integration 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. From the **Custom** tab, click **API**, then click **Continue**. 4. Enter a **Name** for this integration. This name appears in analytics and identifies verifications completed through this integration. 5. Optionally, enter a **Redirect URL** to send users to after verification is complete. 6. **Select a Workflow for this Integration **from the drop-down. 7. Click **Save**. An integration ID is generated for use in API requests. **Use an API Integration** 1. Call the [Request New Onboarding API](/features-and-modules/b2b-request-new-onboarding-api/) with your Integration ID to generate a unique verification link for a user. The API returns a URL you can deliver via email, SMS, or embed in your system. 2. Share the verification URL with the user. The user clicks the link to begin the verification process. 3. Listen for webhook notifications at the endpoint configured in **Dashboard** > **Configuration** > **Webhooks**. The relevant events are `SESSION_STARTED`, `SESSION_SUCCEEDED`, `SESSION_FAILED`, and `SESSION_PENDING_REVIEW`. See [Session Webhooks](/general-reference/session-webhooks/) for full payload documentation. ### Client Credentials A Client Credentials integration is created automatically for organizations with Integrations Ecosystem enabled. It appears under **Integrations** > **Custom** > **OIDC Client Credentials** and is used to authenticate API requests to Incode using OAuth 2.0. On first use, generate a client secret. It is shown only once, so store it securely. See [Find Integration Details](/dashboard-platform-administration/manage-integrations/#find-integration-details) for instructions. *** ## Available Purpose-Built Integrations The following integrations are pre-configured use cases built on top of the OIDC or API mechanisms above. Each has its own setup page. | Integration | Built on | Description | Status | | ---------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | | [Self-Serve Portal](/ecosystem-workforce/self-serve-portal/) | API | Provides employees with a self-service portal to reset their password or MFA credentials after completing biometric verification. | Available | | [Helpdesk Verifications](/ecosystem-workforce/helpdesk-verifications/) | API | Enables IT support agents to send verification requests to employees on demand before handling high-risk requests such as account unlocks or MFA resets. | Available | | [Tines Automation](/ecosystem-workforce/tines/) | API | Enables you to add automated, biometric identity verification to your security workflows, HR pipelines, or customer onboarding processes. | Available | --- - Path: `ecosystem-workforce/cyberark` - URL: https://developer.incode.com/ecosystem-workforce/cyberark/ - Markdown: https://developer.incode.com/ecosystem-workforce/cyberark.md # CyberArk > 📘 **Coming Soon** > > This integration is in development. Contact your Incode Representative for early access and timeline details. CyberArk is a privileged access management and identity security platform used by enterprises to protect high-value accounts and detect identity-based threats. The Incode and CyberArk integration will add biometric identity verification as a step-up authentication trigger within CyberArk's privileged access and identity threat detection workflows. When anomalous behavior is detected or a user requests access to a privileged account, CyberArk will trigger an Incode verification session to confirm the user's identity before access is granted.
          --- - Path: `ecosystem-workforce/descope` - URL: https://developer.incode.com/ecosystem-workforce/descope/ - Markdown: https://developer.incode.com/ecosystem-workforce/descope.md # Descope Descope is a drag-and-drop CIAM platform that lets developers build authentication and identity flows visually, without code. The Descope Incode Connector adds biometric identity verification as a native step inside any Descope flow, useful for sign-up, step-up authentication on high-risk events, or identity verification during account recovery. The connector is published and maintained by Descope. It is available in the Descope console connector library. *** ## Use Cases The integration supports the following use cases: - Identity verification at customer sign-up - Step-up verification for high-risk transactions or session events - Identity confirmation during account recovery or password reset - Compliance-driven IDV as part of a broader Descope authentication flow *** ## Integration Flow 1. When a user reaches an **Incode/Verify** step in a Descope flow, Descope redirects the user to Incode to complete the verification experience configured in your Incode Flow. 2. After the user finishes, Incode redirects them back to the Descope flow and the connector response populates fields that Descope's flow builder can evaluate, including overall status and score. 3. You use a **condition step** immediately after the connector to branch the flow based on the verification result. For example: - Continue to sign-up completion if verification succeeded. - Route the user to manual review or reject if verification failed. The following output fields are available to downstream flow steps: - `connectors.incode_verify.status` - `connectors.incode_verify.data.status` - `connectors.incode_verify.data.score.overall.status` *** ## Prerequisites Ensure you have the following before you begin: - An active Descope account with access to the Descope console - An Incode account with API access - An Incode API key - An Incode flow ID configured for your verification use case *** ## Set Up the Descope Integration The full setup is documented in Descope's documentation​. The steps below provide a summary. ### Configure the Incode Connector in Descope 1. In the Descope console, open the **Connectors** page. 2. Select **Incode** from the list of available connectors. 3. Enter the following values: | Field | Value | | --------------------- | ------------------------------------------------------------------- | | Connector name | A display name for this connector: for example, `Incode IDV Signup` | | Connector description | Optional description of the connector's purpose | | API Key | Your Incode production API key | | API URL | The base URL of the Incode API | | Flow ID | The Incode flow ID to run when this connector is invoked | 4) Click **Test** to validate the configuration. 5) Click **Create** to save. ### Add the Incode Connector to a Descope Flow 1. In the Descope console, open the **Flows** page. 2. Select an existing flow or create a new one. 3. Click the blue plus (+) icon inside the flow builder and select **Connector**. 4. Choose your configured Incode connector. ### Add a Condition Step to Handle the Result Immediately after the Incode connector, add a **Condition** step. Use one of the connector output keys—for example
          `connectors.incode_verify.data.score.overall.status`—to branch the flow based on whether verification succeeded, failed, or requires review. *** ## Descope Documentation For detailed screenshots, flow examples, and troubleshooting, see Descope's connector configuration guide. --- - Path: `ecosystem-workforce/directory-integrations` - URL: https://developer.incode.com/ecosystem-workforce/directory-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/directory-integrations.md # Directory Integrations Directory integrations connect Incode to your organization's user directory, syncing employee records so that Incode can look up users and perform claims matching during verification sessions. When a directory integration is configured, Incode can locate a user by their `loginHint`—typically a corporate email address or employee ID—and match verified identity attributes from their government-issued ID against the data in your directory. This ensures that the person completing a verification is the same person on record. Directory integrations do not require a linked Workflow and do not trigger verification sessions on their own. They supply the user data that other integration types—such as IAM, ITSM, and Custom—rely on when performing directory-backed lookups. Directory integrations also populate the **Directory Information** page in Dashboard, which lists all synced users and their enrollment status. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Understand Directory Sync After a directory integration is configured and connected: 1. **Incode pulls your user records** from the connected directory, Okta or Microsoft Entra, and stores the relevant identity attributes: name, email, employee ID, and any mapped claims fields. 2. **Records stay in sync**. User additions, updates, and deactivations in your directory are reflected in Incode automatically. 3. **A verification session starts**. Incode uses the `loginHint` to look up the user's directory record and supply their attributes to the claims matching module. 4. **Claims matching runs**. Verified attributes from the government-issued ID (name, date of birth, address, email, phone) are compared against the directory record. Mismatches can be configured to trigger a hard stop or a soft flag for manual review. > 📘 Note > > Directory sync is a prerequisite for claims matching in IAM, ITSM, and Custom integration flows. Configure your directory integration before setting up dependent integration types. *** ## Available Directory Integrations | Integration | Status | | ---------------------------------------------------------------------------------------- | ----------- | | [Okta Directory](/ecosystem-workforce/okta-directory/) | Available | | [Microsoft Entra Directory](/ecosystem-workforce/microsoft-entra-directory/) | Available | | Bring Your Own Directory (BYOD) | Coming soon | *** ## Directory vs. IAM Integrations Directory and IAM integrations both involve Okta and Microsoft Entra, but they serve different purposes: - **Directory integrations** handle user data sync. They tell Incode who your users are and what attributes they have. - **IAM integrations** handle authentication flows. They trigger verification sessions when a user signs in, resets credentials, or requires a higher-assurance check. A directory integration is typically a prerequisite for IAM and other integration types that rely on claims matching. The
          [IAM integrations](/ecosystem-workforce/iam-integrations/) page lists authentication-layer counterparts. --- - Path: `ecosystem-workforce/e-commerce-integrations` - URL: https://developer.incode.com/ecosystem-workforce/e-commerce-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/e-commerce-integrations.md # E-commerce Integrations E-commerce integrations let you embed identity verification into your online store or marketplace. They are designed for use cases where confirming a buyer's age or identity is a required step before a purchase can be completed, such as regulated goods, age-restricted products, or high-value transactions. These integrations embed the verification step directly into the checkout flow, keeping the experience on your storefront. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Available E-commerce Integrations | Integration | Description | Availability | | :--------------------------------------------------- | :------------------------------------------------------------- | :----------- | | [Shopify](/ecosystem-workforce/shopify/) | Adds identity-based age verification to your Shopify checkout. | Available | --- - Path: `ecosystem-workforce/equifax` - URL: https://developer.incode.com/ecosystem-workforce/equifax/ - Markdown: https://developer.incode.com/ecosystem-workforce/equifax.md # Equifax Equifax provides identity and fraud products, including KOUNT and core credit bureau data, used by financial institutions and fintechs to assess identity risk during account opening and transaction monitoring. In the Incode and Equifax integration, Incode is the biometric and document verification front end, with Equifax supplying back-end data verification covering: - SSN validation - Address history - Fraud alerts - Synthetic identity signals The combined result gives lenders and banks a higher-confidence identity decision that satisfies both biometric and
          data-based KYC requirements, addressing scenarios where a fraudster presents a real stolen identity with their own face. *** ## Availability This integration is available through the Equifax developer portal and technology partner program. It is also available through the Incode OEM and MSP partner program. Contact your Incode Representative to get started. --- - Path: `ecosystem-workforce/experian` - URL: https://developer.incode.com/ecosystem-workforce/experian/ - Markdown: https://developer.incode.com/ecosystem-workforce/experian.md # Experian Experian CrossCore is an identity and fraud orchestration platform used by banks and fintechs during customer onboarding. In the Incode and Experian integration, Incode is the biometric document capture and liveness detection layer within a CrossCore workflow. Experian supplies data-based identity corroboration, including name, address, and date of birth matching against credit bureau records, fraud watchlists, and device signals. Together, the two signals satisfy CIP
          requirements more completely than either vendor alone, defending against both presentation attacks and synthetic identity fraud where real stolen personally identifiable information (PII) is paired with a fraudster's face. *** ## Availability This integration is available through the Experian developer marketplace, where Incode is listed as a verified connector within CrossCore workflows. It is also available through the Incode OEM and MSP partner program. Contact your Incode Representative to get started. --- - Path: `ecosystem-workforce/greenhouse` - URL: https://developer.incode.com/ecosystem-workforce/greenhouse/ - Markdown: https://developer.incode.com/ecosystem-workforce/greenhouse.md # Greenhouse This page covers integrating Incode identity verification into the Greenhouse Applicant Tracking System (ATS). You can add verification steps directly to your hiring workflow to confirm candidate identity and reduce fraud. *** ## Candidate Journey The diagram below shows where identity verification fits into the recruiting workflow: ![](https://developer.incode.com/assets/88a8e3bf23c09ab41f013e906fe7abe8.png)
          ### Key Stages 1. **Application submission**: Candidate applies through the job board. 2. **eKYC check**: Candidate's phone number and email trigger an Incode identity check. This is optional. 3. **Risk scoring**: Candidates are routed based on their eKYC risk score: - **High risk**: Immediate identity verification through document and selfie capture. - **Medium risk**: Verification before recruiter and hiring manager interviews. - **Low risk**: Direct progression to interviews. 4. **Final verification**: Candidate completes a final identity check before the offer or final interview. 5. **Results sync**: Results are written back into Greenhouse, updating the candidate profile. *** ## Understand eKYC eKYC (electronic Know Your Customer) is a digital identity verification process. It was developed for banking and compliance, but it applies equally to hiring. For Greenhouse, eKYC: - Uses candidate data, such as their email address and phone number, to perform fraud checks. - Checks for history of fraud, synthetic activity, mismatched identity data, lack of history, and so on. - Returns a risk score—low, medium, or high—to guide the level of additional verification needed. *** ## Integration with Greenhouse Using Tines This integration uses Tines, a powerful automation platform, to orchestrate the verification flow between Greenhouse and Incode. A prebuilt Tines story is available: [Verify Candidate Identity with Greenhouse and Incode](https://www.tines.com/library/stories/1325972/?name=verify-candidate-identity-with-greenhouse-and-incode)​. ### Example Flow 1. **Trigger**: A candidate submits an application in Greenhouse. 2. **Action**: Tines retrieves candidate data—name, email, and phone—through the Greenhouse API. 3. **Verification**: Tines sends the candidate an Incode verification link. 4. **Callback**: Incode returns verification results to Tines. 5. **Update**: Tines pushes the results back into Greenhouse, updating the candidate record. Recruiters and hiring managers can see real-time verification status without leaving Greenhouse. *** ## Set Up the Greenhouse Integration ### Prerequisites - A Greenhouse ATS account with API access - An Incode developer account - A Tines workspace for automation (or another automation platform) ### Configure Greenhouse Webhooks and Custom Fields Set up a webhook in Greenhouse to trigger when a candidate is created or changes stage. Go to your Greenhouse webhook settings and configure the following: - **Event**: Candidate has been created or has changed stage. - **Payload**: Candidate details, including name, email, and phone. - **Destination**: Your Tines webhook URL. Add custom fields in Greenhouse for the results you want to map, such as `Verification Status` and `Risk Score`. See [Greenhouse: Add or edit a custom candidate field](https://support.greenhouse.io/hc/en-us/articles/202609675-Add-or-edit-a-custom-candidate-field). ### Build Tines Story Import the [Tines story](https://www.tines.com/library/stories/1325972/?name=verify-candidate-identity-with-greenhouse-and-incode) and do the following: - Update credentials for your Greenhouse and Incode APIs. - Define routing rules based on eKYC risk scoring. - Run the Lookup Customer Fields action to retrieve the results. ### Connect to the Incode API Use the Incode API to initiate and complete identity verification. The following endpoints are available: - `POST /omni/externalVerification/ekyc`: Starts a risk check using email and phone. - `POST /v1/workforce/verification/candidate/generate-verification-link`: Creates a URL for document and selfie verification. ### Sync Results to Greenhouse Tines calls the Greenhouse API to update candidate profiles with verification results. *** ## Example Use Cases - **High-volume hiring**: Automatically filter out fraudulent applications at scale. - **Sensitive roles**: Enforce mandatory verification before final interviews. - **Global workforce compliance**: Meet KYC/AML requirements in hiring. *** ## What's Next - Work with your Incode Solutions Engineer to get your Incode API credentials. - Import the [Tines story](https://www.tines.com/library/stories/1325972/?name=verify-candidate-identity-with-greenhouse-and-incode)​. - Map your hiring journey to the verification checkpoints in the diagram. - Deploy the automation in Tines and test with sample candidates. [Watch the demo](https://youtu.be/zBxfTJ2jWio?si=H_WfcEyNedR6ZNfb)
          --- - Path: `ecosystem-workforce/helpdesk-verifications` - URL: https://developer.incode.com/ecosystem-workforce/helpdesk-verifications/ - Markdown: https://developer.incode.com/ecosystem-workforce/helpdesk-verifications.md # Helpdesk Verifications The Helpdesk integration enables IT and support agents to initiate an identity verification session for an employee on demand before handling high-risk requests such as MFA resets, account unlocks, or access changes. Instead of relying on knowledge-based authentication such as security questions, the agent sends the employee a verification link. The employee completes a biometric check, and the agent views the result directly in Dashboard before proceeding. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Helpdesk Flow ### Agent-Initiated Flow 1. A support agent receives a high-risk request from an employee: for example, an MFA reset or account unlock. 2. The agent uses Dashboard or the [Request New Onboarding API](/features-and-modules/b2b-request-new-onboarding-api/) to send the employee a verification link. 3. The employee receives the link by email or SMS and completes identity verification on their device. 4. The agent views the verification result in Dashboard and proceeds accordingly. ### Trigger Verifications Through the API To request a verification programmatically, use the [Request New Onboarding API](/features-and-modules/b2b-request-new-onboarding-api/) with the helpdesk integration's `integrationReference` value and the employee's `loginHint`. ``` POST {base-api-url}/omni/b2b/onboarding/request-new ``` Set `notification.type` to `EMAIL` or `SMS` to deliver the verification link directly to the employee. *** ## Set Up Helpdesk Verifications 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. Locate the **Helpdesk** integration and open its configuration. 4. **Select a Workflow for this Integration **from the drop-down. 5. Click **Save**. An integration reference ID is generated for triggering verification sessions through the API. *** ## View Verification Results Completed verification sessions are found in Dashboard under the employee's Identity. Session outcomes are also available via [session webhooks](/general-reference/session-webhooks/). --- - Path: `ecosystem-workforce/hr-integrations` - URL: https://developer.incode.com/ecosystem-workforce/hr-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/hr-integrations.md # HR Integrations HR integrations let you initiate identity verification from your human resources platform as part of hiring and onboarding. Use them for pre-employment and new-hire use cases where verifying a candidate's or new employee's legal identity is a required step before they can access company systems or complete onboarding. These integrations trigger identity verification directly from the tools your HR and recruiting teams already use, instead of running it as a separate process. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Available HR Integrations | Integration | Description | Status | | ---------------------------------------------------- | ------------------------------------------------------------------------------ | ----------- | | [Workday](/ecosystem-workforce/workday/) | Triggers identity verification as part of Workday hiring and onboarding flows. | Coming soon | *** ## Candidate Verification For candidate-based use cases that don't require a direct ATS integration, you can use the [Custom API integration](/ecosystem-workforce/custom-integrations/) to trigger verification sessions programmatically via the [Request New Onboarding API](/features-and-modules/b2b-request-new-onboarding-api/). This approach works with any system and doesn't require a pre-built connector.
          --- - Path: `ecosystem-workforce/iam-integrations` - URL: https://developer.incode.com/ecosystem-workforce/iam-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/iam-integrations.md # IAM Integrations Identity and access management (IAM) integrations add Incode identity verification as a high-assurance step within your organization's identity and access management flows. They are used to trigger verification sessions during sign-in, account recovery, MFA reset, or any access event where confirming a user's identity is required. Unlike [directory integrations](/ecosystem-workforce/directory-integrations/), which handle user data sync, IAM integrations are tied to a specific Workflow and are triggered by an authentication event in your identity provider. Both Okta and Microsoft Entra appear in the IAM category, but their IAM integrations are separate from their directory integrations. A directory integration syncs user data; an IAM integration routes users through an Incode verification session during an auth flow. You can use both together. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Available IAM Integrations *** ## Understand IAM Integrations Each IAM integration links to a Workflow. When your identity provider triggers an identity verification event, Incode runs the associated Workflow and returns the result to the identity provider. Depending on the integration type, the result either allows or blocks the user from completing their IAM flow. Claims matching is commonly used alongside IAM integrations to verify that the person completing the session matches the directory record associated with their account. :::note If your IAM integration will use claims matching, configure your [Okta Directory](/ecosystem-workforce/okta-directory/) or [Microsoft Entra Directory](/ecosystem-workforce/microsoft-entra-directory/)
          integration first. Claims matching requires an active directory sync to function. ::: --- - Path: `ecosystem-workforce/iga-integrations` - URL: https://developer.incode.com/ecosystem-workforce/iga-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/iga-integrations.md # Identity Governance and Administration Integrations Identity Governance and Administration (IGA) integrations connect Incode identity verification to your IGA platform, enabling identity proofing as part of provisioning, access certification, and lifecycle management workflows. These integrations let your IGA platform confirm that the person requesting or being granted access is who they claim to be, using biometric verification against a government-issued ID. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Available IGA Integrations | Integration | Description | Availability | | :------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------- | :----------- | | [SailPoint Identity Security Cloud](/ecosystem-workforce/sailpoint-identity-security-cloud/) | Adds biometric identity verification as a step within SailPoint identity governance workflows. | Available | --- - Path: `ecosystem-workforce/integrations-ecosystem-overview` - URL: https://developer.incode.com/ecosystem-workforce/integrations-ecosystem-overview/ - Markdown: https://developer.incode.com/ecosystem-workforce/integrations-ecosystem-overview.md # Ecosystem (Workforce) The Incode Platform connects with the tools your organization already uses, such as identity providers, directories, HR systems, ticketing platforms, and productivity apps. You can set up and configure these connections through a unified Integrations experience in Dashboard. Each integration links an external system to an Incode Workflow and defines: - **Which external system** is connecting, such as Okta, Microsoft Entra, or Slack. - **Which Workflow** runs when that system triggers an identity verification session. - **How the session is initiated**: automatically via directory sync, via API, or by a user action in a connected app. Incode supports integrations across: - Identity and access management (IAM) - IT service management (ITSM) - Human resources - Recruitment - Messaging - Customer identity (CIAM) - Identity governance (IGA) - Identity threat detection (ITDR) - E-commerce - Custom API connections. All integration types follow the same configuration model and are managed from the Integrations page in Dashboard. *** ## The Integrations Page All integrations are created and managed from the Integrations page in Dashboard. To access it, click **Integrations** from the left menu. :::note The Integrations page is only visible when the Integrations Ecosystem feature is enabled for your organization. Contact your Incode Representative if you do not see it. ::: From the Integrations page, you can: - Browse all active integrations organized by category. - Create new integrations. - View and edit integration configuration. - Access the **Integration Reference** ID used for API-triggered sessions. - View a directory of all enrolled users associated with directory integrations. Instructions for these tasks are described in [Manage Integrations](/dashboard-platform-administration/manage-integrations/). Create, update, and delete actions are recorded in the Audit Log. *** ## Verification Session Flow Regardless of the integration type, every session follows the same end-to-end path: 1. **Trigger**: An event in the connected system—such as a service request, a sign-in attempt, a new hire record, or an API call—initiates a verification session through the integration. 2. **Session delivery**: Incode generates a one-time verification link and delivers it to the end user via SMS, email, or inline redirect, depending on the integration type. 3. **Verification**: The end user completes the configured Workflow on their device: document capture, liveness check, and any additional modules, such as claims matching or eKYC. 4. **Result**: Incode posts the outcome—pass, fail, or pending review—back to the originating system via webhook or API response. The result includes risk score, verification status, and matched identity attributes. 5. **Action**: The connected system acts on the result, granting access, resolving a ticket, approving a hire, or routing to manual review. :::info Most integrations can be configured and tested in under an hour. Directory-based integrations, such as Okta and Microsoft Entra, require a one-time directory sync setup. Custom API integrations are live as soon as a Client Credentials token is generated. ::: *** ## Integration Categories Integrations are organized into categories based on the type of external system they connect to. ### Directory [Directory integrations](/ecosystem-workforce/directory-integrations/) sync your organization's user directory with Incode, enabling employee lookups and claims matching during verification sessions. | Integration | Status | | ---------------------------------------------------------------------------------------- | ----------- | | [Okta Directory](/ecosystem-workforce/okta-directory/) | Available | | [Microsoft Entra Directory](/ecosystem-workforce/microsoft-entra-directory/) | Available | | Bring Your Own Directory (BYOD) | Coming soon | ### IAM IAM integrations add Incode identity verification as a step in your organization's access management flows. They can be used as an external authentication method or an identity verification step during sign-in. ### Productivity Productivity integrations bring identity verification into the collaboration tools your teams use every day. | Integration | Description | Status | | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------- | --------- | | [Slack](/ecosystem-workforce/slack/) | Enables identity verification requests to be sent and completed directly within Slack using slash commands. | Available | ### IT Service Management (ITSM) ITSM integrations connect Incode to your IT service management platform, enabling agents to trigger identity verification directly from support workflows. | Integration | Description | Status | | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | | [ServiceNow](/ecosystem-workforce/servicenow/) | Integrates Incode identity verification into ServiceNow ITSM workflows, enabling agent-initiated verification from within tickets and service flows. | Available | | [Jira Service Management](/ecosystem-workforce/jira-service-management/) | Allows help desk agents to verify employee identities directly from a JSM service request using Incode's biometric verification platform. | Available | ### HR HR integrations allow you to initiate identity verification from your human resources platform as part of hiring and onboarding workflows. | Integration | Description | Status | | ---------------------------------------------------- | ------------------------------------------------------------------------------ | ----------- | | [Workday](/ecosystem-workforce/workday/) | Triggers identity verification as part of Workday hiring and onboarding flows. | Coming soon | ### Recruitment Recruitment integrations connect Incode to your applicant tracking system (ATS), enabling identity verification as part of the hiring process. | Integration | Description | Availability | | :------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------- | | [Greenhouse](/ecosystem-workforce/greenhouse/) | Triggers candidate identity verification from within Greenhouse ATS. | Available | | [Ashby](/ecosystem-workforce/ashby/) | Triggers candidate identity verification from within Ashby ATS. | Available | | [Workday Recruiting](/ecosystem-workforce/workday-recruiting/) | Leverages facial biometrics, document authentication, and fraud detection to validate candidate identities during the hiring process. | Available | | [Lever](/ecosystem-workforce/lever/) | Sends a personalized Incode verification link, captures the result, and writes it back to the candidate's Lever opportunity with no manual steps required. | Available | ### E-commerce E-commerce integrations allow you to embed identity verification directly into your online store or marketplace. | Integration | Description | Availability | | :--------------------------------------------------- | :------------------------------------------------------------- | :----------- | | [Shopify](/ecosystem-workforce/shopify/) | Adds identity-based age verification to your Shopify checkout. | Available | ### Identity Threat Detection and Response (ITDR) ITDR integrations connect Incode to your threat detection platform, enabling your security team to trigger identity verification as part of an active incident response workflow. | Integration | Description | Availability | | :--------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------- | | [Microsoft Defender for Identity](/ecosystem-workforce/microsoft-defender-for-identity/) | Connects Incode verification to Microsoft Sentinel via Azure Logic Apps. When Defender raises a suspicious activity incident, the playbook sends the flagged user a verification link and posts the result back to Sentinel. | Available | | [CyberArk](/ecosystem-workforce/cyberark/) | Adds biometric identity verification as a step-up authentication trigger within CyberArk's privileged access and identity threat detection workflows. | Coming soon | ### Customer Identity and Access Management (CIAM) CIAM integrations add Incode identity verification as a step within your customer-facing authentication flows. Use them for sign-up, login, or sensitive transaction flows that require identity verification. | Integration | Description | Availability | | :----------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------- | | [Auth0 Post-Login Action](/ecosystem-workforce/auth0-post-login-action/) | Triggers an Incode verification session as a post-login action in Auth0, storing results in the user's Auth0 profile and ID token. | Available | | [Ping DaVinci](/ecosystem-workforce/ping-davinci/) | Connects verified real-world identities to Ping Identity user profiles through OpenID Connect (OIDC), enabling identity verification and face authentication as drag-and-drop nodes in DaVinci flows. | Available | | [Descope](/ecosystem-workforce/descope/) | Adds biometric identity verification as a native step inside any Descope flow. Useful for sign-up, step-up authentication on high-risk events, or identity verification during account recovery. | Available | ### Customer Relationship Management (CRM) CRM integrations connect Incode identity verification to the platforms your sales and operations teams use to manage customer relationships. | Integration | Description | Availability | | :--------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :----------- | | [Salesforce](/ecosystem-workforce/salesforce/) | Triggers an identity verification request from any Contact, Lead, or Account record and receives the results back into that same record: no code, no switching between systems. | Available | ### Identity Governance and Administration (IGA) IGA integrations connect Incode to your identity governance platform, enabling identity proofing as part of provisioning, access certification, and lifecycle management workflows. | Integration | Description | Availability | | :------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------- | :----------- | | [SailPoint Identity Security Cloud](/ecosystem-workforce/sailpoint-identity-security-cloud/) | Adds biometric identity verification as a step within SailPoint identity governance workflows. | Available | ### OEM and MSP Partner OEM and MSP partner integrations combine Incode's biometric and document verification with third-party identity data signals to produce a more complete and reliable identity decision. | Integration | Description | Availability | | :--------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------- | | [Alloy](/ecosystem-workforce/alloy/) | Positions Incode as the document and biometric verification node inside an Alloy decision graph. | Available | | [Experian](/ecosystem-workforce/experian/) | Positions Incode as the biometric document capture and liveness detection layer within a CrossCore workflow. | Available | | [Equifax](/ecosystem-workforce/equifax/) | Positions Incode as the biometric and document verification front end, with Equifax supplying back-end data verification covering SSN validation, address history, fraud alerts, and synthetic identity signals. | Available | | [TransUnion](/ecosystem-workforce/transunion/) | Pairs Incode biometric and document verification with TransUnion data-based identity signals to produce a composite identity verification score. | Available | ### Custom Custom integrations connect Incode to any system, including internal tools, ticketing systems, and automation pipelines. These connections use standard protocols or the Incode API directly. | Integration | Built on | Description | Status | | ---------------------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | | [Self-Serve Portal](/ecosystem-workforce/self-serve-portal/) | API | Provides employees with a self-service portal to reset their password or MFA credentials after completing biometric verification. | Available | | [Helpdesk Verifications](/ecosystem-workforce/helpdesk-verifications/) | API | Enables IT support agents to send verification requests to employees on demand before handling high-risk requests such as account unlocks or MFA resets. | Available | | [Tines Automation](/ecosystem-workforce/tines/) | API | Enables you to add automated, biometric identity verification to your security workflows, HR pipelines, or customer onboarding processes. | Available | ### Coming Soon | Integration Category | Description | | :------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | [Banking and Fintech](/ecosystem-workforce/banking-and-fintech-integrations/) | Embed Incode identity verification directly into core banking platforms, digital account opening workflows, and lending origination systems. | | [Student Information System](/ecosystem-workforce/student-information-system-integrations/) | Embed Incode identity verification into the platforms used by higher education institutions and K-12 organizations to manage student records, enrollment, and access to academic resources. | | [Video Conferencing](/ecosystem-workforce/video-conferencing-integrations/) | Add identity verification as a step before participants can join a meeting, webinar, or video call. | *** ## Key Concepts The following concepts are referenced throughout the Integrations documentation: - **Login Hint: **A `loginHint` is a user identifier—typically a corporate email address, username, or employee ID—passed to Incode at the start of a verification session. It is used to look up the user in a connected directory and associate the session with an existing identity record. - **Integration ID: **Each integration has a unique Integration ID. This ID is required when triggering verification sessions via the [Request New Onboarding API.](/features-and-modules/b2b-request-new-onboarding-api/) It routes the session through the correct Workflow and integration configuration. - **Claims Matching: **Many integration use cases require comparing attributes from the user's government-issued ID against connected directory data, such as name, date of birth, or email. Claims matching is configured as a Workflow module and can be customized. - **Client Credentials: **A Client Credentials integration is created automatically for organizations with Integrations Ecosystem enabled. It appears under **Integrations** > **Custom** > **OIDC Client Credentials** and is used to authenticate API requests to Incode using OAuth 2.0. - **Security and Data Handling: **All data exchanged between Incode and connected systems is encrypted in transit using TLS 1.2 or higher. Integration credentials, such as client secrets and API keys, are hashed at rest and never returned in plaintext after initial creation. Verification results written back to third-party systems contain only the outcome, risk score, and matched attributes. Raw biometric data and document images are never forwarded to the connected system. Retention of session data is configurable at the attribute level in **Dashboard** > **Configuration** > **Data**. --- - Path: `ecosystem-workforce/it-service-management-itsm-integrations` - URL: https://developer.incode.com/ecosystem-workforce/it-service-management-itsm-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/it-service-management-itsm-integrations.md # IT Service Management IT Service Management (ITSM) integrations connect Incode to your ITSM platform, enabling support agents to trigger identity verification sessions directly within their existing ticketing and workflow tools. This eliminates the need for out-of-band verification steps. When an employee submits a high-risk IT request, the agent can initiate a verification session from within the ITSM platform and proceed only after the employee's identity is confirmed. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Available ITSM Integrations | Integration | Description | Status | | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | --------- | | [ServiceNow](/ecosystem-workforce/servicenow/) | Integrates Incode identity verification into ServiceNow ITSM workflows, enabling agent-initiated verification from within tickets and service flows. | Available | | [Jira Service Management](/ecosystem-workforce/jira-service-management/) | Allows help desk agents to verify employee identities directly from a JSM service request using Incode's biometric verification platform. | Available | --- - Path: `ecosystem-workforce/itdr-integrations` - URL: https://developer.incode.com/ecosystem-workforce/itdr-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/itdr-integrations.md # ITDR Integrations ITDR (Identity Threat Detection and Response) integrations connect Incode to your threat detection platform, enabling your security team to trigger identity verification as part of an active incident response workflow. When a suspicious activity alert—such as anomalous login behavior, lateral movement, or credential misuse—is raised, your security team can send the flagged user a biometric verification link directly from within the ITDR platform. The result is returned automatically, giving your team the confirmation they need to determine whether the alert is a
          genuine threat or a false positive. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Available ITDR Integrations | Integration | Description | Availability | | :--------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------- | | [Microsoft Defender for Identity](/ecosystem-workforce/microsoft-defender-for-identity/) | Connects Incode verification to Microsoft Sentinel via Azure Logic Apps. When Defender raises a suspicious activity incident, the playbook sends the flagged user a verification link and posts the result back to Sentinel. | Available | | [CyberArk](/ecosystem-workforce/cyberark/) | Adds biometric identity verification as a step-up authentication trigger within CyberArk's privileged access and identity threat detection workflows. | Coming soon | --- - Path: `ecosystem-workforce/jira-service-management` - URL: https://developer.incode.com/ecosystem-workforce/jira-service-management/ - Markdown: https://developer.incode.com/ecosystem-workforce/jira-service-management.md # Jira Service Management This page covers configuring the Incode Identity Verification app for Jira Service Management (JSM). The integration allows help desk agents to verify employee identities directly from a JSM service request using Incode's biometric verification platform. When a service request is created, agents can send a verification link to the employee through SMS or email. The employee completes a liveness check and face match on their device, and the result is automatically posted back to the ticket. *** ## Prerequisites Ensure you have the following before you begin: - An active Incode Workforce account - A Jira Service Management Cloud instance - Admin access to both your JSM instance and Incode Dashboard - The Integration Ecosystem feature enabled in your Incode Dashboard—required for Client Credentials *** ## Set Up the JSM Integration ### Install the App 1. Go to the [Atlassian Marketplace](https://marketplace.atlassian.com) and search for **Incode Identity Verification**. 2. Click **Get it now** and select your JSM site. 3. Follow the installation prompts and grant the requested permissions. 4. After installing, go to **Jira Settings > Apps > Incode Verification Settings**. ### Gather your Incode Credentials You need the following from Dashboard: | Field | Where to find it | | ------------------------- | ---------------------------------------------------------------------------- | | **API Key** | Ask your Incode Representative | | **Client ID** | Dashboard > Integrations > Default client credentials integration | | **Client Secret** | Dashboard > Integrations > Default client credentials integration > Generate | | **Integration Reference** | Dashboard > Integrations > your B2B integration | > ⚠️ **Warning** > > The Client Secret is only shown once when generated. Store it securely before closing the dialog. ### Configure the App Go to **Jira Settings > Apps > Incode Verification Settings** and fill in the following sections: **Incode API Credentials** - **Environment**: Select **Demo** for testing or **Production** for live use. - Demo API: `demo-api.incodesmile.com` - Production API: `saas-api.incodesmile.com` - **API Key**: Enter your Incode API key. - **Client ID**: Enter your OAuth 2.0 Client ID. - **Client Secret**: Enter your OAuth 2.0 Client Secret. - **Integration Reference**: Enter your B2B integration reference ID. Click **Test credentials** to verify the connection. You should see a **✓ Connected** badge if the credentials are valid. **Verification Settings** - **Link expiry (minutes)**: How long the verification link remains valid (5–60 minutes, default 10). - **Default delivery method**: Whether to default to **SMS** or **Email** delivery when the agent opens the panel. **Jira Status Transitions (Optional)** Map Incode verification outcomes to your existing JSM ticket statuses. Leave blank to manage ticket status manually. | Outcome | Recommended status | | ---------------------- | ------------------- | | Verification passes | In Progress | | Verification fails | Escalate | | Manual review required | Escalate or Pending | **Comment Messages (Optional)** Customize the comments posted to Jira tickets when verification completes. The following template variables are available: | Variable | Description | | ---------------- | -------------------------- | | `{{name}}` | Employee's display name | | `{{email}}` | Employee's corporate email | | `{{identityId}}` | Incode identity ID | | `{{sessionId}}` | Incode session ID | Click **Save configuration** when done. ### Configure Webhooks in Incode Dashboard To receive real-time verification results in your JSM tickets, register your webhook URL in the Incode Dashboard. 1. In Dashboard, go to **Configuration > Webhooks**. 2. Add a new webhook with the following settings: - **URL**: Your Forge webhook URL (provided during app setup) - **Events**: `SESSION_STARTED`, `SESSION_SUCCEEDED`, `SESSION_FAILED`, `SESSION_PENDING_REVIEW` 3. Click **Save**. > 📘 **Note** > > Your webhook URL is unique to your JSM installation. Contact [support.incode.com](https://support.incode.com) if you need help > locating it. ### Set Up Your Employee Directory The B2B API matches employees against your Incode directory using the corporate email address as the `loginHint`. Ensure your employees are enrolled in Incode before using the integration. *** ## Understand the Agent Workflow After setup, the agent workflow is as follows: 1. An employee calls the help desk and a service request is open in JSM. 2. The agent opens the ticket and scrolls to the **Incode Identity Verification** panel. 3. The agent enters the employee's corporate email address. 4. The agent selects the delivery method: - **SMS**: Recommended for lockout scenarios where the employee cannot access corporate email - **Email**: Sends to corporate email or an alternate address 5. The agent clicks **Send verification link**. 6. The employee receives the link and completes biometric verification on their device, typically in under 30 seconds. 7. The panel automatically updates with the result, no refresh needed. 8. The JSM ticket is updated with: - An activity comment showing the verification result, identity ID, and session ID - An automatic status transition, if configured *** ## Verification Outcomes | Outcome | Panel display | Default comment | | -------------- | ---------------------- | --------------------------------------- | | Passed | Verification passed | Identity confirmed—you may proceed | | Failed | Verification failed | Do not proceed—escalate for review | | Pending review | Manual review required | Do not proceed until review is complete | *** ## Troubleshooting **"Setup Required" Message in the Panel** The app has not been configured yet. Go to **Jira Settings > Apps > Incode Verification Settings** and enter your Incode credentials. **"Error Sending Verification"** Confirm the following: - Your Incode credentials are correct; use the **Test credentials** button to verify. - The employee's corporate email exists in your Incode directory. - Your integration reference is correct. - The Incode environment (Demo/Production) matches your account. **Ticket Status Not Updating Automatically** Confirm the following: - You have selected status transitions in the admin settings. - The transition name must exactly match an available transition from the ticket's current state. - Check that your JSM project workflow includes the configured transitions. **Webhook Results Not Appearing** Confirm the following: - Verify the webhook URL is registered in your Incode Dashboard. - Confirm all four session event types are enabled. - Check that your Incode account has the Integration Ecosystem feature enabled.
          --- - Path: `ecosystem-workforce/lever` - URL: https://developer.incode.com/ecosystem-workforce/lever/ - Markdown: https://developer.incode.com/ecosystem-workforce/lever.md # Lever This page covers integrating Incode identity verification into the Lever Applicant Tracking System (ATS). This integration uses Tines, a powerful automation platform, to orchestrate the verification flow between Lever and Incode. When a candidate reaches a designated hiring stage, Tines sends them a personalized verification link, captures the result, and writes it back to their Lever opportunity automatically. This integration handles the full candidate verification lifecycle. It: - Validates incoming Lever webhook signatures using HMAC-SHA256. - Triggers only when a candidate reaches your designated verification stage. - Fetches candidate details from Lever, generates an Incode verification link, and emails it to the candidate. - Stores a trace record in Tines to map verification results back to the correct Lever opportunity. - Listens for Incode verification status updates and writes results, including notes and tags, back to Lever automatically. > 📘 **Note** > > You will need an active Tines workspace, a Lever account with API access, and an Incode account with API credentials to proceed. *** ## Prerequisites Ensure you have the following before you begin: | Requirement | Details | | ------------- | ------------------------------------------------------------------------------------------------------------------------ | | Tines | An active workspace with permission to create stories, credentials, and records. The Records feature must be enabled. | | Lever ATS | An account with Admin or Super Admin access to create API keys and configure webhooks. | | Incode | An active integration with integration ID, secret, and x-api-key available. | | Email sending | Tines email delivery is used to send verification links. Ensure your workspace domain is allowlisted for outbound email. | *** ## Understand Flows The automation runs as two independent flows that communicate through a shared Tines Records table. ### Flow 1: Trigger and Send Verification Fires when a candidate moves to the verification stage in Lever. ``` [Stage change webhook] → [Validate signature] → [Check stage ID] ↓ [GET /candidates/{id}] → [Extract name & email] → [3 min delay] ↓ [GET Incode auth token] → [Generate verification link] ↓ [Capture Tines record] → [Send email to candidate] ``` ### Flow 2: Receive Result and Update Lever Fires when Incode posts a verification status event to your Tines webhook. ``` [Status update webhook] → [Check event_type == succeeded] ↓ [Match trace ID → OpportunityID] ↓ [Add tag: biometric-verified] → [Post verification note] ``` > ⚠️ **Warning** > > Flow 2 triggers only on `verification.succeeded` events. Failed or expired verifications are written as notes to Lever but do not trigger the tag update. You can extend the story to handle additional event types such as `verification.failed`. *** ## Set Up the Lever Integration ### Configure Credentials This Tines story requires five credentials stored in your Tines workspace. Go to **Credentials** in the Tines sidebar and create each one as a Text credential. | Credential name | Source | Description | | ------------------------------------ | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | | `lever_api_key` | Lever > Settings > Integrations > API Credentials | Your Lever API key. Used as a Bearer token to fetch candidate data, post notes, and add tags. | | `incode_x_api_key` | Dashboard > API Keys | The `x-api-key` header value for Incode's authorization endpoint. | | `incode_workforce_integrationid` | Dashboard > Integrations | The unique identifier for your Incode integration. | | `incode_workforce_secret` | Dashboard > Integrations | The secret for your integration, used for server-side token generation. | | `tines_api_key_lever_incode_records` | Tines > Your Profile > API Keys | A Tines API key used by the story to query its own Records table when matching a trace ID to an opportunity. | > ⚠️ **Warning** > > Credential names must match exactly as shown. The story references them using `<>` syntax. A typo will cause silent authentication failures. ### Set Up the Lever Webhook Lever must send a webhook event whenever a candidate's pipeline stage changes. 1. **Copy the Tines webhook URL**:** **After importing the story, open the `lever_webhook` agent and copy the generated webhook URL: ``` https://.tines.com/webhook//871aa415a5da64cdfa3fba63527c374b ``` 2. **Create the webhook in Lever**: In Lever, go to **Settings **>** Integrations** >** Webhooks** and add a new webhook: | Field | Value | | ------------- | ----------------------------------------------- | | URL | Your Tines webhook URL from above | | Events | `candidateStageChange` | | Signing token | Copy this value—you'll need it in the next step | 3. **Update the HMAC signature secret in the story**: Open the `validate_webhook_signature` agent in Tines and replace the placeholder signing token with your Lever webhook signing token: ```json { "calculated_signature_raw": "<>" } ``` > 🚧 **Warning** > > The story ships with a placeholder signing token. Replace it with your Lever signing token or the signature check will reject all incoming webhooks. ### Set Up the Incode Webhook Incode must POST verification status events to a second Tines webhook endpoint. This drives Flow 2. 1. **Copy the verification status webhook URL**: After importing the story, open the `Get_verification_status_updates` agent and copy its webhook URL: ``` https://.tines.com/webhook//59ab814228451619d85618e952e62c34 ``` 2. **Register the webhook in Incode**: In Dashboard, go to **Configuration > Webhooks** and configure a webhook pointing to the URL above. The story expects the following fields in the webhook payload: ```json { "event_type": "verification.succeeded", "data": { "verification_trace_id": "", "failure_reason": "", "ip": "", "user_name": "", "latitude": 0.0, "longitude": 0.0 } } ``` ### Configure Your Lever Stage ID The story triggers only when a candidate advances to a specific Lever pipeline stage. You must update the stage ID to match a stage in your own Lever environment. 1. **Find the stage ID in Lever**: Use the Lever API to list your pipeline stages: ```bash curl -X GET https://api.lever.co/v1/stages \ -H "Authorization: Bearer " ``` Each stage has an `id` field. Copy the ID for your target stage: for example, Background Check or Offer. 2. **Update the **`validate_stage`** agent**: Open the `validate_stage` agent in Tines and replace the stage ID in the trigger rule: ```json { "type": "field==value", "value": "YOUR-STAGE-UUID-HERE", "path": "<>" } ``` > 📘 **Note** > > The story ships with a sample stage ID (`73f73269-c81e-465f-bdf4-25c76929d60a`) that does not match your environment. If you don't update it, the story receives all stage change events but never proceeds past the `validate_stage` trigger. ### Import the Tines Story 1. **Download the story file**: Download `lever-incode-candidate-biometric-identity-verification.json` from your Incode account manager. 2. **Import into Tines**: In your Tines workspace, click **New Story > Import** and upload the JSON file. Tines then creates all agents, connections, and the Tines Records table automatically. 3. **Complete configuration**: Before enabling the story, confirm the following: - All five credentials are created in Tines. - Lever webhook is configured to POST to `lever_webhook`. - Lever HMAC signing token is updated in `validate_webhook_signature`. - Stage ID is updated in `validate_stage`. - Incode webhook is configured to POST to `Get_verification_status_updates`. - Email sender name and reply-to address is updated in the Send Email Action. - Redirect URL in `incode_verification` is updated to your domain. 4. **Enable and test**: Enable the story in Tines. Move a test candidate to your verification stage in Lever and confirm the story fires, the email is sent, and a record appears in the Tines Records table. *** ## Automation Agents Reference The story contains 16 agents across both flows. ### Flow 1: Send Verification | Agent | Type | Description | | --------------------------------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | `lever_webhook` | WebhookAgent | Receives all `candidateStageChange` POST events from Lever. Responds with HTTP 200 immediately. | | `validate_webhook_signature` | EventTransformationAgent | Computes HMAC-SHA256 of token and triggeredAt using your Lever signing secret and compares it to the received signature. | | `check_signature` | TriggerAgent | Gate: passes only events where the computed signature matches the received signature. Rejects forged or replayed webhooks. | | `extract_data` | EventTransformationAgent | Extracts `candidateId`, `opportunityId`, `fromStageId`, `toStageId`, and `stageName` from the webhook payload. | | `validate_stage` | TriggerAgent | Gate: passes only events where `toStageId` equals your configured verification stage ID. | | `get_candidate_details` | HTTPRequestAgent | Calls `GET /v1/candidates/{id}` on the Lever API to retrieve the candidate's profile. | | `extract_candidate_details` | EventTransformationAgent | Parses name, email, and phone from the Lever response. Splits full name into `first_name` and `last_name` for Incode. | | `Delay sending identity verification message` | EventTransformationAgent (delay) | Waits 3 minutes before continuing. Allows stage transitions to settle in Lever before sending the email. | | `get_incode_token` | HTTPRequestAgent | Calls the Incode server-side authorization endpoint to obtain a short-lived session token using your integration credentials. | | `incode_verification` | HTTPRequestAgent | Generates a personalized, time-limited verification link for the candidate. The link is valid for 72 hours. | | `Capture Record` | RecordAgent | Creates a record in the `Lever_Incode_Information` table storing the opportunity ID, candidate ID, and Incode trace ID. | | `Send Email Action` | EmailAgent | Sends an HTML-formatted email to the candidate with the verification link and instructions. | ### Flow 2: Receive Result | Agent | Type | Description | | --------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | `Get_verification_status_updates` | WebhookAgent | Receives POST callbacks from Incode containing verification results. Second entry point of the story. | | `Trigger Action` | TriggerAgent | Gate: passes only events where `event_type == "verification.succeeded"`. | | `Match_record_trace_opportunity` | HTTPRequestAgent | Queries the Tines Records API to find the opportunity ID matching the `verification_trace_id` from the Incode callback. | | `update_lever_tag` | HTTPRequestAgent | Calls `POST /v1/opportunities/{id}/addTags` to add the `biometric-verified` tag to the candidate's Lever opportunity. | | `update_lever_note` | HTTPRequestAgent | Posts a structured note to the Lever opportunity with the event type, status, trace ID, IP, name, and geolocation from the Incode verification result. | *** ## API Reference ### Incode APIs **Get Auth Token** ``` POST https://demo-api-incode-id.incodesmile.com/v1/integration/authorize/server x-api-key: <> ``` Request body: ```json { "integrationId": "<>", "secret": "<>" } ``` Response: ```json { "token": "" } ``` The `token` value is passed as the `x-auth-token` header in all subsequent Incode API calls. **Generate Verification Link** ``` POST https://demo-api-incodesmile.com/v1/workforce/verification/candidate/generate-verification-link x-auth-token: <> ``` Request body: ```json { "integrationID": "<>", "secret": "<>", "loginHint": "candidate@email.com", "loginHintType": "EMAIL", "validityMinutes": 4320, "redirectUrl": "https://your-domain.com", "givenNames": "First", "lastName": "Last" } ``` Key response fields: ```json { "verificationLink": "https://...", "verificationTraceId": "..." } ``` ### Lever APIs **Get Candidate Details** ``` GET https://api.lever.co/v1/candidates/{candidateId} Authorization: Bearer <> ``` Key response fields used: ``` data.name // full name — split into first/last data.emails[0] // primary email address data.phones[0] // primary phone number ``` **Add Tag to Opportunity** ``` POST https://api.lever.co/v1/opportunities/{opportunityId}/addTags Authorization: Bearer <> ``` ```json { "tags": ["biometric-verified"] } ``` **Post Verification Note** ``` POST https://api.lever.co/v1/opportunities/{opportunityId}/notes Authorization: Bearer <> ``` ```json { "secret": false, "value": "Biometric Verification Update\n\nEvent: \n\nVerification Details:\n- Status: ...\n- Trace ID: ...\n- IP: ...\n- Name: ...\n- Location: lat, lon\n\nProcessed: " } ``` *** ## Email Template The Send Email Action agent sends an HTML email to the candidate with a personalized greeting, a verification button, and step-by-step instructions. To customize the template, open the Send Email Action agent in Tines and update the following: | Field | Default | Description | | -------------------------------------- | ----------------------------- | ---------------------------------------------- | | `sender_name` | GoodLeap Talent Team | Your company's talent team name | | `reply_to` | t3\@goodleap.com | Your recruitment team's reply-to email address | | `subject` | Identity Verification Request | Add your company name if needed | | CTA button color | #00AEEF | Your brand's primary color | | Contact email in body | T3\@goodleap.com | Your recruitment team's email address | | `redirectUrl` in `incode_verification` | https\://goodleap.com | Your company website or careers page URL | *** ## Tines Records Schema The story creates and queries a Records table called `Lever_Incode_Information`. This table connects Flow 1 (send verification) and Flow 2 (receive result). | Field | Type | Description | | ------------- | --------- | --------------------------------------------------------------------------------------------------------------------- | | Story name | TEXT | Name of the Tines story that created the record. For debugging. | | Timestamp | TIMESTAMP | Date and time the record was created. | | OpportunityID | TEXT | The Lever opportunity ID. Used when writing back notes and tags in Flow 2. | | CandidateID | TEXT | The Lever candidate ID. Stored for reference and audit. | | TraceID | TEXT | The Incode `verificationTraceId`. Used as the lookup key in Flow 2 to match the callback to the original opportunity. | | Updated at | TIMESTAMP | Auto-populated timestamp for when the record was last modified. | > 📘 **Note** > > The `Match_record_trace_opportunity` agent queries this table using the Tines Records API at `https://.tines.com/api/v1/records`, filtering by TraceID to find the corresponding Lever OpportunityID. Ensure `tines_api_key_lever_incode_records` has permission to read this table. *** ## Troubleshooting ### **Story Fires but No Email Is Sent** Check the following in order: - `check_signature` **trigger not passing**: Verify your HMAC signing token in `validate_webhook_signature` matches the signing token shown in Lever's webhook settings exactly. - `validate_stage`** trigger not passing**: Verify the stage ID in the trigger rule matches the UUID of your target pipeline stage in Lever. - `get_incode_token` **returning non-200**: Check your `incode_x_api_key`, `incode_workforce_integrationid`, and `incode_workforce_secret` credentials in Tines. ### **Lever Note or Tag Not Written After Verification** Confirm the following: - The Incode webhook is correctly configured to POST to the `Get_verification_status_updates` URL. - The `event_type` from Incode is exactly `verification.succeeded`: the Trigger Action performs a strict string match. - A Tines record exists for the `verification_trace_id`. Check the Records table to confirm Flow 1 ran successfully for that candidate. - `tines_api_key_lever_incode_records` is valid and has read access to the `Lever_Incode_Information` records table. ### **Signature Validation Fails for All Events** The HMAC signing token in `validate_webhook_signature` must match your Lever webhook's signing token exactly. 1. Go to **Lever > Settings > Integrations > Webhooks**. 2. Click your webhook. 3. Copy the signing token. 4. Paste the signing token into the `HMAC_SHA256` expression in the Tines agent, replacing any placeholder value. ### **Incode API Returns 401** Your `incode_x_api_key`, `incode_workforce_integrationid`, or `incode_workforce_secret` credentials are incorrect or expired. Verify them in the Incode Dashboard and re-create the Tines credentials. > 📘 **Tip** > > Use Tines' built-in event log for each agent to inspect the exact payload received and response. This is the fastest way to identify where an issue occurs.
          --- - Path: `ecosystem-workforce/microsoft-defender-for-identity` - URL: https://developer.incode.com/ecosystem-workforce/microsoft-defender-for-identity/ - Markdown: https://developer.incode.com/ecosystem-workforce/microsoft-defender-for-identity.md # Microsoft Defender for Identity You can connect Incode identity verification to Microsoft Sentinel so that when Defender for Identity raises a suspicious activity incident, your security team can send the flagged user a biometric verification link. The result is posted back to Sentinel automatically, giving your team the identity confirmation they need to resolve or escalate the incident. This integration works well for Identity Threat Detection and Response (ITDR) workflows where you need to distinguish real security incidents from false positives. False positives can be caused by legitimate employees travelling, working from new devices, or logging in at unusual hours. *** ## Prerequisites Ensure you have the following before you begin: - An active Azure subscription with permissions to create Logic Apps and assign roles within a resource group - A Microsoft Sentinel workspace - Access to the Integrations page in Dashboard. Contact your Incode Representative if you do not see it. - Users as directory records in the Incode integration. This is needed for verification requests to succeed. *** ## Integration Flow The integration runs on two Azure Logic Apps deployed in your Azure environment: 1. The first is a **Sentinel automation playbook**. When Sentinel creates an incident, the playbook calls the Incode API to generate a unique verification link for the flagged user and delivers it to your security team. Your security team then sends it to the user. 2. The second is a **webhook receiver**. When the user completes their biometric check, Incode sends the result to this receiver. The receiver reads the result and updates the Sentinel incident, closing it as a false positive if verification succeeded, or escalating it to high severity if verification failed. Both Logic Apps use a managed identity to authenticate against: - Azure Key Vault for Incode credentials. - Microsoft Sentinel to update incidents. No credentials are hardcoded. *** ## Set Up the Sentinel Integration ### Create an Integration in Dashboard 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. Click **New Integration**. 4. From the Custom tab, click **API**, then click **Continue**. 5. Enter a **Name** for the integration: for example, `Microsoft Defender`. 6. Click **Save**. 7. Open the integration card and note the **Integration ID**. You'll need this in a later step. ### Collect Your Incode Credentials Store the following values in Azure Key Vault. See [Find Integration Details](/dashboard-platform-administration/manage-integrations/) for where to locate each one in Dashboard. - **Client ID**: Your OAuth client identifier. - **Client secret**: Generate a new one if you don't already have one. - **API key**: Obtain from your Incode account team if you don't have one. - **Integration ID**: The value from the previous set of steps. - **Auth server URL**: `https://auth.demo.incode.com` (demo) or `https://auth.incode.com` (production). - **API base URL**: `https://demo-api.incodesmile.com` (demo) or `https://saas-api.incodesmile.com` (production). ### Deploy the Azure Resources Incode provides both Logic Apps as ready-to-deploy ARM templates. Click **Deploy to Azure** in the [Incode GitHub repository](https://github.com/incode) to deploy both Logic Apps and an Azure Key Vault into your Azure subscription. > 📘 Note > > If you don't have access to the ARM templates yet, contact your Incode account team. After deploying, store the following secrets in Key Vault using the exact secret names shown: | Secret name | Value | | ------------------------------ | ----------------------------------------------- | | `incode-client-id` | Your Incode OAuth client ID | | `incode-client-secret` | Your Incode OAuth client secret | | `incode-api-key` | Your Incode API key | | `incode-integration-reference` | Your integration ID from the first set of steps | | `incode-auth-url` | Auth server URL from the previous set of steps | | `incode-api-base-url` | API base URL from the previous set of steps | > 📘 Note > > To store secrets with special characters, use the Azure Cloud Shell Python approach to avoid bash misreading them: > > ```python > python3 -c " > > import subprocess > > [subprocess.run](http://subprocess.run)(['az', 'keyvault', 'secret', 'set', > > '--vault-name', 'YOUR_KEYVAULT_NAME', > > '--name', 'incode-client-secret', > > '--value', 'YOUR_SECRET_VALUE_HERE']) > > " > > ` > ``` After storing all secrets, grant the Logic App managed identity **Get** and **List** permissions on Key Vault secrets. ### Assign the Sentinel Responder Role Grant the managed identity the **Microsoft Sentinel Responder** role from Azure Cloud Shell: ```bash az role assignment create \ --assignee YOUR_MANAGED_IDENTITY_PRINCIPAL_ID \ --role "Microsoft Sentinel Responder" \ --scope /subscriptions/YOUR_SUBSCRIPTION_ID/resourceGroups/YOUR_RESOURCE_GROUP ``` > 📘 Note > > Role assignments can take up to 10 minutes to propagate. Wait before testing. ### Configure Webhooks in Dashboard The webhook receiver Logic App needs to receive session results from Incode when a user completes verification. 1. In Dashboard, click **Configuration** in the left menu. 2. Click the **Webhooks** tab. 3. Find the Flow or Workflow associated with your integration. 4. Add the webhook receiver Logic App URL as the endpoint for the `SESSION_SUCCEEDED` and `SESSION_FAILED` events. To find the receiver Logic App URL, open the Logic App in the Azure portal, go to **Overview**, and copy the **Workflow URL**. > 📘 Note > > Incode requires a webhook authentication secret to be configured before session webhooks are delivered. Contact your Incode Representative to confirm the required format for your environment. ### Connect Sentinel to the Playbook 1. In Microsoft Sentinel, create a new automation rule. 2. Set the trigger to **When an Incident is Created**. 3. Configure conditions to match the incidents you want to trigger verification for: for example, by severity or incident type. 4. Set the action to **Run Playbook** and select the playbook Logic App. 5. Click **Save**. *** ## Test the Integration Test the end-to-end flow from Azure Cloud Shell: ```bash curl -s -X POST \ "YOUR_PLAYBOOK_TRIGGER_URL" \ -H "Content-Type: application/json" \ -d '{"incidentId":"TEST-001","severity":"Medium","userEmail":"user@yourdomain.com"}' \ | python3 -m json.tool ``` A successful response includes a `verificationUrl` field and a `status` of `verification_initiated`. Open the URL to complete a test biometric check, then confirm the Sentinel incident was updated as expected. *** ## Technical Notes - **The **`api-version: 1.0`** header is required.** Every call to the Incode B2B onboarding endpoint (`POST /omni/b2b/onboarding/request-new`) must include the header `api-version: 1.0`. Without it, the API returns HTTP 406 with no explanation. - `externalCustomerId`** is required for incident correlation.** Pass the Sentinel incident ID as `externalCustomerId` in every B2B onboarding request. Incode echoes this value back in the session webhook payload. Without it, the webhook receiver cannot identify which incident to update. - **Users must exist in the Incode directory before verification.** If the `loginHint` (user email) does not match any record in the integration directory, the API returns error `5504: Employee by login factor cannot be found`. Add the user to the integration directory in Dashboard before retrying. *** ## Troubleshooting ### **Playbook Fails at OAuth Token Step with HTTP 401** The client ID or client secret in Key Vault is wrong or has been rotated. Confirm credentials manually from Cloud Shell: ```bash curl -s -X POST "{auth_url}/oauth2/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials&scope=openid&client_id={client_id}&client_secret={client_secret}" ``` ### **Playbook Fails at B2B Onboarding Step with HTTP 406** The `api-version: 1.0` header is missing from the HTTP action in the Logic App. ### **Playbook Fails with Error 5504** The user email passed as `loginHint` does not exist in the Incode integration directory. Add the user in Dashboard and retry. ### **Webhook Receiver Never Fires After Verification Completes** There are three possible causes: - Session webhooks are not configured in Dashboard for the correct Flow or Workflow. - The webhook auth secret is missing or incorrectly configured. - The webhook is configured at the wrong level (session webhooks are scoped to individual Flows or Workflows, not globally). ### **Webhook Receiver Fires but Sentinel Update Fails with HTTP 403** The managed identity does not have the Microsoft Sentinel Responder role, or the role assignment has not yet propagated. Wait up to 10 minutes and retry. ### **Sentinel Incident is Not Updated After Verification Completes** The `externalCustomerId` in the webhook payload does not match a valid Sentinel incident ID. Confirm that the incident ID is being correctly passed in the original B2B onboarding request. *** ## Supported Environments | Environment | Auth server URL | API base URL | | ----------- | ------------------------------ | ---------------------------------- | | Demo | `https://auth.demo.incode.com` | `https://demo-api.incodesmile.com` | | Production | `https://auth.incode.com` | `https://saas-api.incodesmile.com` |
          --- - Path: `ecosystem-workforce/microsoft-entra-directory` - URL: https://developer.incode.com/ecosystem-workforce/microsoft-entra-directory/ - Markdown: https://developer.incode.com/ecosystem-workforce/microsoft-entra-directory.md # Microsoft Entra Directory The Microsoft Entra directory integration syncs your Entra user directory with Incode, enabling employee lookups and claims matching during identity verification sessions. This integration is required for any flow that requires verifying a user against their Entra directory record, including Self-Serve Portal password and MFA resets, ITSM verifications, and claims matching in Entra IAM flows. This is a directory-only integration. It does not trigger verification sessions. Use [Microsoft Entra External Authentication Method (EAM)](/ecosystem-workforce/microsoft-entra-eam/) integration for authentication-layer integration with Microsoft Entra. > 📘 **Note** > > If your Microsoft Entra environment uses federated access through Okta as the identity provider, follow the
          [Okta Directory](/ecosystem-workforce/okta-directory/) guide instead. *** ## Prerequisites Ensure you have the following before you begin: - Access to the Integrations page in Dashboard. Contact your Incode Representative if you do not see it. - A Microsoft Entra account with the following roles: - **User Administrator**, **Groups Administrator**, **Application Administrator**, and **App Developer** for App
          Registration, group, and user setup - **Global Administrator** to grant the required app permissions *** ## Synced Data Incode reads user profile data from Microsoft Entra to perform claims matching. Depending on your claims matching policy, some of the following fields may be required for verification to succeed. Ensure these attributes are populated for all users in the groups you intend to sync: | Attribute | Used for | | ------------------------------------------------- | ------------------------------------------- | | First name (given name) | Name claim matching | | Last name (surname) | Name claim matching | | User principal name (UPN) | Primary user lookup (`loginHint`) | | Email | Notification delivery, email claim matching | | Mobile phone | Phone claim matching | | Date of birth | Date of birth claim matching | | Street address, city, state, postal code, country | Address claim matching | > 📘 **Note** > > Missing attributes will cause claims matching failures for affected users. Ensure the relevant fields are populated in Entra before triggering a directory sync. *** ## Set Up Entra Directory Integration ### Configure the Integration in Dashboard 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. Click **New Integration**. 4. From the **Directory** tab, select **Microsoft Entra Directory**, then click **Continue**. 5. Enter a **Directory Name**. 6. Enter the **User Group ID** (Object ID) of the Entra group containing the employees you want to sync. To find this, go to your Microsoft Entra portal > **Groups** > **All groups**, and copy the Object ID for the relevant group. 7. Select the permission level for the integration: - **Read-only**: Allows directory sync only - **Read and write**: Allows directory sync and Self-Serve password and MFA resets 8. Click **Save**. ### Grant Directory Permissions in Microsoft Entra After saving, Dashboard redirects you to the Microsoft Entra admin consent page to approve the required permissions. A **Global Administrator** must complete this step. > 📘 **Note** > > If permissions are rejected, or the approving user does not have sufficient permissions, the integration will remain in an incomplete state and you must restart setup. ### Sync the Directory After permissions are granted, trigger an initial sync to import your users into Incode. 1. In the left menu, click **Integrations**. 2. From the **Directory** tab, locate the integration you just created. 3. On the integration card, click **Sync Directory**. Depending on the size of your directory, the initial sync may take several minutes. *** ## View Synced Users Click **Directory Information** in the left menu to view all synced users and their enrollment status. Users shown as **not enrolled** have been synced from Entra but have not yet completed an Incode verification session. To initiate verification for these users, trigger a session through your configured IAM or ITSM integration. --- - Path: `ecosystem-workforce/microsoft-entra-eam` - URL: https://developer.incode.com/ecosystem-workforce/microsoft-entra-eam/ - Markdown: https://developer.incode.com/ecosystem-workforce/microsoft-entra-eam.md # Microsoft Entra EAM An External Authentication Method (EAM) lets users satisfy Microsoft Entra ID's MFA requirements through an external provider. This page covers configuring Incode as an EAM in your Entra environment and describes the use cases this enables. *** ## Prerequisites Ensure you have the following before you begin: - Access to the Integrations page in Dashboard. Contact your Incode Representative if you do not see it. - A [Workflow](/dashboard-platform-administration/workflows-20/) created for the integration. - An active **Microsoft Entra ID P1 or P2** subscription. - A Microsoft Entra administrator account with appropriate privileges. *** ## Understand What This Enables After Incode is registered as an EAM, it can be used in the following scenarios: - **SSPR & MFA recovery**: Redirect users who forgot a password or who cannot satisfy MFA to Incode for biometric and document verification before completing the reset. - **External authentication**: Add Incode as a high-assurance check before granting access to apps or workflows through Entra Conditional Access. - **New-hire onboarding**: Verify legal identity before activating Entra credentials for new employees. *** ## Understand How It Works When a user is required to authenticate with Incode, Entra redirects them to an Incode verification session. The session requirements are determined by the Workflow linked to the integration. After the session completes, Incode returns a result to Entra to confirm the user's identity. For use cases that include claims matching, Incode reads the user's profile from the Entra directory and matches verified attributes from their government-issued ID against that record. A successful match is required before the Entra action is allowed to proceed. If claims do not match, the session is routed to manual review. The [Microsoft Entra Directory Sync](/ecosystem-workforce/microsoft-entra-directory/) page describes directory sync configuration, including which Entra user attributes Incode uses. *** ## Set Up Entra EAM Integration ### Create the Integration in Dashboard 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. Click **New Integration**. 4. From the IAM tab, click **Microsoft Entra EAM**, then click **Continue**. 5. Enter a **Name** for this integration. 6. **Select a Workflow for this Integration **from the drop-down. 7. Copy the following values from the integration to use in the next set of steps: - **Client ID** - **Discovery Endpoint** - **Authorize URL** 8. Click **Save**. ### Register an Application in Microsoft Entra 1. Log in to your Microsoft Entra Admin Center as an administrator. 2. Go to **App Registrations** > **New Registration**. 3. Configure the registration: - **Name:** Enter a name for the application. - **Supported account types:** Select **Single tenant**. - **Redirect URI:** Select the **Web** platform and paste the **Authorize URL** from the previous set of steps. 4. Click **Register** and copy the generated **App ID**. ### Add Incode as an External Authentication Method 1. Go to **Protection** > **Authentication Methods** > **Policies**. 2. Click **+ Add External Method (Preview)**. 3. Configure the external method: - **Name:** Enter a display name—for example, **Incode**. This is the name users see when selecting an authentication method at login. - Paste the **Client ID**, **Discovery Endpoint**, and **Authorize URL** from the previous sets of steps into the respective fields. 4. Click **Request permission** to grant admin consent for the Incode authenticator. Check **Consent on behalf of your organization** and click **Accept**. 5. Toggle **Enable** to **On**. 6. Click **+ Add Target** to select the users or groups that should use Incode as an EAM. By default, the policy applies to all users. 7. Click **Save**. *** ## Test the Integration 1. Sign in to a Microsoft application with an account in your configured target group. 2. After entering your password, confirm you are prompted to verify your identity with Incode. 3. Complete the verification session and confirm that sign-in proceeds successfully. > ⚠️ Warning > > Entra EAM through Conditional Access policies currently allows users to select **Sign in another way** and authenticate with a different enrolled factor, bypassing Incode. See [Authentication Strengths & Conditional Access with Incode EAM](/ecosystem-workforce/authentication-strengths-conditional-access-with-entra-eam/) for guidance on restricting this.
          --- - Path: `ecosystem-workforce/oem-msp-partner-itegrations` - URL: https://developer.incode.com/ecosystem-workforce/oem-msp-partner-itegrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/oem-msp-partner-itegrations.md # Data Enrichment Incode's OEM and MSP partner integrations combine Incode's biometric and document verification with third-party identity data signals to produce a more complete and reliable identity decision. While Incode confirms that a person is physically present and matches their government-issued ID, OEM and MSP partners contribute additional signals—such as credit bureau records, fraud watchlists, device intelligence, and
          phone and email risk scores—that validate whether the identity itself is genuine and not synthetic or stolen. Together, these two layers give financial institutions, fintechs, and other regulated businesses a higher-confidence identity decision that satisfies both the biometric and data-based components of KYC and CIP requirements. Access to these integrations is available through Incode's OEM and MSP partner program. Contact your Incode Representative for access and configuration details. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Available OEM and MSP Partner Integrations | Integration | Description | Availability | | :--------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------- | | [Alloy](/ecosystem-workforce/alloy/) | Positions Incode as the document and biometric verification node inside an Alloy decision graph. | Available | | [Experian](/ecosystem-workforce/experian/) | Positions Incode as the biometric document capture and liveness detection layer within a CrossCore workflow. | Available | | [Equifax](/ecosystem-workforce/equifax/) | Positions Incode as the biometric and document verification front end, with Equifax supplying back-end data verification covering SSN validation, address history, fraud alerts, and synthetic identity signals. | Available | | [TransUnion](/ecosystem-workforce/transunion/) | Pairs Incode biometric and document verification with TransUnion data-based identity signals to produce a composite identity verification score. | Available | --- - Path: `ecosystem-workforce/okta-authenticator-classic` - URL: https://developer.incode.com/ecosystem-workforce/okta-authenticator-classic/ - Markdown: https://developer.incode.com/ecosystem-workforce/okta-authenticator-classic.md # Okta Authenticator (Classic) This page covers setting up Incode as an OIDC-based authenticator in an Okta Classic environment. If your organization uses Okta Identity Engine (OIE), follow the [Okta Authenticator (Preview/OIE)](/ecosystem-workforce/okta-authenticator-previewoie/) steps instead. *** ## Prerequisites Ensure you have the following before you begin: - Access to the Integrations page in Dashboard. Contact your Incode representative if you do not see it. - [Okta IDP integration](/ecosystem-workforce/okta-idp/) prerequisites complete. - An Okta Classic instance. - An Okta administrator account with permissions to manage Identity Providers and Policies. *** ## Set Up Okta IDP Integration for Classic ### Create an OIDC Identity Provider in Okta 1. Log in to your Okta Admin Console. 2. Go to **Security** > **Identity Providers** > **Add Identity Provider**. 3. Select **OpenID Connect**. 4. Enter a name for the IDP and set the mode to **Factor Only**. 5. Ensure the following scopes are included: `email`, `openid`, and `profile`. **Do not save yet.** You will need values from Dashboard in the next set of steps to complete this configuration. ### Create the Integration in Dashboard > 📘 **Tip** > > This requires copying values between Dashboard and your Okta Admin Console. Keep both tabs open. 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. Click **New Integration**. 4. From the **IAM** tab, select **Okta IDP**, then click **Continue**. 5. Enter a **Name** for this integration. This name appears in analytics and identifies verifications completed through this integration. 6. **Select a Workflow** for this integration from the drop-down. 7. Copy the following values from Dashboard into the corresponding fields in your Okta OIDC IDP configuration: | Dashboard field | Okta field | | --------------- | ---------------------- | | Client ID | Client ID | | Client Secret | Client Secret | | Issuer URL | Issuer | | Authorize URL | Authorization endpoint | | Token URL | Token endpoint | | JWKS URL | JWKS endpoint | | Userinfo URL | Userinfo endpoint | 8. In Okta, set the **Authentication type** to **Client secret**. 9. Click **Save **in Okta. 10. Copy the **Redirect URI** generated by Okta after saving. 11. In Dashboard, paste the **Redirect URI** into the **Redirect URLs** field in the integration configuration. 12. Click **Save**. ### Configure Policies in Okta Classic Okta Classic uses a different policy structure than OIE. Rather than separate enrollment and authentication policies, Classic uses per-application sign-on policies to enforce MFA requirements. 1. In the Okta Admin Console, go to **Applications** and open the application you want to protect with Incode verification. 2. Open the **Sign On** tab. 3. Under **Sign On Policy**, click **Add Rule**. 4. Configure the rule: - Set the conditions to match the user group you want to require Incode verification for. - Under **Access**, set **Multifactor Authentication** to **Required**. - Ensure the Incode IDP factor is listed as an allowed factor. 5. Click **Save**. 6. Repeat for any additional applications you want to protect. > 📘 **Note** > > In Okta Classic, sign-on policies are configured per application, not globally. You must add an Incode rule to each application you want to protect. If you manage many applications, consider using Okta Identity Engine (OIE) for centralized policy management. *** ## Test the Integration Sign in to one of the configured applications using a test user account in the enrolled group. The login flow should prompt for password followed by the Incode biometric verification step. Confirm the following before rolling out to all users: - The Incode authenticator appears as an MFA option after password entry. - The user is redirected to an Incode verification session and can complete
          it on their mobile device. - After successful verification, the user is granted access to the
          application. - Failed verification blocks access and does not allow the user to proceed. > ⚠️ **Warning** > > If the Incode factor does not appear, verify that the sign-on policy rule is applied to the correct user group
          and that the Incode IDP is listed as an allowed factor in the rule. Changes to Okta Classic policies take effect immediately but may require a fresh browser session to reflect for active users. *** ## What's Next - [Okta Authenticator (Preview/OIE)](/ecosystem-workforce/okta-authenticator-previewoie/) - Configure Incode as an SSO provider - [Okta Directory Sync](/ecosystem-workforce/okta-directory/)
          --- - Path: `ecosystem-workforce/okta-authenticator-previewoie` - URL: https://developer.incode.com/ecosystem-workforce/okta-authenticator-previewoie/ - Markdown: https://developer.incode.com/ecosystem-workforce/okta-authenticator-previewoie.md # Okta Authenticator (Preview/OIE) This page describes how to set up Incode as an OIDC-based Authenticator within an Okta Identity Engine (OIE) environment. The result is an Incode biometric factor that can be required in Okta Enrollment and Authentication Policies, functioning as MFA for any applications you choose to protect. If your organization uses Okta Classic, use the separate steps for [Okta Authenticator (Classic)](/ecosystem-workforce/okta-authenticator-classic/) instead. *** ## Prerequisites Ensure you have the following before you begin: - Access to the Integrations page in Dashboard. Contact your Incode Representative if you do not see it. - [Okta IDP Integration](/ecosystem-workforce/okta-idp/) prerequisites complete. - An Okta Identity Engine (OIE) instance. - An Okta administrator account with permissions to manage Identity Providers, Authenticators, and Authentication Policies. - Access to the **Incode Omni Dashboard** with the **Integrations Ecosystem** feature enabled. *** ## Set Up Okta IDP Integration for Preview/OIE ### Create an OIDC Identity Provider in Okta 1. Log in to your Okta Admin Console. 2. Go to **Security** > **Identity Providers** > **Add Identity Provider**. 3. Select **OpenID Connect IDP**. 4. Add a name for the IDP and set the mode to **Factor Only**. 5. Ensure the following scopes are included: `email`, `openid`, and `profile`. ### Create the Integration in Dashboard 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. Click **New Integration**. 4. From the IAM tab, click **Okta IDP**, then click **Continue**. 5. Enter a **Name** for this integration. This name appears in analytics and identifies verifications completed through this integration. 6. **Select a Workflow for this Integration **from the drop-down. 7. Copy the following values to the corresponding fields in your Okta OIDC IDP configuration: - Client ID - Client Secret - Issuer URL - Authorize URL - Token URL - JWKS URL - Userinfo URL 8. In another tab or window, open Okta. Set the **Authentication type** to **Client secret**. 9. Click **Save **in Okta. 10. Copy the **Redirect URI** generated by Okta after saving. 11. Back in Dashboard, paste the **Redirect URI** from Okta into the **Redirect URLS** field in the integration configuration. 12. Review your settings and click **Save**. ### Create an Okta Authenticator 1. In the Okta Admin Console, go to **Security** > **Authenticators** > **Add Authenticator**. 2. Select **IDP Authenticator** from the list of available authenticator types. 3. Select the Incode IDP you created in the first set of steps. 4. Set the authenticator name to **Incode** and upload the [Incode logo](https://incode-assets.s3.amazonaws.com/incode-logo.svg). 5. Click **Save**. The authenticator is now available for use in enrollment and authentication policies. > 📘 Note > > Okta automatically adds new IDP authenticators as optional to the default policy. If this is not desired for your organization, disable this in the default policy after saving. ### Create an Enrollment Policy Enrollment policies control which users are required to enroll with the Incode authenticator. Okta checks enrollment policy compliance at account creation and every login. 1. In the **Authenticators** menu, go to the **Enrollment** tab and select **Add a Policy**. 2. Enter a name and description. 3. Assign the Okta user group you want to require Incode verification for. 4. Set both **Password** and **Incode** as **Required**, along with any other MFA methods your organization uses. 5. Click **Save**. ### Create an Authentication Policy Authentication policies determine when the Incode authenticator is required during login. 1. Go to **Security** > **Authentication Policies** > **Add a Policy**. 2. Enter a name and description. 3. Add a rule and configure it: - Assign the user group you created for Incode verification. - Set the authentication requirement to **Password / IDP + Another Factor**. - Select **Allow specific authentication methods** and add **Incode** and **Password**. 4. Click **Save**. 5. Go to **Applications** and assign the applications this policy should apply to. *** ## Test the Integration Incode recommends testing the login process for the selected applications to confirm the authentication policy works as expected before rolling it out to all users. --- - Path: `ecosystem-workforce/okta-directory` - URL: https://developer.incode.com/ecosystem-workforce/okta-directory/ - Markdown: https://developer.incode.com/ecosystem-workforce/okta-directory.md # Okta Directory The Okta directory integration syncs your Okta user directory with Incode, enabling employee lookups and claims matching during identity verification sessions. This integration is required for any flow that requires verifying a user against their Okta directory record, including ITSM verifications, Self-Serve Portal resets, and claims matching in IAM flows. This is a directory-only integration. It does not trigger verification sessions. Use [Okta IDV Standard](/ecosystem-workforce/okta-idv-standard/)​ integration for authentication-layer integration with Okta. *** ## Prerequisites Ensure you have the following before you begin: - Access to the Integrations page in Dashboard. Contact your Incode Representative if you do not see it. - An Okta administrator account with permissions to create and manage integrations. *** ## Synced Data When the Okta directory integration is active, Incode syncs user and group data from your Okta instance. Synced attributes are used to look up users by `loginHint` and to supply claims for matching against verified identity data. The following Okta user profile attributes are used by Incode, depending on your claims matching policy configuration: | Attribute | Used for | | --------------------- | --------------------------------- | | Email/login | Primary user lookup (`loginHint`) | | First name, last name | Name claim matching | | Date of birth | Date of birth claim matching | | Address fields | Address claim matching | | Phone number | Phone claim matching | | Group membership | Policy routing and scoping | Make sure the relevant attributes are populated for all users in the groups you intend to sync. Missing attributes will cause claims matching failures for those users. *** ## Set Up Okta Directory Integration ### Create the Integration in Dashboard 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. Click **New Integration**. 4. From the Directory tab, click **Okta Directory**, then click **Continue**. 5. Enter a **Directory Name**. 6. Enter your Okta Instance **URL** in this format: `https://your.company.name.okta.com`. ### Important If you leave a trailing / at the end of this URL, the directory sync will silently fail. Ensure your URL format matches exactly what is above. 7. Enter a **Client ID** for the Okta service application. 8. You can enter a **User Group ID** to assign to Workforce. 9. Click **Save**. ### Authorize Directory Access in Okta After saving the integration, Incode initiates an authorization flow to request read access to your Okta directory. Follow the prompts in your Okta Admin Console to approve the required permissions. ### Note You must have Okta administrator permissions to approve directory access. If you lack sufficient permissions, the integration remains in an incomplete state and you must restart setup. ### Sync the Directory After authorizing access, trigger a directory sync to import your users into Incode. 1. In the left menu, click **Integrations**. 2. In the Directory tab, locate the directory you want to sync. 3. On the integration card, click **Sync directory**. Depending on the size of your directory, the initial sync may take some time. *** ## View Synced Users You can see synced users and their enrollment status by clicking **Directory Information** in the left menu.
          --- - Path: `ecosystem-workforce/okta-idp` - URL: https://developer.incode.com/ecosystem-workforce/okta-idp/ - Markdown: https://developer.incode.com/ecosystem-workforce/okta-idp.md # Okta IDP The Okta IDP integration configures Incode as the authenticator and Identity Provider (IdP) for your Okta organization. This is distinct from the [Okta IDV Standard](/ecosystem-workforce/okta-idv-standard/) integration, which uses Okta's built-in IDV Standard. The IDP path gives you broader control over how Incode is wired into Okta: as an OIDC-based authenticator, as a full SSO provider, or both. This integration is commonly used when you want Incode biometric verification to function as an MFA factor within Okta authentication and enrollment policies, rather than as a separate identity verification step triggered by Okta's IDV Standard. *** ## Prerequisites Ensure you have the following before you begin: - Access to the Integrations page in Dashboard. Contact your Incode Representative if you do not see it. - An Okta Identity Engine (OIE) instance. - An Okta administrator account with permissions to add and modify Identity Providers, Authenticators, and Authentication Policies. *** ## Understand Okta IDP The IDP integration uses an OIDC Identity Provider configured in Okta, backed by Incode. When a user is required to authenticate with the Incode factor, Okta redirects them to an Incode verification session through the OIDC flow. After the session completes, Incode returns a signed token to Okta to confirm the result. After the OIDC IDP is set up, you create an Okta Authenticator that wraps it, then reference that authenticator in your Enrollment and Authentication Policies to control when and for which users Incode verification is required. *** ## Okta Environment Compatibility Okta offers two environments with slightly different configuration paths. Use the page for your environment: - [Okta Authenticator (Preview/OIE)](/ecosystem-workforce/okta-authenticator-previewoie/) - [Okta Authenticator (Classic)](/ecosystem-workforce/okta-authenticator-classic/) If you are unsure which environment your organization uses, check your Okta Admin Console. OIE instances show “Identity Engine” in the footer. *** ## What's Next After completing authenticator setup, you can also: - [**Configure Incode as an SSO Provider**](/ecosystem-workforce/configure-incode-as-sso-provider-with-okta-idp/): Set up Incode to act as the SSO provider for Okta-connected applications, enabling biometric login across your app portfolio. - [**Sync your Okta Directory**](/ecosystem-workforce/okta-directory/): Sync your Okta user directory with Incode to enable employee lookups and claims matching.
          --- - Path: `ecosystem-workforce/okta-idv-standard` - URL: https://developer.incode.com/ecosystem-workforce/okta-idv-standard/ - Markdown: https://developer.incode.com/ecosystem-workforce/okta-idv-standard.md # Okta IDV Standard The Okta IDV Standard integration adds Incode biometric identity verification as a native step within Okta authentication policies. Using the Okta Identity Verification Standard, Incode is registered as a third-party identity verification provider directly in Okta, no custom redirects or middleware required. After you configure the integration, Okta can invoke an Incode verification session at any point in an authentication policy: during account recovery, MFA reset, step-up authentication, or high-assurance sign-in flows. The verified result is returned to Okta and used to allow or block the user from completing the flow. This integration is listed on the [Okta Integration Network (OIN)](https://www.okta.com/integrations/). > 📘 **Okta IDV Standard vs. Okta IDP** > > The Okta IDV Standard integration uses Okta's native Identity Verification Standard protocol to invoke Incode from within an Okta authentication policy. The [Okta IDP integration](/ecosystem-workforce/okta-idp/) configures Incode as a full identity provider and authenticator for your Okta organization. Both can be used independently or together depending
          on your use case. *** ## Prerequisites Ensure you have the following before you begin: - Access to the Integrations page in Dashboard. Contact your Incode representative if you do not see it. - A [Workflow](/dashboard-platform-administration/workflows-20/) created for this integration. - An Okta Identity Engine (OIE) instance. - An Okta administrator account with permissions to add and modify Identity Providers and Authentication Policies. - The **Identity verification with third-party identity verification vendors** Early Access feature enabled on your Okta instance. > 📘 **Tip** > > To enable this feature, go to your Okta Admin Console > **Settings** > **Features** and search for "Identity verification with third-party identity verification vendors". Enable it. If the feature is not visible, contact Okta support to request access. *** ## What This Integration Enables After it's configured, you can use the Okta IDV Standard integration to add Incode verification to the following flows: - **Account resets and recovery**: Verify a user's identity before allowing a password reset or account unlock. See [Account resets & recovery](/ecosystem-workforce/account-resets-recovery-with-okta-idv/). - **Passwordless sign-in**: Gate high-assurance sign-in steps with biometric verification. See [Passwordless sign-in](/ecosystem-workforce/passwordless-sign-in-with-okta-idv-standard/). - **Custom claims matching**: Configure which identity attributes are matched against your Okta directory during verification. See [Configure claims matching](/ecosystem-workforce/configure-claims-matching-with-okta-idv-standard/). *** ## Set Up Okta IDV Standard Integration ### Create the Integration in Dashboard 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. Click **New Integration**. 4. From the **IAM** tab, select **Okta IDV Standard**, then click **Continue**. 5. Enter a **Name** for this integration. 6. **Select a Workflow** from the drop-down for this integration. 7. Enter your **Okta instance URL** in this format: `https://yourcompanyname.okta.com`. 8. Copy the generated **Client ID** and **Client Secret**. These are required for the next steps. 9. Click **Save**. > 📘 **Note** > > The Client Secret is shown only once. Store it securely before navigating away from this screen. ![](https://developer.incode.com/assets/95aab07307b5e344a2e5f6af39d40f19.png)
          ### Configure Incode IDV in Okta 1. Log in to your Okta Admin Console. 2. Navigate to **Security** > **Identity Providers**. 3. Click **Add Identity Provider** and select **Incode IDV**. 4. Enter a name for your integration. ![](https://developer.incode.com/assets/ef06c5c24002b150e0ee936f9a7ee8b1.png) 5. Paste the **Client ID** and **Client Secret** copied from the previous steps. 6. Click **Finish**. ![](https://developer.incode.com/assets/b84b0ca1d60dd4cf676923bbb84c5060.png) *** [Watch the demo →](https://youtu.be/tpWFCe7ucpw?si=uxXn1xoW31iSIMRy) --- - Path: `ecosystem-workforce/passwordless-sign-in-with-okta-idv-standard` - URL: https://developer.incode.com/ecosystem-workforce/passwordless-sign-in-with-okta-idv-standard/ - Markdown: https://developer.incode.com/ecosystem-workforce/passwordless-sign-in-with-okta-idv-standard.md # Passwordless Sign-In with Okta IDV Standard You can configure a passwordless sign-in experience using Incode IDV and Okta Fastpass. In this flow, users authenticate with Okta Verify with Fastpass instead of a password. Incode IDV is used during the initial enrollment step to verify the user's identity before Fastpass is provisioned to their device. *** ## Prerequisites Ensure you have the following before you begin: - [Okta IDV Standard](/ecosystem-workforce/okta-idv-standard/) setup page complete - Okta Verify installed on users' devices - Okta Device Trust configured for your organization - Familiarity with Okta Fastpass and Okta passwordless sign-in configuration *** ## Understand Passwordless Sign-In with IDV This flow uses Incode IDV as a one-time identity proofing step during Fastpass enrollment. It does not invoke Incode on every sign-in, only during the initial setup of Okta Verify on a user's device. The enrollment sequence works as follows: 1. The user's password is removed from their Okta profile and their authenticators are reset. 2. The user opens the Okta Verify app and begins enrollment using your organization's domain. 3. Okta's enrollment policy requires identity verification. Incode IDV is invoked and the user completes a document and biometric check on their device. 4. On successful verification, Okta provisions Fastpass to the device. 5. From that point forward, the user signs in using Okta Verify with Fastpass, no password required. *** ## Set Up Passwordless Sign-In ### Configure Authenticators 1. Log in to your Okta Admin Console. 2. Go to **Security** > **Authenticators**. 3. Edit **Email** and enable it for both **Authentication and Recovery**. ### Set Up an Enrollment Policy 1. Under **Authenticators**, select **Enrollment**. 2. Edit an existing enrollment policy or add a new one tied to the group of users you want to enroll in passwordless sign-in: for example, a group named **Incode Identity Verification**. 3. Set **Email** and **Okta Verify** as required authenticators in the policy. > 📘 **Tip** > > Okta recommends keeping admin users in a separate group with password access maintained to avoid locking out administrators. ### Create a Passwordless Authentication Policy 1. Go to **Security** > **Authentication Policies**. 2. Create a new policy: for example, **Passwordless Policy**. 3. Set the **Catch-all Rule** to **Deny**. 4. Add a new rule with the following configuration: - **Rule name**: For example, _Incode Passwordless_ - **IF—User's group membership includes**: Your passwordless users group - **THEN—User must authenticate with**: Possession factor - In the **Allowed Authenticators** list, ensure only **Okta Verify—Fastpass** is shown. Use **Allow specific authentication methods** if additional control is needed. 5. Assign the **Okta Dashboard** app to this policy. ### Update the Global Session Policy 1. Go to **Security** > **Global Session Policy**. 2. Edit your Global Session Policy rule. 3. Set **Establish the user session with** to **Any factor used to meet the Authentication Policy requirements**. 4. Save the rule. ### Enroll and Test 1. Reset a test user's authenticators and remove their password from the user's Okta profile. 2. Have the test user sign in to the Okta Verify app directly using your organization's domain. 3. Confirm the user is prompted to verify their identity via Incode IDV before Fastpass is provisioned to their device. 4. After successful verification, confirm the user can sign in using Okta Fastpass without a password. > ⚠️ **Warning** > > If the user is not prompted for Incode IDV during enrollment, confirm that the enrollment policy is applied to the correct group and that Okta Verify is set as a required authenticator. If the user is prompted for a
          password, verify that the catch-all rule in the passwordless authentication policy is set to **Deny** and that the policy is assigned to the Okta Dashboard app. *** ## What's Next - [Configure claims matching](/ecosystem-workforce/configure-claims-matching-with-okta-idv-standard/) - Account resets & recovery
          --- - Path: `ecosystem-workforce/ping-davinci` - URL: https://developer.incode.com/ecosystem-workforce/ping-davinci/ - Markdown: https://developer.incode.com/ecosystem-workforce/ping-davinci.md # Ping DaVinci You can integrate Incode identity verification (IDV) into your PingOne DaVinci flows using the Incode DaVinci Connector. The connector connects verified real-world identities to Ping Identity user profiles through OpenID Connect (OIDC), enabling identity verification and face authentication as drag-and-drop nodes in DaVinci orchestration flows. The Incode DaVinci connector is published in the [Ping Identity Marketplace](https://marketplace.pingone.com/item/incode-davinci-connector) and supports both customer identity (CIAM) and workforce identity (IAM) use cases. *** ## Prerequisites Ensure you have the following before you begin: - A PingOne DaVinci environment with permission to add connectors. - Access to the Integrations page in Dashboard. Contact your Incode Representative if you do not see it. - An Incode Standard Workflow configured for your verification use case. *** ## Integration Flow 1. A user reaches the Incode Connector node in your DaVinci flow. 2. DaVinci redirects the user to Incode using OIDC. 3. The user completes identity verification on their device: ID document capture, liveness detection, and face match. 4. Incode redirects the user back to DaVinci with an authorization code and ID token containing verification claims. 5. After Incode has verified a user's real-world identity, face authentication can be enabled to confirm their identity in subsequent flows. *** ## Supported Use Cases - **User registration**: Verify real-world identity as part of new user registration and create the Ping Identity user profile with verified claims. - **Account recovery**: Verify identity before granting account access during recovery flows. - **Password resets**: Gate password resets behind biometric verification. - **Conditional step-up**: Trigger identity verification as an additional authentication factor when risk signals are detected. *** ## Set Up the DaVinci Integration ### Create the OIDC integration in Dashboard 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. Click **New Integration**. 4. From the **Custom** tab, select **OIDC**, then click **Continue**. 5. Enter a **Name** for this integration: for example, `Ping DaVinci`. 6. Configure the **Redirect URI**: this must match the Redirect URI in your Ping DaVinci connector configuration. 7. **Select a Workflow** for this integration from the drop-down. 8. Click **Save**. A client ID and client secret are generated. > 📘 **Note** > > The client secret is shown only once. Store it securely before navigating away from this screen. ### Add the Incode Connector in DaVinci In DaVinci, add an Incode connection. For help, see the Ping documentation on [Adding a connection](https://docs.pingidentity.com/davinci/connectors/davinci_connections.html). Configure the connector with the following values: | Field | Value | | ------------- | ---------------------------------------------------------------------------------------------------------- | | App ID | The client ID from the Incode OIDC client configuration | | Client Secret | The client secret from the Incode OIDC client configuration | | Issuer URL | The Issuer URL for Incode's authorization server, provided by Incode | | Scope | List of space-separated scopes—must match exactly those configured in the Incode OIDC client configuration | ### Add the Connector Node to Your Flow Place the Incode Connector node at the point in your DaVinci flow where identity verification should occur. This is typically during new user registration, so the Ping Identity user profile is created with verified claims. ### Enable Face Authentication After a user has been onboarded with Incode, you can use the connector's face authentication capability in subsequent flows to verify the user's real-world identity without another document capture. *** ## Troubleshooting ### **Redirect URI Mismatch** Confirm that the Redirect URI in the Incode OIDC client configuration exactly matches the Redirect URI within the Incode Ping DaVinci connector configuration. ### **Environment Mismatch** Confirm with your Incode Representative that your account is provisioned in the correct environment for the Issuer URL in your connector configuration. ![](https://developer.incode.com/assets/0972c71dfa292cda4488ffeec5fe9752.png) *** ## Additional Resources - [Incode DaVinci Connector on Ping Identity Marketplace](https://marketplace.pingone.com/item/incode-davinci-connector) - [Incode DaVinci Connector documentation](https://pingone-davinci.github.io/documentation/inocde/) - [PingOne DaVinci Connector Library](https://marketplace.pingone.com/browse?products=davinci\&contentType=davinciConnectors)
          --- - Path: `ecosystem-workforce/productivity-integrations` - URL: https://developer.incode.com/ecosystem-workforce/productivity-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/productivity-integrations.md # Productivity Integrations Productivity integrations bring identity verification into the collaboration tools your teams use every day. Instead of requiring employees to visit a separate portal or app, they can send and complete verification requests within familiar tools like Slack. These integrations are well-suited for IT and security use cases where agents need to confirm someone's identity quickly without interrupting the normal flow of work. When a verification is triggered from a productivity tool, Incode delivers a verification link to the employee through the same channel. The employee completes the session on their mobile device and the result is returned to the agent or system that initiated the request. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Available Productivity Integrations | Integration | Description | Status | | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------- | --------- | | [Slack](/ecosystem-workforce/slack/) | Enables identity verification requests to be sent and completed directly within Slack using slash commands. | Available | --- - Path: `ecosystem-workforce/recruitment-integrations` - URL: https://developer.incode.com/ecosystem-workforce/recruitment-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/recruitment-integrations.md # Recruitment Integrations Recruitment integrations let you initiate identity verification from your applicant tracking system (ATS) as part of the hiring process. They are designed for candidate verification use cases, where confirming a candidate's legal identity is a required step before an offer is extended, a background check is initiated, or onboarding begins. These integrations trigger identity verification directly from the tools your recruiting teams already use, instead of running it as a separate process. When a verification is triggered from a recruitment platform, Incode delivers a one-time verification link to the candidate through email. The candidate completes the session on their mobile device and the result is returned to the originating platform automatically. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Available Recruitment Integrations | Integration | Description | Availability | | :------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------- | | [Greenhouse](/ecosystem-workforce/greenhouse/) | Triggers candidate identity verification from within Greenhouse ATS. | Available | | [Ashby](/ecosystem-workforce/ashby/) | Triggers candidate identity verification from within Ashby ATS. | Available | | [Workday Recruiting](/ecosystem-workforce/workday-recruiting/) | Leverages facial biometrics, document authentication, and fraud detection to validate candidate identities during the hiring process. | Available | | [Lever](/ecosystem-workforce/lever/) | Sends a personalized Incode verification link, captures the result, and writes it back to the candidate's Lever opportunity with no manual steps required. | Available | --- - Path: `ecosystem-workforce/sailpoint-identity-security-cloud` - URL: https://developer.incode.com/ecosystem-workforce/sailpoint-identity-security-cloud/ - Markdown: https://developer.incode.com/ecosystem-workforce/sailpoint-identity-security-cloud.md # SailPoint Identity Security Cloud SailPoint Identity Security Cloud is an enterprise identity governance platform used by large organizations to manage access certification, provisioning, and lifecycle management across their application portfolio. The Incode and SailPoint integration adds biometric identity verification as a step within SailPoint identity governance workflows. When a user requires elevated identity assurance—such as during access certification, privileged account provisioning, or a high-risk lifecycle event—SailPoint triggers an Incode verification session. The verified result is returned to SailPoint and used to approve, deny, or escalate the governance action. This integration is delivered through IdRamp, Incode's identity orchestration partner, which manages the connection between SailPoint Identity Security Cloud and the Incode verification platform. *** ## Integration Flow The integration uses IdRamp as middleware between SailPoint and Incode. IdRamp handles the OIDC connection, session orchestration, and result routing so that no custom development is required on the SailPoint side. When a governance event triggers verification: 1. SailPoint routes the user to IdRamp through the configured integration step. 2. IdRamp calls the Incode API to create a verification session and delivers the link to the user. 3. The user completes biometric verification on their device. 4. Incode returns the result to IdRamp. 5. IdRamp posts the outcome back to SailPoint to complete the governance action. *** ## Prerequisites Ensure you have the following before you begin: - An active SailPoint Identity Security Cloud tenant. - An Incode account with the Integrations Ecosystem feature enabled. - An IdRamp account. Contact your Incode Representative to be connected with IdRamp as part of this integration. *** ## Set Up the SailPoint Integration Detailed setup documentation for this integration is managed by IdRamp. To get started: 1. Contact your Incode Representative to request access to the SailPoint integration. 2. Your account manager connects you with the IdRamp team, who provides configuration instructions specific to your SailPoint tenant. 3. After IdRamp is configured, Incode verification sessions can be triggered from within your SailPoint governance workflows. > 📘 **Note** > > This integration requires coordination between your Incode account team and IdRamp. Setup timelines depend on IdRamp availability. Contact [support.incode.com](https://support.incode.com) to initiate the process. *** ## Support - Incode support: [support.incode.com](https://support.incode.com) - Developer documentation: [developer.incode.com](https://developer.incode.com)
          --- - Path: `ecosystem-workforce/salesforce` - URL: https://developer.incode.com/ecosystem-workforce/salesforce/ - Markdown: https://developer.incode.com/ecosystem-workforce/salesforce.md # Salesforce This guide walks you through everything you need to do after installing the **Incode Identity Verification for Salesforce** package. By the end, your team will be able to trigger identity and/or business verification directly from any Contact, Lead, or Account record and see results update in real time. You do not need to be a developer to complete this guide. Each step is numbered and takes about 20–30 minutes total. *** ## What is Incode Verification for Salesforce? **Incode Verification for Salesforce** is a managed package that brings Incode's identity verification (IDV) and business verification (KYB) directly into the Salesforce records your teams already work in: Contact, Lead, and Account. Sales, RevOps, and Compliance users can request a verification, watch its status update in real time, and review the result without ever leaving the CRM. One click sends the customer a secure verification link by email. As Incode processes the session, webhook callbacks push the outcome back into Salesforce through a Platform Event, so the requesting user sees the status flip from **Pending,** **Approved**, or **Declined** inline, with no page refresh required. The package ships with: - A **Lightning record-page component** for Contact, Lead, and Account, configurable per layout as either an IDV or KYB card via Lightning App Builder. - **IDV flows** for individuals, government ID capture, selfie, liveness, and face match, and any other module you might need from our solution. - **KYB flows** for businesses, allowing the verification of business name and TIN lookup, registration status, entity type, address, and UBO/Director matching. - **Branded verification emails** containing links the customer can follow to complete verification on their own device. - **Real-time push-based status updates** via Platform Events. - **Verification history** on every record, with a drill-down Session Details modal you can drill into: - **IDV**: sub-scores (ID Verification, Face Recognition, Liveness, GovMatch, Video Selfie) and the captured selfie, front-ID, and back-ID images - **KYB**: the full eKYB response (business name, TIN, address, registration status, entity type) and UBO/Director matches - **Optional storage of score JSON and captured ID images** in Salesforce Files for compliance review. ## Why does this integration matter? Most teams that need identity or business verification today live in two systems: their CRM, where the customer relationship is tracked, and their verification dashboard, where the actual check happens. That split has a real cost: - **Slower onboarding.** Reps copy data between tools, chase customers through email threads, and lose context as deals move forward. - **Weaker audit posture.** Verification outcomes live in one system and the commercial record in another, making it hard to prove _who_ was verified, _when_, and against _what flow_. - **Inconsistent fraud protection.** Without verification embedded in the workflow, it often gets skipped on lower-priority accounts until a problem surfaces. This integration closes that gap. Verification becomes a one-click step inside the same record where the deal, the contact, and the case history already live. For legitimate customers, onboarding gets faster. For compliance and AML teams, the audit trail gets tighter. For the business, fraud protection extends to every account, not just the high-value ones. ## Who is it for? - **B2C and financial services teams** running KYC at Contact or Lead creation - **B2B sales and onboarding teams** running KYB before opening a new business account - **Compliance, AML, and Risk teams** that need a defensible audit trail tying each verification to a Salesforce record - **Teams handling regulated or high-value transactions** that benefit from step-up verification at contract or payment milestones ## 📦 Latest Package Installation Link Use the link below to install or upgrade to the latest version of the package: Latest version: **v0.10.0-1**: - Production: [https://login.salesforce.com/packaging/installPackage.apexp?p0=04tJx0000005PsDIAU](https://login.salesforce.com/packaging/installPackage.apexp?p0=04tJx0000005PsDIAU) - Sandbox: [https://test.salesforce.com/packaging/installPackage.apexp?p0=04tJx0000005PsDIAU](https://test.salesforce.com/packaging/installPackage.apexp?p0=04tJx0000005PsDIAU) > 📘 **Note** > > The links above always point to the current latest version. This page is updated with every new release, and previous versions are documented in [Version History](#version-history) below. > 📌 **Tip — install/upgrade into a specific org** > > The link above defaults to `login.salesforce.com`, which routes you through the standard Salesforce login picker. To go straight to the install/upgrade wizard inside a specific target org (e.g. a sandbox you're already logged into), swap the host with the target org's My Domain URL. > > For example, if the target org is `https://acme--sandbox.sandbox.lightning.force.com/lightning/page/home`, change the path so the URL becomes: > > `https://acme--sandbox.sandbox.lightning.force.com/packaging/installPackage.apexp?p0=04tJx0000005PsDIAU` > > Opening that URL while logged into `acme--sandbox` takes you directly to the install/upgrade wizard for that org. The same pattern works for any sandbox, scratch org, or production org — keep the `/packaging/installPackage.apexp?p0=…` suffix and only swap the host. ### Version History | Version | Released | Highlights | | --------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | v0.10.0-1 | 2026-05-31 | Combined IDV + KYB managed package · Real-time updates via Platform Events · Manual Review status writable · Webhook Secret + X-Incode-Secret header · Use Production API toggle · Store Score And Images toggle · Branded verification emails (auto-routed IDV vs KYB) · Session Details modal · Three permission sets (Admin / User / Webhook Guest) · Salesforce Site + Apex REST endpoint · Post-install setup script + idempotent Run Setup button | *** ## Installation The installation links above take you to the following screens: 1. Select **Install for All Users**. > 📘 **Note** > > Remember to set proper settings regarding user access. 2. Click **Install**. ![](https://developer.incode.com/assets/17eb2f84e1f4ae738290c40e040e5fdb.png) 3. In the pop-up requesting third-party access, check **Yes, grant access to these third-party web sites**. You must accept it because the managed package needs to communicate with the Incode solution through APIs. Click **Continue**. ![](https://developer.incode.com/assets/ba54097f69c93651100b87a5abd2dc0e.png) 4. A successful installation shows the following page with the "Installation Complete!" message. Click **Done**. ![](https://developer.incode.com/assets/d976f22efe140d19b5366bb95eec8ade.png) ## What the package automates for you When you install or upgrade the package, a post-install script runs automatically and handles the following: - **Creates the default Incode Config record**. You only need to fill in your API Key and Configuration ID (Flow ID). - **Verifies both Named Credentials are present** and warns you if either is missing. - **Auto-creates two email templates** into the `Incode Templates` folder with automatic routing by verification type: - **Incode Verification Request** (IDV) - **Incode KYB Verification Request** (KYB) You create the folder once (Step 3), then `Run Setup` in Step 4 to create both templates inside it. - **Assigns the **`Incode_Webhook_Guest`** permission set to the Site Guest User** once the Salesforce Site exists. You create the Site (Step 2), then `Run Setup` in Step 4 to pick it up and assign the permset automatically. After install, you can re-run automated setup any time from the **App Launcher → Incode Setup → Run Setup** button. It is idempotent and safe to click after every package upgrade or whenever you make a manual config change. Anyone running this needs the **Incode Admin** permission set assigned (and the **Customize Application** permission, which System Administrators have by default). *** ## Before You Begin ### What you will need from Incode Before starting, make sure you have received the following from your Incode account team: | Item | Where to find it | | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | **API Key** | Incode Dashboard → Configuration → API Keys | | **Demo or Prod environment** | You would need access to a sandbox or production environment of Dashboard to properly perform this integration. | | **Onboarding Flow** | You must have an active onboarding flow configured in Dashboard. If you do not have one yet, create one under **Flow Builder** before proceeding. | | **Configuration ID** | The ID of your onboarding flow. Incode Dashboard → Flow Builder → Flows → copy the **Flow URL**. | | **Webhook URL slot** | Incode Dashboard → Configuration Webhooks (you will paste a URL here in Step 2) | | **Environment** | Confirm whether you are connecting to the **Demo** environment (`demo-api.incodesmile.com`) or the **Production** environment (`saas-api.incodesmile.com`) | > 📘 **Tip** > > If you do not yet have an Incode account or API credentials, contact your Incode representative before proceeding. Nothing in this guide will work without a valid API Key, an onboarding flow, and its Flow ID. ### Salesforce prerequisites - You must be a **Salesforce System Administrator** (or have the "Customize Application" and "Modify All Data" permissions). - The package must already be installed. If you have not installed it yet, use the link at the top of this page before continuing. - Your org must have **My Domain** enabled (Setup → My Domain). Lightning Experience components require My Domain to be active. - Your org must have the **sending email domain verified** and **email deliverability** set to "All Email". See Step 0 below. *** ## Step 0 — Verify Email Domain and Deliverability Salesforce requires that your organization's **email domain** is verified before any emails can be sent — even if your individual user email address shows as verified. Without this, the package will fail with: _"We can't send your email because your email address domain isn't verified."_ ### Option A — Verify your email domain (recommended for Production) This is the recommended approach for production orgs. It verifies your domain via DNS so all users with that email domain can send emails. 1. In Setup, type `Email Domain Verification` in Quick Find and click the result (under **Email**). 2. If your domain (e.g., `yourcompany.com`) is not listed, click **Add Domain**. 3. Enter your email domain — this is the part after the `@` in your Salesforce user email addresses. 4. Salesforce will generate **DNS TXT records** that must be added to your domain's DNS configuration. 5. Work with your IT/DNS administrator to add the provided TXT records to your domain's DNS. 6. Return to the page and click **Verify**. DNS propagation can take up to 72 hours. > 📘 **Note** > > This is a one-time org-level setup. Once the domain is verified, all users in the org whose email address uses that domain can send emails. ### Option B — Use a substitute email address (quick fix for Sandbox / Scratch Orgs) If you are working in a sandbox, scratch org, or developer edition and do not have access to DNS settings, you can enable a substitute sender address instead of verifying the domain. 1. In Setup, type `Deliverability` in Quick Find and click **Deliverability**. 2. Under **Email Security Compliance**, check **Use a substitute email address for unverified domains**. 3. Click **Save**. ![](https://developer.incode.com/assets/79bb6f7ca7d5410954c3bb1025326009.png) Salesforce will replace the unverified "From" address with a generic Salesforce no-reply address. The recipient still receives the email, but the sender name will not show your domain. > ⚠️ **Important** > > This is a workaround for testing and development. For production orgs, use Option A so emails are sent from your real domain and are less likely to be flagged as spam. > ⚠️ **Substitute address is not a complete bypass.** > > Even with this enabled, Salesforce still requires the **sending user's email address itself** to be verified (see "Verify the sending user's email" below). Substitute-address handles the _domain_ check, not the _user_ check. If you skip the next step, verification requests will appear to succeed in Salesforce (a "Pending" row shows up) but no email will ever reach the recipient. ### Verify the sending user's email (required for Sandbox / Scratch Orgs) Salesforce will refuse to send any outbound email if the user triggering the send has an unverified email address on their User record. This is separate from domain verification (Option A) and is **not** bypassed by substitute address (Option B). In production orgs, this is rarely an issue, as admins log in with their already-verified work email. In **scratch orgs and freshly cloned sandboxes**, the auto-generated user often has a synthetic email address (e.g., `user.abc123@example.com`) that you can't actually receive mail at, which means the verification link Salesforce sends is unreachable. You need to point the user at a real inbox you control before requesting verifications. 1. In Setup, type `Users` in Quick Find and click **Users**. 2. Click your user's name (the one you're logged in as). 3. Click **Edit**. 4. Change the **Email** field to a real address you can receive mail at. For testing, a personal Gmail address works fine (e.g., `yourname+sfdev@gmail.com`). 5. Click **Save**. 6. Salesforce sends a verification email to that address. Open your inbox, find the message from Salesforce, and click the verification link. 7. Return to Salesforce — the email is now verified for use as the From address. ![](https://developer.incode.com/assets/c9b501c02926c50a4cd5e53c0d15f8ab.png) > 📘 **Why this matters** > > Scratch org users default to a synthetic @example.com email that no one can read. Without changing it to a real address and verifying it, every outbound email from that user, verification requests included, will silently fail. ### Confirm email deliverability 1. In Setup, type `Deliverability` in Quick Find and click **Deliverability**. 2. Ensure **Access to Send Email** is set to **_All Email_**. New sandbox and scratch orgs default to "System Email Only", which blocks all outbound emails except password resets. 3. Click **Save**. ### Test the email setup before continuing Before moving on to Step 1, confirm Salesforce can actually send mail from this org: 1. In Setup, type `Test Deliverability` in Quick Find and click **Test Deliverability**. 2. Enter your own email address and click **Send**. 3. Salesforce sends test emails. They should arrive within 1–2 minutes (check spam if they don't). **If you see _"The FROM address has not been verified"_:** the sending user's email is unverified. Go back to _"Verify the sending user's email"_ above. **If the test succeeds but no emails arrive:** check spam, then check Setup → **Email Log Files** to see what Salesforce reports for each attempt. **If the test succeeds and emails arrive:** email setup is complete. Proceed to Step 1. *** ## Step 1 — Configure Custom Settings The default Incode Config record is auto-created at install time. You only need to populate the values. 1. In Setup, type `Custom Settings` in Quick Find and click the result. 2. Find **Incode Config** in the list and click **Manage** next to it. 3. Click **Edit** on the org-default row (auto-created). 4. Fill in the fields: | Field | What to enter | | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **API Key** | Your Incode API Key (e.g. `eyJhbG...`) | | **Configuration ID** | Your onboarding Flow ID for the IDV flow from Dashboard (e.g. `6421abc123def456`) | | **KYB Configuration ID** | Your onboarding Flow ID for the business verification flow from Dashboard (e.g. `6421abc123def487`) | | **Webhook Secret** | Optional. Leave blank for now — add it later if Incode provides one. | | **Use Production API** | Leave **unchecked** for Demo. Check this box **only** when you are ready to go live after testing end-to-end and confirming verifications are working. | | **Store Score And Images** | Optional checkbox, off by default. When enabled, completed IDV sessions store the full score result plus the selfie, front-ID, and back-ID images into Salesforce Files attached to the verification record, and enable the per-row details modal (see Step 7).
          Enabling Store Score And Images persists copies of government-ID images in Salesforce Files.
          Confirm this is consistent with your org's data-retention and privacy policies before turning it on. KYB/IDV status, score, and history all work without it. | ![](https://developer.incode.com/assets/bc34aa660d596984040f28e36d6243ee.png)
          ![](https://developer.incode.com/assets/1de8885423d3fcd39a7a4457990b62d6.png) 5. Click **Save**. *** ## Step 2 — Create the Webhook Endpoint (Salesforce Site + Incode Dashboard) The Incode platform needs a public HTTPS URL to send verification results back to Salesforce. This is a two-part step: first you create a public Salesforce **Site** that exposes the webhook endpoint, then you register that endpoint URL with Incode Dashboard so it knows where to `POST` results. > 📘 **Why manual?** > > Salesforce does not allow Sites (CustomSite metadata) to be included in second-generation managed packages. This is a one-time setup step. ### Part A — Create and Activate the Salesforce Site The package includes the Visualforce pages the Site needs, you just need to wire them up. 1. In Setup, type `Sites` in Quick Find and click **Sites**. 2. If this is your first Site, Salesforce will ask you to **register a Sites domain**. Accept the suggested domain (e.g. `yourcompany.my.salesforce-sites.com`) and click **Register My Salesforce Site Domain**. Wait for registration to complete. 3. Click **New** to create a new Site. 4. Fill in the Site details: | Field | Value | | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Site Label** | Any label works. We suggest a name containing the word `Incode` (e.g. `IncodeWebhook`, `IncodeIdentity`). `Run Setup` in Step 4 finds the Site's Guest User by matching "Incode" in the auto-generated profile name. If you choose a label without "Incode", you'll need to assign the Webhook Guest permset manually (see Step 5). | | **Site Name** | Auto-populates from the label | | **Active** | Checked | | **Active Site Home Page** | Select `incode__Incode_Webhook_Home` (provided by the package) | ![](https://developer.incode.com/assets/ea92ab37e97d7c6d10290686aff6b960.png) 5. Click **Save**. 6. Once saved, copy the **Site URL** shown on the Site detail page. Salesforce computes this for you — by default it is just your registered Sites domain with no path component, e.g.: ``` https://yourcompany.my.salesforce-sites.com ``` If your org's Site has a custom **Default Web Address** set on the Site record, the URL will include that path segment. Always use whatever Salesforce displays as the Site URL, not the Site Name. 7. Your full webhook endpoint URL is the Site URL + `/services/apexrest/incode/webhook`. For the typical case above: ``` https://yourcompany.my.salesforce-sites.com/services/apexrest/incode/webhook ``` Keep this URL handy — you'll paste it into the Incode Dashboard in Part B. > 📘 **Tip** > > `incode` in the URL path (before `/webhook`) is the managed package namespace, automatically prepended by Salesforce. `webhook` is the REST endpoint mapping. Neither depends on the Site label you chose. ### Part B — Register the Webhook URL in the Incode Dashboard You are registering an **Onboarding status webhook url,** this is the hook Incode fires when a verification session ends (whether the user finished, failed, or was sent to manual review). Without it, the status in Salesforce will stay **Pending** indefinitely. 1. Log in to the **Incode Dashboard** (your Incode account manager can provide the URL). 2. In the left menu, click **Configuration**. 3. Switch to the **Webhooks** tab. 4. Scroll down and click **Generate new**. 5. Use the **Type** drop-down to select **_Onboarding status webhook url_**. The package listens for the `ONBOARDING_FINISHED` event, which is delivered exclusively through this webhook. 6. In the **URL** field, enter the full webhook URL from Part A (e.g. `https://yourcompany.my.salesforce-sites.com/services/apexrest/incode/webhook`). Use whatever Salesforce shows as the Site URL, do **not** insert the Site Name as a path segment unless your Site has a custom Default Web Address 7. Click **Save**. ![](https://developer.incode.com/assets/a13ec20c5c66bfb52ccfe083c9bfbfb5.png)
          If you entered a Webhook Secret in Step 1: 1. Scroll up to the General section of the Configuration > Webhooks. 2. Click the **+** under Webhook custom headers. 3. For **Custom Header Key**, enter **_X-Incode-Secret_** 4. For **Custom Header Value**, enter the exact string you entered in the **Webhook Secret** field in Step 1. 5. Click **Update settings**. Incode will include this header in every POST it sends to Salesforce. The package checks the `X-Incode-Secret` request header on every inbound webhook call and rejects any request where it is missing or does not match — returning HTTP 401 so Incode knows to alert on the failure. *** ## Step 3 — (Optional) Create the Email Template Folder The package includes a built-in fallback email (plain HTML, no template required), so verification emails will be delivered even if you skip this step. Creating a named template lets you customize the branding and wording. > 📘 **Why is this manual?** > > The 2GP managed-package builder cannot bundle `EmailFolder` metadata — a known Salesforce platform limitation. The post-install script auto-creates the email template **only if** the folder exists, which means the folder must be created manually first. Step 4 (`Run Setup`) auto-creates the template into it. ### Quickest path 1. In Setup, type `Email Template Folders` in Quick Find and create a new folder: - **Folder Label**: `Incode Templates` - **Folder Unique Name**: `Incode_Templates` (must match exactly) - **Folder Access**: Read/Write Step 4 will detect the folder and auto-create both templates inside it: **Incode Verification Request** (IDV) and **Incode KYB Verification Request** (KYB). The package automatically routes the email by verification type. ### To customize the template (after Step 4 has created it) 1. In Setup, type `Classic Email Templates` in Quick Find. 2. In the folder dropdown, select **Incode Templates** → click the template you want to customize (**Incode Verification Request** for IDV or **Incode KYB Verification Request** for KYB) → **Edit HTML Version**. 3. Edit the HTML. **Keep these two placeholder strings intact** — the package replaces them at send time: - `{{VERIFICATION_URL}}` — the unique verification link - `{{FIRST_NAME}}` — the contact/lead's first name (falls back to "there" if blank) 4. Click **Save**. > 📘 **Note** > > These are plain string placeholders, **not** Salesforce merge fields like `{!Contact.FirstName}`. The package only replaces the `{{...}}` tokens. *** ## Step 4 — Run Incode Setup Open the **App Launcher** (top-left). Search for **Incode Setup**. You should see the Setup Assistant page. Click **Run Setup**. > 📘 **Don't see the Incode Setup tab?** > > You need the **Incode Admin** permission set assigned to your user. Setup → Permission Sets → **Incode Admin** → Manage Assignments → add yourself, then return here. The tab is hidden by default to avoid cluttering end-users' App Launcher. ![](https://developer.incode.com/assets/f2a820a05d8ebd53e7d8d5f903b09d8d.png) What the **Run Setup** button does (all idempotent): - Confirms the default **Incode Config** custom-setting record exists. - Creates (if missing) two email templates inside the **Incode Templates** folder: **Incode Verification Request** (IDV) and **Incode KYB Verification Request** (KYB). The package automatically routes the email by verification type. Skipped with a warning if you did not create the folder in Step 3; the built-in fallback email is used in this case. - Assigns the **Incode\_Webhook\_Guest** permission set to the Site Guest User. Requires the Site from Step 2 to exist. - Verifies that Named Credentials `IncodeAPI` and `IncodeAPI_Production` are present (warns if either is missing). You should see a list of **Created** or **Already in place** entries confirming each task. The post-install script ran the same tasks at install time, so on a fresh install some items will already be in place — that's expected. ### KYB admin credentials (optional) If you plan to process KYB verifications through Salesforce, the Setup Assistant will prompt you for an Incode admin email and password (the credentials of an admin user on your Incode dashboard). These are required only if you want the per-row Session Details modal to drill into business name, TIN, address, and UBO/Director matches. **How it works**: The package uses these credentials to call Incode's /executive/log-in endpoint to obtain an access token, which is required to call /omni/single-session for the full KYB result. IDV flows don't require this because the package can call /omni/get/score directly with the onboarding session token. **Storage**: Credentials are stored in a Protected Custom Metadata row inside your Salesforce org, invisible to subscriber-org code outside this package's namespace. They never leave your instance. **Skipping this step**: Leave the fields blank if you don't need the modal — KYB status, score, and history still work end-to-end without it. *** ## Step 5 — Assign Permission Sets Two permission sets need to be assigned to internal users. The third (`Incode_Webhook_Guest`) was assigned to the Site Guest User automatically by Step 4. ### Incode\_User (for Salesforce users who will request verifications) 1. In Setup, type `Permission Sets` in Quick Find and click the result. 2. Click **Incode User** from the list. 3. Click **Manage Assignments** → **Add Assignments**. 4. Select all users who should be able to request identity verifications (e.g. your sales team, ops team). 5. If no users appear in your list view, click **Select a List View** and choose **Recently Viewed**. 6. Click **Next**. 1. Note: Remember to set an assignment expiration if required. > 📌 **Tip** > > You can also assign permission sets from a user's record. Go to the user record → Permission Set Assignments → Edit Assignments. ![](https://developer.incode.com/assets/7bbe563c553b1717327e1d1f3642f3f9.png)

          ![](https://developer.incode.com/assets/a7f86b5161fd45916ee6c58610c6246b.png)
          ![](https://developer.incode.com/assets/30a505ae3580094ec5a5884a4523393b.png)
          ### Incode\_Admin (for Salesforce admins who will run setup tasks) Assign this to anyone who should see the **Incode Setup** tab. System Administrators have the underlying `Customize Application` permission they need to actually run the setup, but the tab itself is hidden by default until this permission set is assigned. 1. Setup → Permission Sets → **Incode Admin** → Manage Assignments → **Add Assignments** → pick yourself (and any co-admins) → **Assign**. ### Manual fallback for Incode\_Webhook\_Guest Step 4 normally assigns this automatically. You only need this fallback if your Site's auto-generated profile name does not contain "Incode" (uncommon — usually means the Site label you chose in Step 2 did not contain "Incode"): 1. Setup → **Sites** → click your Site → **Public Access Settings** → scroll to bottom → **View Users**. 2. Click the Site Guest User → scroll to **Permission Set Assignments** → **Edit Assignments**. 3. Move **Incode Webhook Guest** from Available to Enabled → **Save**. > 📘 **Note** > > You do not need to grant object or field permissions on the guest user profile. The webhook handler runs in system mode for data access and only updates package-owned records. *** ## Step 6 — Add the Component to Record Pages The "Incode Identity Verification" sidebar card needs to be added to your Contact, Lead, and/or Account record pages using the Lightning App Builder. Repeat these steps for each record type you want to enable (Contact, Lead, Account). ### For Contact pages: 1. Open any Contact/Lead/Account record. 2. Click the **gear icon** in the top-right of the record page → **Edit Page**. ![](https://developer.incode.com/assets/447d21610177a92b9863c6a1fbdb1808.png) 3. In the left panel, scroll down to **Custom** - **Managed** components. You should see **Incode Verification**. ![](https://developer.incode.com/assets/9b543f03a96f6e2d5427fd193e28e6ef.png) 4. Drag **Incode Verification** onto the right-hand sidebar of the page layout. ![](https://developer.incode.com/assets/a83b18ae85f5236fd71591c30cc65a86.png) 5. Select the verification type: 1. **IDV:** For regular onboarding flows for individuals verification, ID, selfie, face match, etc. 2. **KYB:** For business verification flows. 6. Click **Save** → **Activate** → choose **Activate for all users**. 7. Click **Back** (Left arrow) to return to the record. > 📘 **Note** > > If the component shows an error message about missing configuration, go back and check Step 1. Repeat for the remaining pages as needed. *** ## Step 7 — Test End-to-End Before rolling out to your team, do a test run. 1. Open a Contact record. 2. In the **Incode Identity Verification** sidebar card, confirm the email address (or type in a test address you have access to). 3. Click **Request Verification**. 4. The history table should update within seconds to show a **Pending** row. 5. Check the inbox — you should receive an email with a verification link. 6. Click the link, complete the verification (ID photo + selfie). 7. Return to the Salesforce record. Within \~10 seconds the status should update to **Approved** (green) or **Declined** (red). If Incode routes the session to manual review, the status will show **Manual Review** (orange) until a reviewer approves or rejects it in the Incode Dashboard, after which it flips to **Approved** or **Declined**. If **Store Score And Images** is enabled, click any IDV history row to open the Session Details modal (Session Info / ID Verification / Capture Attempts). Images are saved to Salesforce Files the first time an internal user (with the `Incode_User` permission set) opens the modal. ![](https://developer.incode.com/assets/c6e14cac5662b59e58a722ecdee19763.png) *** ## Step 8 — Troubleshooting Common Issues **"Request Verification" button shows an error immediately**
          Check Custom Settings (Step 1). API Key or Configuration ID is likely wrong or has extra spaces. Confirm the Demo/Production checkbox matches your environment. **"We can't send your email because your email address domain isn't verified"**
          Your sending email domain is not verified at the org level. Go back to Step 0 and complete the Email Domain Verification. This is different from your individual user email being verified — Salesforce requires the _domain itself_ (e.g., `yourcompany.com`) to be verified via DNS TXT records before any emails can be sent from that domain. **Email is not received by the contact**
          Check Setup → Email → Deliverability — Access Level must be set to **All Email** (see Step 0). Also check spam. **"Pending" row appears in Verification History but no email arrives**
          Salesforce believes it sent the email but it never reached the recipient. The most common cause in sandbox/scratch orgs is an unverified sender email on the User record. Go to Setup → Test Deliverability → send a test email to yourself. If it fails with _"The FROM address has not been verified"_, you need to verify the sending user's email (Step 0, _"Verify the sending user's email"_). Also check the recipient's spam folder and Setup → Email Log Files for delivery details. **Verification status is not updating after the contact completes the flow**
          Confirm the Site is Active (Step 2, Part A). Confirm the **ONBOARDING\_FINISHED** event webhook is registered in the Incode Dashboard for the correct configuration (Step 2, Part B). Confirm `Incode_Webhook_Guest` is assigned to the Site Guest User — the easiest way is to click **App Launcher → Incode Setup → Run Setup**; it'll either confirm the assignment is in place or create it. Check Setup → Sites → click your Site → **Site History** for 4xx/5xx errors. If you see HTTP 401 errors in Site History, the `X-Incode-Secret` custom header in the Incode Dashboard is missing or does not match the **Webhook Secret** you entered in Custom Settings (Step 1). If the verification card itself shows the event suffixed with `score-skipped: ...`, see the next entry. **Verification card shows **`Event: ONBOARDING_FINISHED | score-skipped: …`
          The webhook arrived, but the package could not enqueue the async score reconciliation that decides Approved vs. Declined. The reason is shown after `score-skipped:`: - `no config` — the Site Guest User cannot read the Incode Config custom setting. Re-install or upgrade the package so the latest `Incode_Webhook_Guest` permset (which grants this access) is applied to the Site Guest User. - `API key blank` — the API Key in Custom Settings (Step 1) is empty. Fill it in and re-test with a fresh verification. **Verification card shows **`Event: ONBOARDING_FINISHED | score-fetch-unknown`
          The webhook arrived and the package called Incode's `/omni/get/score` endpoint, but it returned no usable outcome (HTTP error, malformed response, or missing `overall.status`). Common causes: - The **Use Production API** toggle in Custom Settings (Step 1) does not match the Incode environment that issued the webhook — e.g., the API Key is for Demo but the toggle is checked. Re-check Step 1. - The Incode flow occasionally takes a few extra seconds to compute the score after firing the webhook. Re-try the verification — if every attempt shows this suffix, it is a configuration mismatch, not a timing issue. **Verification row is stuck at "Pending" for a session that Incode sent to manual review**
          This means the installed package predates v0.10.0, which made the Manual Review status writable on existing orgs. Upgrade to the latest package using the link at the top of this page — after the upgrade, existing Pending rows for manual-review sessions will update correctly when the reviewer approves or rejects in the Incode Dashboard. **The "Incode Setup" tab is not visible in the App Launcher**
          Assign the **Incode Admin** permission set to your user. Setup → Permission Sets → Incode Admin → Manage Assignments → Add Assignments. The tab is hidden by default to avoid cluttering end-users' App Launcher. **Incode Setup → Run Setup says "Site Guest User" warning even after I created the Site**
          The setup task looks up the Guest User via the Site's auto-generated profile name (which contains "Incode"). If your Site has a different profile name, fall back to the manual permset assignment instructions in Step 5. **Component shows a configuration error on the record page**
          Verify Custom Settings were saved (Step 1) and the logged-in user has the `Incode_User` permission set (Step 5). **Component is not visible on the record page**
          Must be added via Lightning App Builder. Go back to Step 6 and confirm you saved and activated the page. *** ## Quick Reference Checklist - [ ] Obtained API Key and Configuration ID from Incode - [ ] Email domain verified in Setup → Email Domain Verification (Step 0) - [ ] Email deliverability set to "All Email" (Step 0) - [ ] Sending user's email verified (Step 0) - [ ] Test Deliverability succeeded (Step 0) - [ ] Custom Setting **Incode Config**: API Key, Configuration ID, and Production toggle filled in (Step 1) - [ ] Salesforce Site created and activated (Step 2, Part A) - [ ] Webhook URL registered in Incode Dashboard, **ONBOARDING\_FINISHED** event selected, for the correct configuration (Step 2, Part B) - [ ] `X-Incode-Secret` custom header configured in Incode Dashboard (if Webhook Secret was set in Step 1) - [ ] (Optional) Email folder `Incode_Templates` created (Step 3) — or rely on the built-in fallback email - [ ] **Incode Admin** permission set assigned to yourself so you can see the Incode Setup tab - [ ] **Incode Setup → Run Setup** clicked once — auto-creates the email template (if folder exists), assigns the Webhook Guest permset, verifies Named Credentials (Step 4) - [ ] **Incode\_User** permission set assigned to all relevant Salesforce users (Step 5) - [ ] **Incode Verification** component added to Contact, Lead, and/or Account record pages (Step 6) - [ ] End-to-end test completed successfully (Step 7) - [ ] If any row is stuck at Pending for a session routed to manual review, upgrade to v0.10.0 or later (link at top) — pre-v0.10.0 installs cannot write the Manual Review status to existing orgs *** _For additional support, contact your Incode account team or raise a support request through the Incode customer portal._ --- - Path: `ecosystem-workforce/self-serve-portal` - URL: https://developer.incode.com/ecosystem-workforce/self-serve-portal/ - Markdown: https://developer.incode.com/ecosystem-workforce/self-serve-portal.md # Self-Serve Portal The Self-Serve Portal lets employees reset their passwords and MFA credentials on their own. The portal uses Incode biometric verification to confirm the employee's identity before allowing any credential changes. > 📘 Note > > The Integrations Ecosystem feature must be enabled for your organization before you can access the Integrations page. Contact your Incode Representative to enable this feature. *** ## Self-Serve Flow 1. **Log in: **The employee navigates to the Self-Serve Portal and enters their work email. Incode checks that the email exists in the connected directory. 2. **Complete verification: **The employee scans a QR code or requests an SMS link to complete identity verification on their mobile device. Verification includes a selfie liveness check. 3. **Reset credentials: **After successful verification, the browser redirects the employee to the portal where they can reset their password or MFA credentials. *** ## Key Features - **IAM integration**: The portal displays available reset options based on your organization's connected IAM providers, such as Okta, Microsoft Entra, or Ping Identity. - **Self-serve reset options**: Employees can reset their MFA authenticator or password directly from the portal. After selecting a reset option, the employee receives an email from their IAM provider with instructions to complete the process. > 📘 Note > > **Note**: Okta super admins cannot reset their password or MFA using the Self-Serve Portal. *** ## Set Up the Self-Serve Portal 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. Locate the **Self-Serve Portal** integration and open its configuration. 4. Configure the portal settings, including any linked IAM integrations such as Okta or Microsoft Entra. 5. Click **Save**. The portal URL is generated and goes live immediately. 6. Share the portal URL with your employees. --- - Path: `ecosystem-workforce/servicenow` - URL: https://developer.incode.com/ecosystem-workforce/servicenow/ - Markdown: https://developer.incode.com/ecosystem-workforce/servicenow.md # ServiceNow The Incode integration for ServiceNow enables IT helpdesk agents to trigger identity verification sessions directly from supported record forms without leaving ServiceNow. When an agent clicks **Request Identity Verification** on a record, the relevant person receives a secure verification link by email. As they complete the Incode session, the **IDV Status** field on the record updates automatically in real time through webhook. The integration is available as a scoped application installable from the [ServiceNow Store](https://store.servicenow.com). *** ## Prerequisites Ensure you have the following before you begin: - A ServiceNow instance running **Tokyo or later**. - An `admin` role on the target ServiceNow instance. - Access to the Integrations page in Dashboard. Contact your Incode representative if you do not see it. - The following credentials from your Incode Dashboard—see [Find integration details](/dashboard-platform-administration/manage-integrations/#find-integration-details) for where to locate each one: | Credential | Where to find it in Dashboard | | ---------------- | ----------------------------------------------- | | API Key | Configuration > API Keys | | Configuration ID | Workflows | | Integration ID | Integrations > open integration > Copy ID | | Client ID | Integrations > Custom > OIDC Client Credentials | | Client Secret | Integrations > Custom > OIDC Client Credentials | * Outbound SMTP email configured on your ServiceNow instance *** ## Understand How It Works 1. An agent opens a supported ServiceNow record, such as an Incident or Service Request, and clicks **Request Identity Verification**. A confirmation dialog appears before the request is sent. 2. A verification session is created and a link is emailed to the relevant person on the record: the Caller, Requested For, or equivalent. 3. The person completes the Incode verification session on their device. 4. Incode sends webhook events back to the ServiceNow instance as the session progresses. 5. The **IDV Status** field on the record updates automatically with the result and timestamp. *** ## Supported Record Types | Record type | Table | Person verified | | --------------- | ----------------- | --------------- | | Incident | `incident` | Caller | | Service Request | `sc_request` | Requested For | | Requested Item | `sc_req_item` | Requested For | | Change Request | `change_request` | Requested By | | HR Case | `sn_hr_core_case` | Opened For | > 📘 **Note** > > HR Case support requires the **HR Service Management Core** plugin (`com.sn_hr_core`) to be installed on your ServiceNow instance before the IDV Status field can be added to the HR Case form layout. *** ## IDV Status Field Values The **IDV Status** field (`x_1946359_incode_0_idv_status`) on each supported record updates automatically as webhook events are received from Incode. Each status value includes a timestamp of the last update. | Status | Meaning | | -------------------------------------- | ----------------------------------------------------------- | | `In Progress - YYYY-MM-DD HH:MM:SS` | Person has opened the verification link | | `Pending Review - YYYY-MM-DD HH:MM:SS` | Verification submitted, awaiting manual review in Dashboard | | `Success - YYYY-MM-DD HH:MM:SS` | Identity confirmed, safe to proceed with resolution | | `Failed - YYYY-MM-DD HH:MM:SS` | Verification failed, do not proceed | | `Failure - YYYY-MM-DD HH:MM:SS` | Session completed with unsuccessful onboarding status | *** ## Set Up the ServiceNow Integration ### Install the Application **Option A: ServiceNow Store** 1. Go to [store.servicenow.com](https://store.servicenow.com). 2. Search for **Incode Identity Verification**. 3. Click **Get**, then **Install** on your instance. The app installs automatically as a scoped application. **Option B: Update Set XML (for PoC or pilot)** 1. In ServiceNow, go to **System Update Sets** > **Retrieved Update Sets**. 2. Click **Import Update Set from XML**. 3. Upload the provided `incode_idv_update_set.xml` file. 4. Click **Preview Update Set**, resolve any conflicts, then click **Commit Update Set**. ### Open the Getting Started Checklist After installation, go to **Filter Navigator** > **Incode Identity Verification** > **Getting Started**. This guided checklist walks through the remaining setup steps in sequence. Follow it in order: the checklist covers the steps below. ### Configure the application Navigate to **Incode Identity Verification** > **Configuration** and fill in all sections: **API Settings** | Field | Value | | ---------------- | ------------------------------------------------------------------- | | Base URL | `https://demo-api.incodesmile.com` (sandbox) or your production URL | | API Key | From Dashboard—Configuration > API Keys | | Configuration ID | From Dashboard—Workflows | | Integration ID | From Dashboard—Integrations > open integration > Copy ID | **OAuth2 Authentication** | Field | Value | | --------------- | ---------------------------------------------------------------------------------- | | Auth Server URL | `https://auth.incode.com` (production) or `https://auth.demo.incode.com` (sandbox) | | Token URL Path | `/oauth2/token` | | Grant Type | `client_credentials` | | Client ID | From Dashboard—Integrations > Custom > OIDC Client Credentials | | Client Secret | From Dashboard—Integrations > Custom > OIDC Client Credentials | | Scope | `openid` | **Email Settings** | Field | Value | | ------------------- | -------------------------------------------- | | SMTP Host | Your SMTP server (e.g. `smtp.office365.com`) | | SMTP Port | `587` (STARTTLS) | | SMTP Username | Your sending email address | | SMTP Password | Your SMTP password | | Connection Security | `STARTTLS` | | From Address | Must match SMTP username for Office 365 | | From Name | e.g. `IT Helpdesk` | > 📘 **Note** > > The SMTP fields configure the From address on outbound emails. Actual email delivery uses the ServiceNow platform mailer configured under **System Properties > Email > Outbound** (`glide.smtp.*`). If you need > a dedicated SMTP relay, ask your ServiceNow administrator to configure it there. After filling in all fields: 1. Click **Save Configuration**. 2. Click **Test OAuth2** and confirm the connection shows as successful. 3. Click **Send Test Email** and confirm delivery. 4. Click **Clear Cache**. ### Register the webhook 1. Copy the webhook URL from the Configuration page: `https://YOUR-INSTANCE.service-now.com/api/x_1946359_incode_0/incode_idv_webhook`. 2. In Dashboard, go to **Configuration** > **Webhooks** and add a new endpoint. See [Configuration: Webhooks tab](/dashboard-platform-administration/configuration-webhooks-tab/) for more information. 3. Paste the webhook URL and enable the following events: | Event | IDV Status result | | ------------------------------------------- | --------------------------------------------- | | `SESSION_STARTED` | In Progress | | `SESSION_SUCCEEDED` | Success | | `SESSION_FAILED` | Failed | | `SESSION_PENDING_REVIEW` | Pending Review | | `SESSION_COMPLETED` / `ONBOARDING_FINISHED` | Success or Failure based on onboarding result | 4. Copy the **Signing Secret** from the Incode webhook configuration and paste it into the **Webhook Secret** field on the ServiceNow Configuration page. 5. Click **Save**. ### Assign Roles Assign roles to your team through **User Administration** > **Users**: | Role | Assign to | | -------------------------- | -------------------------------------------------- | | `x_1946359_incode_0.agent` | All helpdesk agents who will trigger verifications | | `x_1946359_incode_0.admin` | IT administrators who manage app configuration | ### Add IDV Status Field to Form Layouts The **IDV Status** field is included in the app but must be added to each record type's form layout manually. For each record type you want to enable: 1. Open any record of that type: for example, an Incident. 2. Right-click the form header and select **Configure** > **Form Layout**. 3. Find **IDV Status** in the Available fields list on the left. 4. Drag it to your preferred position on the form. 5. Click **Save**. Repeat for each record type: Incident, Service Request, Requested Item, Change Request, and HR Case (if the HR plugin is installed). > 📘 **Tip** > > Placing the IDV Status field near the top of the form or next to the caller/requestor field makes the verification result easy for agents to see at a glance. *** ## Test the Integration Once setup is complete, test the full end-to-end flow: 1. Open an Incident record with a test user assigned as the Caller. 2. Click **Request Identity Verification** and confirm the confirmation dialog appears before sending. 3. Confirm the test user receives the verification link by email. 4. Complete the verification session on a mobile device. 5. Return to the Incident record and confirm the **IDV Status** field updates to `Success` with a timestamp. > ⚠️ **Warning** > > If the IDV Status field does not update, confirm the webhook is registered correctly in Dashboard and that all six events are enabled. Verify the Signing Secret in ServiceNow matches the one in Dashboard. Check the ServiceNow **System Log** for any incoming webhook errors. > ⚠️ **Warning** > > If the verification email is not received, click **Send Test Email** on the Configuration page to verify SMTP delivery is working. Check your spam folder and confirm the From Address is authorized to send from your SMTP server. ***
          --- - Path: `ecosystem-workforce/shopify` - URL: https://developer.incode.com/ecosystem-workforce/shopify/ - Markdown: https://developer.incode.com/ecosystem-workforce/shopify.md # Shopify The Incode Age Verification for Shopify integration adds identity-based age verification to your Shopify checkout. When a customer attempts to purchase an age-restricted product, they are redirected to complete an Incode identity verification flow before their order can be placed. > 📘 **Note** > > This integration requires **Shopify Plus**. Checkout UI extensions are a Shopify Plus feature. *** ## Integration Flow 1. The merchant tags age-restricted products with `age-restricted` in Shopify Admin. 2. When a customer adds one of these products to their cart, the app detects it. 3. At checkout, a banner appears: **Identity Verification Required**. 4. The customer clicks **Verify with Incode** and completes the identity flow on their device. 5. On success, they are returned to checkout and can complete their purchase. 6. On failure, they see an error and cannot proceed. 7. All verification results—session ID, pass/fail, timestamp—are stored as order attributes for merchant audit. *** ## Prerequisites - Shopify Plus store - Incode account with API access - Your **Incode API Key** from Incode Dashboard > Settings > API Keys - Your **Incode Flow ID**, the onboarding flow configured for age verification - The Incode Age Verify app installed on your store *** ## Set Up the Shopify Integration ### Install the App Your Incode account manager provides an installation link. Click it and follow the Shopify OAuth prompts to install **Incode Age Verify** on your store. ### Configure Your Incode Credentials 1. In your Shopify Admin, go to **Apps > Incode Age Verify**. 2. On the settings page, enter: - **API Key**: Your Incode API key - **Flow ID**: The Incode onboarding flow ID for age verification - **Backend URL**: Provided by your Incode account manager (leave blank if unsure) 3. Click **Save Settings**. 4. The **Connection Status** badge should turn green: ✓ Connected. ### Enable the Theme Script This script detects age-restricted products and sets up cart attributes before checkout. 1. Go to **Online Store > Themes > Customize**. 2. In the left panel, click **App Embeds**. 3. Enable **Incode Age Verify**. 4. In the **Backend URL** field, enter the same backend URL from the previous set of steps. 5. Click **Save.** ### Tag Your Age-Restricted Products 1. Go to **Products** in your Shopify Admin. 2. Open each age-restricted product. 3. In the **Tags** field, add the tag: `age-restricted`. 4. Click **Save**. > ⚠️ **Warning** > > The tag must be exactly `age-restricted` (lowercase, hyphenated). Any product with this tag will trigger the verification flow at checkout. ### Confirm the Checkout Extension is Active 1. Go to **Settings > Checkout > Customize**. 2. Click the **Apps** section. 3. Confirm **Incode Age Verify** is listed and active. *** ## Test the Integration 1. Add an `age-restricted` tagged product to your cart. 2. Proceed to checkout. 3. Confirm the **Identity Verification Required** banner appears above the payment section. 4. Click **Verify with Incode**. Confirm you are redirected to the Incode verification flow. 5. Complete the verification on your mobile device. 6. Confirm you are returned to checkout with the **Identity verified with Incode—you're all set!** confirmation. 7. Complete the purchase. *** ## View verification records Every order placed through the verification flow includes the following in the **Additional details** section of the order in Shopify Admin: | Attribute | Description | | --------------------------- | ---------------------------------------------------------- | | `age_verification_required` | If verification was required (`true`/`false`) | | `age_verified` | If the customer passed verification (`true`/`false`) | | `age_verified_status` | `pass` or `fail` | | `age_verified_session` | Incode session reference ID (first 16 characters of token) | | `age_verified_at` | ISO timestamp when verification occurred | | `age_verified_by` | Always `incode` | *** ## Troubleshooting ### **Verification Banner Doesn't Appear at Checkout** Confirm the following: - The product has the `age-restricted` tag with exact spelling. - The theme app extension is enabled. - The app is installed: go to **Apps **> **Incode Age Verify** to confirm. If the banner still doesn't appear, clear your cart and re-add the product. The cart attribute sync occurs on page load. ### **Verify with Incode Button Does Nothing** The backend URL in the theme editor may be incorrect or the backend may be unreachable. Contact your Incode Representative to confirm the backend URL. ### **Verification Completes but Checkout Still Shows the Banner** Clear your browser cache and reload the checkout page. Confirm you are returning to the correct store URL after verification. ### **Identity Verification Failed Message** The customer did not pass the identity check. They can click **Try Again** to retry. If they choose not to verify, age-restricted items must be removed from the cart. *** ## Support For setup help or issues, contact your Incode Representative or email [integrations@incode.com](mailto:integrations@incode.com). --- - Path: `ecosystem-workforce/slack` - URL: https://developer.incode.com/ecosystem-workforce/slack/ - Markdown: https://developer.incode.com/ecosystem-workforce/slack.md # Slack You can add identity verification to Slack using the Incode app for Slack. After installing, employees and IT teams can request on-demand identity verification directly from Slack before sharing sensitive information, handling high-risk requests, or granting access to protected meetings. *** ## Prerequisites Ensure you have the following before you begin: - A Slack workspace where you have admin permissions to install apps. - Access to the Integrations page in Dashboard. Contact your Incode Representative if you do not see it. - Your Slack **Team ID.** *** ## Understand What the Incode Slack App Does The Incode app adds two slash commands to your Slack workspace: - `/incode`: Send an identity verification request to another Slack user. Both the sender and recipient can view verification results in real time. - `/incode-meeting`: Protect a Zoom meeting invite with identity verification. The recipient only receives the meeting link after passing verification. Requires a Zoom subscription. ### **Common Use Cases** - IT administrators verifying an employee's identity before handling an MFA reset or account lockout through Slack. - Finance and sales teams protecting wire transfer requests, contracts, or invoices before sending to recipients. *** ## Set Up Slack Integration ### Find Your Slack Team ID 1. Open your Slack workspace in a web browser using your workspace URL. After the page loads, the URL will be formatted as: `https://app.slack.com/client/TXXXXXXX/CXXXXXXX`. 2. Find your Team ID is the string beginning with `T`. For Enterprise Grid organizations, use the string beginning with `E`. ### Create the Integration in Dashboard 1. Log in to Dashboard. 2. In the left menu, click **Integrations**. 3. Click **New Integration**. 4. From the Productivity tab, click **Slack**, then click **Continue**. 5. Enter an **Integration Name**. 6. Enter your **Team ID** and click **Save**. 7. Click **Install Workforce App in Slack** to proceed to the Slack authorization flow. ### Install the App in Your Slack Workspace Follow the prompts to grant the Incode app access to your Slack workspace. ![](https://developer.incode.com/assets/1ab4dde535aef75f6e7d3221a9f8e13c.png) *** ## Test the Integration Use the `/incode` and `/incode-meeting` commands in a Slack direct message to confirm the integration is working.


          --- - Path: `ecosystem-workforce/student-information-system-integrations` - URL: https://developer.incode.com/ecosystem-workforce/student-information-system-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/student-information-system-integrations.md # Student Information System Integrations Student Information System (SIS) integrations embed Incode identity verification into the platforms used by higher education institutions and K-12 organizations to manage student records, enrollment, and access to academic resources. They are designed for use cases where confirming a student's or applicant's identity is required, such as remote exam
          proctoring, financial aid verification, transcript requests, or new student enrollment. When a student or applicant triggers a verification-required action, the SIS platform initiates an Incode verification session. The student scans their government-issued ID and completes a liveness check on their device. The result is returned to the SIS platform to gate access or progress the workflow. > 📘 **Note** > > Student information system integrations are on the Incode roadmap. If you are a higher education institution or EdTech provider looking to integrate Incode with your SIS platform, contact your Incode Representative to discuss your use case and timeline. *** ## Platforms on the Roadmap The following platforms are planned for integration: | Platform | Use case | | --------------------------- | -------------------------------------------------------------------------------------------------------------------------- | | Ellucian Banner / Colleague | Identity verification for student enrollment, financial aid, and transcript access across US higher education institutions | | Instructure Canvas | Exam access gating through Learning Tools Interoperability (LTI) integration for online and hybrid learning environments | | Oracle Student Cloud | Identity proofing for student lifecycle events across large university systems | | PowerSchool | Parent and guardian identity verification for K-12 institutions |
          --- - Path: `ecosystem-workforce/tines` - URL: https://developer.incode.com/ecosystem-workforce/tines/ - Markdown: https://developer.incode.com/ecosystem-workforce/tines.md # Tines Automation Tines is a security and workflow automation platform that uses a straightforward graphical design process to automate tasks. Incode is an AI-powered identity verification platform that uses government-issued photo IDs and biometric matching to verify a person's identity over the Internet. It is built for workforce, financial, and enterprise use cases. Tines' ability to work with APIs, combined with the Incode Workforce API, is the simplest way to add automated biometric identity verification to your security workflows, HR pipelines, or customer onboarding processes. This article assumes you have some familiarity with Tines and no familiarity with Incode. For an introduction to Tines, see [Tines University](https://www.tines.com/university). *** ## Collect Your Incode Credentials You need three things from Incode to configure Tines: - An API key (`*API_KEY*`) - An integration ID (`*INTEGRATION_ID*`) - An integration secret (`*INTEGRATION_SECRET*`) To retrieve these values: 1. Open [Dashboard](https://dashboard.incode.com) and log in. 2. Go to **Settings > API Keys** in the left menu. 3. Select **Create new API key**. 4. Enter a descriptive name such as `tines-integration`. 5. Copy the generated key. This is your `*API_KEY*`. 6. Go to **Integrations** in the left menu. 7. Select the integration you want to use or create a new one. 8. From the integration detail page, copy the **Integration ID** and **Integration Secret**. These are your `*INTEGRATION_ID*` and `*INTEGRATION_SECRET*`. > 📘 **Note** > > If you are using Incode's sandbox environment, your API base URL will be `https://demo-api-incode-id.incodesmile.com`. For production, use the base URL provided by your Incode Representative. *** ## Add Credentials to Tines 1. Go to Tines and click **Credentials** in the left menu. 2. Add `*API_KEY*` as a **Text Credential** named `incode_x_api_key`. Add `incodesmile.com` in the **Domains** field. 3. Add `*INTEGRATION_ID*` as a **Text Credential** named `incode_workforce_integrationid`. Leave **Domains** blank. 4. Add `*INTEGRATION_SECRET*` as a **Text Credential** named `incode_workforce_secret`. Leave **Domains** blank. All three credentials are entered as **Text** credentials and will look like this in the Tines Credentials panel: | Name | Type | Domains | | -------------------------------- | ---- | ----------------- | | `incode_x_api_key` | Text | `incodesmile.com` | | `incode_workforce_integrationid` | Text | — | | `incode_workforce_secret` | Text | — | *** ## Set Up Tines Actions The steps below configure Tines to: 1. Authenticate with the Incode API to get a session token. 2. Generate a personalized verification link for the customer. 3. Deliver that link to the customer. 4. Wait for a webhook from Incode when the user completes verification. 5. Validate the webhook and use the result. ### Authenticate with Incode Before you can generate a verification link, the Incode API requires a short-lived session token obtained through a server-side authentication call. This token is used as the `x-auth-token` header in subsequent requests. 1. Drag the **HTTP Request** action into your story from the sidebar and configure it as follows: - **Name**: `GetIncodeToken` - **URL**: `https://demo-api-incode-id.incodesmile.com/v1/integration/authorize/server` - **Content type**: JSON - **Method**: `POST` - **Headers**: ```text x-api-key: {user.CREDENTIAL.incode_x_api_key} ``` - **Payload:** ```text { "integrationId": "<>", "secret": "<>" } ``` In the **Editor** view on the right side of the Tines workspace, this looks like: ```json { "url": "https://demo-api-incode-id.incodesmile.com/v1/integration/authorize/server", "content_type": "application_json", "method": "post", "headers": { "x-api-key": "<>" }, "payload": { "integrationId": "<>", "secret": "<>" } } ``` 2. Select **Play** on this action. The events window should show a successful response from Incode: ```json { "token": "eyJhbGci....", "expiresAt": 1714512000 } ``` The `token` field is the session token. It is short-lived, so this action should run at the beginning of each story run. Don't store it for reuse across separate executions. ### Generate a Verification Link Now that you have a session token, you can generate a personalized, time-limited verification link for the end-user. 1. Drag another **HTTP Request** action into your story and configure it as follows: - **Name**: `GenerateVerificationLink` - **URL**: `https://demo-api-incode-id.incodesmile.com/v1/workforce/verification/candidate/generate-verification-link` - **Content type**: JSON - **Method**: `POST` - **Headers:** ```text x-auth-token: <> ``` - **Payload**: ```json { "integrationID": "<>", "secret": "<>", "loginHint": "<>", "loginHintType": "EMAIL", "validityMinutes": 4320, "redirectUrl": "https://your-company.com", "givenNames": "<>", "lastName": "<>" } ``` 2. Replace `<>`, `<>`, and `<>` with the Tines variables from wherever you collect the user's information earlier in your story: for example, from a web form, a webhook payload, or a previous API call. 3. The `validityMinutes` field controls how long the verification link stays active. `4320` equals 72 hours, which is a sensible default for most workflows. Adjust this to suit your use case. In the **Editor** view, this looks like: ```json { "url": "https://demo-api-incode-id.incodesmile.com/v1/workforce/verification/candidate/generate-verification-link", "content_type": "application_json", "method": "post", "headers": { "x-auth-token": "<>" }, "payload": { "integrationID": "<>", "secret": "<>", "loginHint": "<>", "loginHintType": "EMAIL", "validityMinutes": 4320, "redirectUrl": "https://your-company.com", "givenNames": "<>", "lastName": "<>" } } ``` 4. Select **Play** on this action. The response from Incode looks like: ```json { "verificationLink": "https://verify.incode.com/x/acme/abcd1234xyz", "verificationTraceId": "f78ee334-79a8-4a5e-be4a-d728e226df64" } ``` The two key fields are: - `verificationLink`: The URL you will send to the customer so they can complete biometric verification. - `verificationTraceId`: A unique identifier for this verification session. **Store this value.** You will use it later to match the Incode webhook callback to this specific verification request ### Deliver the Verification Link Tines offers many methods to deliver data to end-users. Any of them will work for delivering this link: email, Slack, SMS, or a redirect from a Tines page. To demonstrate the flow, we use email delivery. If your story has already collected the user's email address from a form or upstream system, skip the form step. **Collect the User's Email** 1. If you need to collect the user's details first, select **+ / Tools** on the left of your Tines workspace. 2. Drag a **Page** object onto your workspace. 3. Name the page `Request Identity Verification`. 4. Add input fields for the user's email address, first name, and last name. **Send the Email** 1. Drag the **Send Email** action from the sidebar onto your workspace and configure it as follows: - **Recipients**: `<>` (or `<>` if using a Tines form) - **Reply to**: Your team's support email address - **Sender name**: Your company or team name - **Subject**: `Your identity verification request from *COMPANY*` - **Body**: Write a message explaining the purpose of the verification. Include the link using the Tines variable `<>`. For example: ``` Hi <>, Please complete your identity verification by clicking the link below. The process takes less than 5 minutes and requires a government-issued photo ID and a quick facial scan. Verify your identity: <> This link expires in 72 hours. If you have any questions, reply to this email and our team will be happy to help. ``` 2) Connect the actions in your story so they run in this order: `GetIncodeToken` → `GenerateVerificationLink` → `Send Email`. 3) To test the flow, run the story and confirm the email arrives with a working verification link. ### Set Up the Incode Webhook Incode can POST a signed message to a pre-defined HTTP endpoint when an end-user completes or fails verification. This is how you receive the result back into your Tines story. **Create the Webhook Action in Tines** 1. Go to your Tines story and drag a **Webhook Action** into your workspace. 2. Select it to edit. 3. Set **Allowed verbs** to `POST` only. 4. Select **Copy** next to the **Webhook URL** to copy it. This is the `*DELIVERY_URL*` you will register in Incode. **Register the Webhook in Incode** 1. Open [Dashboard](https://dashboard.incode.com)​. 2. Go to **Configuration** > **Webhooks**. 3. Select your integration and open the **Webhooks** tab. 4. Select **Add Webhook** and configure it as follows: | Field | Value | | ------------ | ------------------------------------------------ | | Delivery URL | Paste the `*DELIVERY_URL*` you copied from Tines | | Events | `verification.succeeded`, `verification.failed` | | Enabled | Toggle on | 5. Save the webhook. Incode will now POST an event to your Tines story each time a user completes or fails a verification session on this integration. **Name the Webhook Action** Back in Tines, rename the Webhook Action to `IncodeStatusWebhook` to make it easy to reference in downstream actions. ### Validate the Webhook in Tines When Incode posts a verification result to your Tines story, the webhook body looks like this: ```json { "event_type": "verification.succeeded", "data": { "verification_trace_id": "f78ee334-79a8-4a5e-be4a-d728e226df64", "failure_reason": null, "ip": "203.0.113.42", "user_name": "Jane Smith", "latitude": 37.7749, "longitude": -122.4194 } } ``` The `verification_trace_id` in the callback matches the `verificationTraceId` you received when you generated the link. This is how you confirm that this callback belongs to the verification session you initiated. **Create a Trigger Action** 1. Drag a **Trigger Action** into your story. 2. Configure a rule that checks the incoming `event_type` and passes only events for successfully completed verifications: ```json { "rules": [ { "type": "field==value", "value": "verification.succeeded", "path": "<>" } ] } ``` This ensures that the rest of your story only runs when verification succeeds. To handle failures separately, add a second Trigger Action with `"value": "verification.failed"` and connect it to a different branch. **Confirm the Trace ID** If your story initiated the verification session and stored the `verificationTraceId`, you can add a second Trigger Action to confirm the callback matches the session you expect: ```json { "rules": [ { "type": "field==value", "value": "<>", "path": "<>" } ] } ``` > 📘 **Note** > > In asynchronous workflows where the verification link is sent and the result arrives in a separate story run, use Tines Records to store the `verificationTraceId` alongside any relevant identifiers—such as a user ID or opportunity ID—when the link is generated. Then look up that record using the incoming `verification_trace_id` when the callback arrives. See [Tines Records documentation](https://www.tines.com/docs/records) for details. ### Use the Verification Result The `data` object in the webhook payload contains the following fields: | Field | Description | | ------------------------ | --------------------------------------------------------------------- | | `verification_trace_id` | Unique ID for this verification session | | `failure_reason` | Reason for failure if verification did not succeed; `null` on success | | `ip` | IP address of the device used for verification | | `user_name` | Name of the person as verified by Incode | | `latitude` / `longitude` | Approximate geolocation of the device at verification time | Here are some examples of how you can use this data in Tines: - **ATS integration**: Use an HTTP Request action to add a `biometric-verified` tag and post a note to the candidate's profile in your applicant tracking system: for example, Lever, Greenhouse, or Workday. - **IT provisioning**: Trigger an account creation or password reset workflow after identity is confirmed, combining the verified name with a lookup in your corporate directory. - **Access control**: Update a record in your IAM or HRIS system to reflect that this person has completed biometric verification. - **Helpdesk escalation**: Send the verified identity details to a Slack channel or a support ticket so an agent can take over with confidence. - **Audit log**: Write the `verification_trace_id`, verified name, IP, and timestamp to a Tines Record or external data store for compliance. To display the result for testing: 1. Drag a **Page** object onto your workspace. 2. Set the **Page behavior** to **Show success message**. 3. Set the success message to: ``` Identity verification complete. Verified name: <> Trace ID: <> Processed: <> ``` *** ## Summary At the end of these steps, your Tines story will consist of two connected flows: ### **Flow 1: Send Verification** ``` [Collect user details] → [GetIncodeToken] → [GenerateVerificationLink] → [Send Email] ``` ### **Flow 2: Receive Result** ``` [IncodeStatusWebhook] → [Check event_type] → [Use verified data] ``` This story shows how to use the Incode Workforce API in Tines to verify any user's identity and feed the result back into any downstream system Tines can reach. --- - Path: `ecosystem-workforce/transunion` - URL: https://developer.incode.com/ecosystem-workforce/transunion/ - Markdown: https://developer.incode.com/ecosystem-workforce/transunion.md # TransUnion TransUnion IDVision and TLOxp provide device intelligence, phone and email risk signals, and identity graph data used by financial institutions and insurance companies during onboarding and fraud investigations. The Incode x TransUnion integration pairs Incode biometric and document verification with TransUnion data-based identity signals to produce a composite IDV score. This is particularly relevant for lenders who need to verify that: - The person is who they claim to be. - The identity itself is not synthetic or fraudulent. TransUnion's coverage across insurance and healthcare also expands the use case beyond banking, making this integration applicable across a broader range of regulated industries. *** ## Availability This integration is available through the TransUnion developer API program and technology alliance track. It is also available through the Incode OEM and MSP partner program. Contact your Incode Representative to get started. --- - Path: `ecosystem-workforce/video-conferencing-integrations` - URL: https://developer.incode.com/ecosystem-workforce/video-conferencing-integrations/ - Markdown: https://developer.incode.com/ecosystem-workforce/video-conferencing-integrations.md # Video Conferencing Integrations Video conferencing integrations add identity verification as a gating step before participants can join a meeting or video call. They are designed for use cases where confirming a participant's identity before granting access is required, such as regulated meetings, high-stakes interviews, and remote notarization. Incode supports any video conferencing platform that exposes a joinable meeting URL, including Zoom, Microsoft Teams, Cisco Webex, and Google Meet. *** ## Video Conferencing Flow 1. The organizer creates the meeting in their video conferencing platform and copies the meeting URL. 2. In Dashboard, the organizer opens the Candidate Verification screen, selects **Protect meeting with Incode**, and pastes the meeting URL. ![](https://developer.incode.com/assets/4f9e86911f72d40e5b39e00cc269c556.png) 3. Incode generates a verification link that can be shared with the participant via any channel: email, SMS, or copy-paste. 4. When the participant clicks the link, they are directed to Incode to complete identity verification. 5. If verification succeeds, Incode forwards the participant to the original meeting URL. 6. If verification fails, the participant cannot access the meeting. *** ## Protect a Meeting with Incode 1. Log in to Dashboard. 2. Go to **Candidate Verification**. 3. Select the candidate from the dropdown or add a new candidate. 4. Under **Verification method**, select **Protect meeting with Incode**. 5. Paste the meeting URL: for example, `https://your-org.zoom.us/j/...` or `https://teams.microsoft.com/l/meetup-join/...`. 6. Set the link validity period. 7. Click **Generate Verification & Copy Link**. 8. Share the generated verification link with the participant. *** ## Supported Platforms The Protect Meeting with Incode feature works with any video conferencing platform that accepts a joinable meeting URL, including: - Zoom - Microsoft Teams - Cisco Webex - Google Meet - GoTo Meeting - BlueJeans > 📘 **Note** > > Native platform integrations—such as Zoom App Marketplace listings, Microsoft Teams app store listings, and Webex App Hub listings—are on the Incode roadmap. Contact your Incode Representative for timeline
          details.
          --- - Path: `ecosystem-workforce/workday` - URL: https://developer.incode.com/ecosystem-workforce/workday/ - Markdown: https://developer.incode.com/ecosystem-workforce/workday.md # Workday This page covers everything a developer needs to deploy the Incode x Workday Identity Verification (IDV) middleware integration (v1 Lite). When a new hire is created in Workday, this integration automatically sends them an Incode identity verification link. When they complete the scan, the result is written back to Workday as a Government ID record. *** ## **Integration Flow** 1. Workday Hire business process fires an HTTP callout → `POST /trigger`. 2. Middleware authenticates with Incode, creates an IDV session, and returns the verification URL. 3. Workday delivers the URL to the employee. 4. The employee completes ID scan in Incode. 5. Incode fires a webhook → `POST /webhook`. 6. Middleware exchanges refresh token for a Workday OAuth token, then writes the IDV result via SOAP `Change_Government_IDs`. *** ## **Tech Stack** - Node.js/Express (3 endpoints: `POST /trigger`, `POST /webhook`, `GET /health`) - Incode OAuth2 `client_credentials` flow - Workday OAuth2 `refresh_token` grant (ISU machine-to-machine) - Workday SOAP API v43.0: Human\_Resources web service *** ## Prerequisites ### Incode | Item | Notes | | ------------------------ | ----------------------------------------------------- | | B2B onboarding enabled | Required on your Incode tenant | | OAuth2 API Client | `client_credentials` grant: save Client ID and Secret | | API Key | From Dashboard | | Integration Reference ID | From Dashboard: identifies the workflow | | Auth URL | `https://auth.demo.incode.com/oauth2/token` (demo) | | API URL | `https://demo-api.incodesmile.com` (demo) | > ⚠️ Warning > > All session creation calls require the header `api-version: 1.0`. Without it, the API returns `406 Not Acceptable`. ### Workday **Create an Integration System User (ISU)** 1. Search Workday for **Create Integration System User**. 2. Enter a **Name**: for example, `Incode_IDV_ISU`. 3. Check **Do Not Allow UI Sessions**. 4. Save. **Create a Security Group and Assign Domain Permissions** 1. Search Workday for **Create Security Group** and select the type Integration System Security Group. 2. Enter a **Name**: for example, `Incode IDV Integration`. 3. Add `Incode_IDV_ISU` as a member. 4. Search Workday for **Maintain Permissions for Security Group** and select `Incode IDV Integration`. 5. Under **Domain Security Policy Permissions**, add: | Domain | Access | | ---------------------------- | ----------- | | `National ID Identification` | Get and Put | 6. Under **Business Process Security Policy Permissions**, add: | Business Process | Permission Type | | ----------------------- | ----------------- | | `Change Government IDs` | Initiating Action | 7. Save. 8. Search Workday for **Activate Pending Security Policy Changes**. 9. Submit. **Register an API Client for Integrations** 1. Search Workday for **Register API Client for Integrations**. 2. Enter a **Client Name**: for example, `Incode IDV Client`. 3. Set **Non-Expiring Refresh Tokens** to **Yes**. 4. Save. 5. Copy the **Client ID** and **Client Secret**. **Generate a Refresh Token** 1. Search Workday for **Manage Refresh Tokens for Integrations**. 2. Select the ISU, then click **Generate New Refresh Token**. 3. Copy the token value. **Configure the Hire Business Process HTTP Callout** In the Hire business process, add an Integration step that POSTs to `/trigger` with this body: ```json { "workerID": "{{Employee_ID}}", "fullName": "{{Legal_Name}}", "personalEmail": "{{Personal_Email}}", "tenantURL": "https://impl.wd12.myworkday.com/ccx/service/your_tenant", "workdayClientId": "{{Client_ID}}", "workdayClientSecret": "{{Client_Secret}}", "workdayRefreshToken": "{{Refresh_Token}}", "integrationReference": "{{Integration_Reference_ID}}", "linkValidityMinutes": 1440 } ``` *** ## Environment Variables ```bash # Incode INCODE_CLIENT_ID= INCODE_CLIENT_SECRET= INCODE_AUTH_URL=https://auth.demo.incode.com/oauth2/token INCODE_API_URL=https://demo-api.incodesmile.com INCODE_API_KEY= INCODE_INTEGRATION_REFERENCE= LINK_VALIDITY_MINUTES=1440 # Workday WORKDAY_TENANT=your_tenant_name WORKDAY_CLIENT_ID= WORKDAY_CLIENT_SECRET= WORKDAY_REFRESH_TOKEN= WORKDAY_ISU_USERNAME=Incode_IDV_ISU AUTO_COMPLETE=true # Middleware PORT=3000 WEBHOOK_SECRET= # optional — for HMAC signature validation ``` *** ## API Endpoints ### `POST /trigger` Receives the Workday callout. Creates an Incode IDV session and returns the verification URL. **Request Body** ```json { "workerID": "12345", "fullName": "Jane Doe", "personalEmail": "jane@example.com", "tenantURL": "https://impl.wd12.myworkday.com/ccx/service/mytenant", "workdayClientId": "...", "workdayClientSecret": "...", "workdayRefreshToken": "...", "integrationReference": "...", "linkValidityMinutes": 1440 } ``` **Response** ```json { "url": "https://incode.me/verify/..." } ``` ### `POST /webhook` Receives Incode `SESSION_SUCCEEDED` events. If `WEBHOOK_SECRET` is set, validates the HMAC-SHA256 signature (header: `x-incode-signature`). Looks up the session context by `externalCustomerId`, fetches a fresh Workday OAuth token, then writes `Change_Government_IDs` via SOAP. ### `GET /health` Returns `{ "status": "ok" }`. Use for load balancer health checks. *** ## Deployment ### **Local Testing with Ngrok** ```bash npm install cp .env.example .env # fill in all values node src/index.js # In a second terminal: ngrok http 3000 # Use the ngrok HTTPS URL as your Incode webhook endpoint ``` ### Production ```bash npm install --production NODE_ENV=production node src/index.js ``` Deploy behind a reverse proxy (nginx / AWS ALB) with TLS termination. The service is stateless except for the in-memory session store. For production, replace `sessionStore` with Redis. *** ## National ID Type Code Mapping Workday `National_ID_Type_Code` values are country-specific, formatted as `{ISO3166Alpha3}-{Suffix}`. The middleware auto-derives codes from the issuing country and document type returned by Incode OCR. Common mappings are as follows: | Incode document type | Issuing country | Workday code | | -------------------- | --------------- | ------------ | | `passport` | IN (India) | `IND-PAS` | | `passport` | JP (Japan) | `JPN-PAS` | | `passport` | BY (Belarus) | `BLR-PAS` | | `national_id` | US | `USA-SSN` | | `national_id` | MX | `MEX-CURP` | | `passport` | US | `USA-SSN` | For country-specific exceptions, add entries to `COUNTRY_DOC_OVERRIDES` in `src/utils/documentTypeMap.js`. *** ## Workday SOAP: Critical Notes | Topic | Detail | | ---------------------- | ----------------------------------------------------------------------------------------------- | | OAuth token placement | Bearer token in HTTP `Authorization` header, **not** in WS-Security SOAP header | | Services host | Sandbox: `impl-services1.wd12.myworkday.com` (different from UI host `impl.wd12.myworkday.com`) | | SOAP endpoint | `https://{services-host}/ccx/service/{tenant}/Human_Resources/v43.0` | | Person reference | Use `Person_Reference` (not `Worker_Reference`) inside `Change_Government_IDs_Data` | | Verification date | `xsd:date` format, `YYYY-MM-DD` only, no time component | | Country reference type | `ISO_3166-1_Alpha-2_Code` | | ID type reference | `National_ID_Type_Code` | | Replace\_All | Set to `false` to preserve existing IDs | *** ## Troubleshooting | Error | Cause | Fix | | ---------------------------------------------------- | ----------------------------------- | -------------------------------------------------------------- | | Incode `invalid_client` | Wrong client secret | Re-paste `INCODE_CLIENT_SECRET` directly, do not retype | | Incode `406 Not Acceptable` | Missing `api-version` header | Add `api-version: 1.0` to session creation request | | Incode `Employee by login factor cannot be found` | Email not in Incode | Use an email that exists in the Incode tenant | | Workday 404 on token endpoint | Wrong host | Use services host, not UI host | | Workday `invalid_client` (OAuth) | Misread client ID/secret | Paste directly from Workday, don't retype | | Workday `invalid username or password` | Tenant has disabled SOAP Basic Auth | Switch to OAuth `refresh_token` grant | | SOAP `The task submitted is not authorized` | Missing BP security policy | Add ISU group to `Change Government IDs` BP Initiating Actions | | SOAP `Invalid Subelement Worker_Reference` | Wrong SOAP schema | Use `Person_Reference` inside `Change_Government_IDs_Data` | | SOAP `PASSPORT is not a valid National_ID_Type_Code` | Generic codes don't exist | Use country-specific code e.g. `IND-PAS` | | SOAP `Invalid ID type Country_ID` | Wrong type attribute | Use `ISO_3166-1_Alpha-2_Code` | *** ## Go-Live Checklist ### **Incode** - [ ] OAuth client created, credentials saved - [ ] API key configured - [ ] Integration Reference ID confirmed - [ ] Webhook URL registered pointing to `/webhook` - [ ] `WEBHOOK_SECRET` set and matches Incode dashboard ### **Workday** - [ ] ISU created with "Do Not Allow UI Sessions" - [ ] Security group created, ISU assigned - [ ] Domain permission: `National ID Identification`—Get and Put - [ ] BP policy: `Change Government IDs`—Initiating Action - [ ] Security policy changes activated - [ ] API Client registered, Client ID and Secret saved - [ ] Refresh token generated and saved - [ ] Hire BP HTTP callout configured with correct field mapping **Middleware** - [ ] All env vars populated - [ ] `/health` returns `{ status: 'ok' }` - [ ] `/trigger` tested manually—returns IDV URL - [ ] `/webhook` tested with sample payload—writes to Workday - [ ] TLS enabled on public endpoint - [ ] Session store replaced with Redis for production
          --- - Path: `ecosystem-workforce/workday-recruiting` - URL: https://developer.incode.com/ecosystem-workforce/workday-recruiting/ - Markdown: https://developer.incode.com/ecosystem-workforce/workday-recruiting.md # Workday Recruiting This page covers Incode's identity verification integration with Workday. The integration uses facial biometrics, document authentication, and fraud detection to verify candidates during the hiring process. *** ## Workday Studio Integration Incode provides a prebuilt Workday Studio integration package. It includes three independent Studio integrations, each covering a specific part of the onboarding and verification lifecycle: - **eKYC Integration (INT00N\_eKYC\_Candidates\_Incode)**:** **Securely sends candidate data from Workday to Incode for
          electronic Know Your Customer (eKYC) checks and writes results back. - **IDV Integration (INT00N\_IDV\_Candidates\_Incode)**: Retrieves biometric and document verification results from Incode and writes them into Workday. - **Email Delivery Integration (INT00N\_Onboarding\_Email\_Incode)**: Sends personalized onboarding URLs and verification links to candidates using Workday's notification framework. Each integration is delivered as a Workday Studio project file ready for deployment. They are modular; you don't need to use both eKYC and IDV together. *** ## eKYC Integration The `INT00N_eKYC_Candidates_Incode` integration sends candidate profile data from Workday to Incode for eKYC checks. Results are returned to Workday and stored on the candidate's **Incode Details** tab. You can place this integration at any of the following hiring stages: Assessment, Background Check, Offer, or Pre-Hire. This integration: - Extracts candidate demographic data from Workday. - Sends the data securely to the Incode verification API. - Retrieves risk scores, verification statuses, and supporting metadata. - Updates the candidate's **Incode Details** tab in Workday.
          *** ## Email Delivery Integration The `INT00N_Onboarding_Email_Incode` integration sends onboarding URLs and verification links to candidates using Workday's notification framework. You can place it at the Assessment, Background Check, Offer, or Hire stage. This integration supports: - Automated delivery of individualized onboarding URLs to candidates. - Customizable email templates using Workday's notification framework. - Flexible placement within hiring business processes.
          ### **Onboarding Notification Template** The notification template lets HR and Talent Acquisition teams send candidates clear, personalized instructions. Using this template, you can: - Personalize message content. - Include dynamic fields. - Embed the onboarding URL. - Align with organizational branding. > 📘 **Note** > > You can use a custom BP Notification Template to align notifications with your company's communication standards. *** ## IDV Integration The `INT00N_IDV_Candidates_Incode` integration retrieves biometric and document verification results from Incode and writes them into Workday. It retrieves IDV results on a scheduled basis: hourly, daily, or as configured. This integration: - Opens candidate sessions with document and biometric submissions. - Extracts verification attributes such as: - Document authenticity validations - Biometric (facial match) scores - Fraud indicators - Session timestamps and metadata
          *** ## eKYC Custom Object The eKYC custom object stores identity verification data returned from Incode. It holds: - Verification outcomes - Risk categorization details - Identity validation notes - Incode session references This object supports downstream consumption in reports, dashboards, audits, and compliance checks.
          *** ## IDV Custom Object The IDV custom object stores document verification and biometric results from Incode. It holds: - Document inspection results (authenticity, tampering indicators) - Biometric comparison metrics (face match scores, liveness checks) - Risk indicators derived from Incode's scoring engine - Reference keys for reconciliation and traceability ![](https://developer.incode.com/assets/7487f389b6ce567c330191b5bb9b5507.png) Figure 5.1: Custom Object for the IDV Details
          *** ## Integration Architecture Data flows through the following pattern: ``` Workday → Workday Studio → Incode REST APIs → Workday Studio → Workday Custom Objects ``` The integration uses the following security measures: - All data exchanged between Workday and Incode is encrypted over HTTPS. - Authentication uses API keys stored securely in Workday's Integration System Credentials. - Logging, retries, and exception tracing are built into the Studio integrations.
          --- - Path: `features-and-modules/advanced-electronic-signature` - URL: https://developer.incode.com/features-and-modules/advanced-electronic-signature/ - Markdown: https://developer.incode.com/features-and-modules/advanced-electronic-signature.md # Advanced Electronic Signature The Advanced Electronic Signature module shows the user documents to sign, collects their consent, and captures a certificate-backed electronic signature. That digital certificate verifies their identity, making the signed document legally binding and compliant. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works When the Advanced Electronic Signature module runs, the end user is presented with the documents requiring their signature. The module walks the user through a structured consent flow before the signature is finalized. By default, the module: - Displays the documents to be signed, with an option to view each document before proceeding. - Presents a legal consent screen with required checkboxes, collecting explicit informed consent from the user. - Finalizes the signature using a digital certificate, ensuring cryptographic integrity and non-repudiation. - Confirms successful signing with a success state at the end of the flow. An Advanced Electronic Signature (AES) differs from a basic electronic signature in that it is backed by a digital certificate and requires verified identity before signing. This gives the signed document stronger legal weight and makes it suitable for compliance-driven use cases. The module can also be configured to: - Allow the user to upload the document they want signed. - Allow the user to download or save the signed document after completion. - Skip specific verification requirements, such as identity score validation, ID verification, face recognition, or one-time password (OTP). ## Use Advanced Electronic Signature For instructions on implementing and configuring Advanced Electronic Signature on each supported platform, use the following pages: - [Advanced Electronic Signature (Dashboard)](dashboard-platform-administration/advanced-electronic-signature-dashboard-1/) - [AES (iOS)](/sdk-reference/module-aes/) - [AES (Android)](/sdk-reference/android-aes-advanced-electronic-signature) - [Electronic Signature Module (Web SDK)—includes Advanced Electronic Signature](/sdk-reference/web-sdk-2-module-electronic-signature/) - [AES (React Native)](/sdk-reference/react-native-modules/#aes) - [AES (Flutter)](/sdk-reference/flutter-modules/#aes-advanced-electronic-signature) --- - Path: `features-and-modules/antifraud-check` - URL: https://developer.incode.com/features-and-modules/antifraud-check/ - Markdown: https://developer.incode.com/features-and-modules/antifraud-check.md # Antifraud Check This module compares the current Session with existing Sessions and customers to detect anomalies that could be signs of fraud. ## Integrations ❌ Web | ✅ iOS | ❌ Android ## How It Works The Antifraud Check module detects potential identity fraud during Onboarding by comparing a new user's session against prior sessions and known identities. It spots suspicious patterns such as: - The same person trying to enroll under different details. - Different people reusing the same identity information. It combines biometric similarity and document similarity to produce an overall outcome. Based on what it finds and your risk tolerance settings, it then passes the user through, flags the session for manual review, or treats it as likely fraud. ## Use Antifraud Check For instructions on implementing and configuring Antifraud Check on each supported platform, use the following pages: - [Antifraud Check (Dashboard)](/dashboard-platform-administration/antifraud-check-dashboard/) - [Antifraud (iOS)](/sdk-reference/module-antifraud/) - [Antifraud (Android)](/sdk-reference/android-antifraud/) - [Antifraud Module (Web SDK)](/sdk-reference/web-sdk-2-module-antifraud/) - [Antifraud (React Native)](/sdk-reference/react-native-modules/#antifraud) - [Antifraud (Flutter)](/sdk-reference/flutter-modules/#antifraud) - [Antifraud (Cordova)](/sdk-reference/cordova-modules/#addantifraud) --- - Path: `features-and-modules/b2b-request-new-onboarding-api` - URL: https://developer.incode.com/features-and-modules/b2b-request-new-onboarding-api/ - Markdown: https://developer.incode.com/features-and-modules/b2b-request-new-onboarding-api.md # B2B – Request New Onboarding API This API allows a B2B client to start a new onboarding session for a specific user under a specific integration. The API returns a generated onboarding link that can be delivered to the end user. The API is authenticated using an **OAuth 2.0 Client Credentials** access token. ## Security Model The B2B Request New Onboarding API uses the **OAuth 2.0 Client Credentials** grant type — a server-to-server authentication pattern intended for trusted backend systems. Unlike the Authorization Code flow, this grant does not involve a user-facing login step. Instead, your server authenticates directly using a `client_id` and `client_secret` to obtain an access token, which is then used to authorize API requests. A **Client Credentials integration** is created automatically for organizations that have **Integration Ecosystem** enabled. ## Find the Client ID & Client Secret To view the integration details in Dashboard: 1. In the left navigation, go to **Integrations**. 2. On the Custom tab, click **Default client credentials integration**. ![](https://developer.incode.com/assets/85bb51f40ccec55990ff23024c4390b5.png) 3. Copy the Client ID to use in the access token request. 4. Click **Generate** to create the Client Secret. Copy it to use in the access token request. The secret is shown and copyable **only once**. Store it securely in a secrets manager or vault. If lost, you must generate a new one. ## Step 1: Obtain an Access Token Before calling the B2B onboarding endpoint, your backend must obtain a Bearer token from the Incode authorization server using the Client Credentials grant. **Endpoint**: `POST {auth-server-url}/oauth2/token` **Environment URLs** | Environment | Auth Server URL | | ----------------- | ------------------------------ | | Demo | `https://auth.demo.incode.com` | | SaaS / Production | `https://auth.incode.com` | **Request Parameters** | Parameter | Value | Notes | | --------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------- | | `grant_type` | `client_credentials` | | | `client_id` | `{client_id}` | [Find the Client ID](/features-and-modules/b2b-request-new-onboarding-api#find-the-client-id-client-secret) | | `client_secret` | `{client_secret}` | [Generate the Client Secret](/features-and-modules/b2b-request-new-onboarding-api#find-the-client-id-client-secret) | | `scope` | `openid` | | **Example Request** ```bash curl -X POST {auth-server-url}/oauth2/token \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=client_credentials" \ -d "client_id={client_id}" \ -d "client_secret={client_secret}" \ -d "scope=openid" ``` A successful response returns an `access_token` to be used as a Bearer token in Step 2. ## Step 2: Call the B2B Request New Onboarding Endpoint Use the access token obtained in Step 1 to call the onboarding endpoint. **Endpoint**: `POST {base-api-url}/omni/b2b/onboarding/request-new` **Environment URLs** | Environment | Base API URL | | ----------------- | ---------------------------------- | | Demo | `https://demo-api.incodesmile.com` | | SaaS / Production | `https://saas-api.incodesmile.com` | ### Headers * `Authorization: Bearer ` * `Content-Type: application/json` * `x-api-key: {api_key}` ### Request Body | Field | Required | Description | Example | |-------|----------|-------------|---------| | `integrationReference` | ✅ Yes | Unique identifier of the integration, as configured in Incode Dashboard. | `"int_b2b_prod_001"` | | `loginHint` | ✅ Yes | User identifier (email, username, phone, etc.).

          Employee-based integrations:
          • An existing employee record with the provided `loginHint` must already exist.
          • If no matching employee is found, the request will fail.

          Candidate-based integrations:
          • If no existing candidate is found with the provided `loginHint`, a new candidate will be created automatically. | `"john.doe@clientcompany.com"` | | `notification` | ✅ Yes | Notification configuration object. | See below | | `notification.type` | ✅ Yes | Must be `SMS`, `EMAIL`, or `URL`. | | | `notification.email` | Conditional | Required if `type` is `EMAIL`. | `"john.doe@clientcompany.com"` | | `notification.phone` | Conditional | Required if `type` is `SMS`. | `"+14155552671"` | | `applicantId` | Optional | This should only be provided when requesting onboarding to an existing candidate. | `"app_987654321"` | | `name` | Conditional | Applicant full name. New candidates must have a name. | `"John Doe"` | | `meetingLink` | Optional | Custom meeting or session URL. | `"https://meet.company.com/abc"` | | `linkValidityInMinutes` | Optional | How long the onboarding link remains valid.

          If omitted, system default validity of 15 minutes applies. You can configure a different value in Dashboard at **Configuration** > **General** > **Onboarding link duration**. | `60` | See [Migrating from Workforce](/features-and-modules/b2b-request-new-onboarding-api/#migrating-from-workforce) for a table that maps field names used in Workforce to field names used here. **Example Request Body** ```json { "integrationReference": "int_b2b_prod_001", "loginHint": "john.doe@clientcompany.com", "meetingLink": "https://meet.clientcompany.com/session/abc123", "notification": { "type": "URL" } } ``` ## Step 3: Handle the Response ### Success Response **HTTP Status:** `200 OK` Returned when a new onboarding session is successfully created and the onboarding link is generated. **Response Body Schema** ```json { "url": "string" } ``` **Example Response** ```json { "url": "https://url/workflow/69a8a52d8cc9700f429f9565?uuid=e22199bf-246e-4761-99e1-873cef74fc52&url_uuid=a5fe50d9-5f8e-4cd1-bcd2-189fe08c845e" } ``` Deliver this URL to the end user via your preferred channel (email, SMS, in-app redirect, etc.). ### Error Responses **HTTP Status:** `400 Bad Request` Returned when a required field is missing or has an invalid value. **Response Body Schema** ```json { "timestamp": {timestamp}, "status": {status}, "error": {error}, "message": {message}, "path": "/omni/b2b/onboarding/request-new" } ``` **Example Error Responses** Missing or invalid `loginHint`: ```json { "timestamp": 1773781956561, "status": 400, "error": "Bad Request", "message": "Login hint be a non-empty string", "path": "/omni/b2b/onboarding/request-new" } ``` Missing phone number when `notification.type` is `SMS`: ```json { "timestamp": 1773781994221, "status": 400, "error": "Bad Request", "message": "Phone must be provided when notification type is SMS", "path": "/omni/b2b/onboarding/request-new" } ``` New candidate missing a name: ```json { "timestamp": 1773782210449, "status": 400, "error": "Bad Request", "message": "BadRequestException: New candidate must have name.", "path": "/omni/b2b/onboarding/request-new" } ``` ## Migrating from Workforce The table below maps deprecated Workforce request parameters to their Omni equivalents. | Workforce field | Omni equivalent | Notes | | ------------------------- | ----------------------- | -------------------------------------------------------------------------------------- | | `integrationId` | `integrationReference` | Value format has changed — retrieve the new reference from the Omni Dashboard | | `secret` | _(removed)_ | Authentication is now handled via OAuth 2.0 Bearer token; no per-request secret needed | | `loginHint` | `loginHint` | Unchanged | | `loginHintType` | _(removed)_ | No longer required; type is inferred automatically | | `correlationId` | `externalCustomerId` | Surfaced in webhook payloads as `externalCustomerId` | | `redirectUrl` | _(removed)_ | Configure redirect behavior at the workflow level in the Omni Dashboard | | `validityMinutes` | `linkValidityInMinutes` | Renamed; same semantics | | `givenNames` + `lastName` | `name` | Combined into a single full name field | --- - Path: `features-and-modules/business-watchlist` - URL: https://developer.incode.com/features-and-modules/business-watchlist/ - Markdown: https://developer.incode.com/features-and-modules/business-watchlist.md # Watchlist Business The Watchlist Business module screens business entities against global sanctions lists, Politically Exposed Persons (PEP) databases, and adverse media, returning any matches found across the configured sources. It helps you conduct due diligence on vendors, suppliers, and partners. This reduces the risk of legal and financial exposure from associations with financial crimes or sanctions violations. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works Watchlist Business is a processing node. It must be placed in a Workflow or Flow after user data has been collected. It uses the collected business name and country information to run a search against configured watchlist sources. When the module runs, it submits the business name and country to the configured watchlist provider and returns a match status, total hits, and total matches. Results are available in [single Session view](/dashboard-platform-administration/single-session-view/#business) under the **Business** tab. Watchlist Business results are commonly used in Workflow conditions, such as in [this use case](/concepts-and-architecture/condition-use-cases/#watchlist-business). Watchlist Business can be used with the [KYB](/features-and-modules/ekyb/) module or independently. ## Use Watchlist Business For instructions on implementing and configuring Watchlist Business on each supported platform, use the following pages: - [Watchlist Business (Dashboard)](/dashboard-platform-administration/watchlist-business-dashboard/) - [Watchlist for Business Module (Web SDK)](/sdk-reference/web-sdk-2-module-watchlist-for-business/) To view the end user experience screens and customization options for this module, see [Watchlist for Business: Design and UX](/design-and-ux/watchlist-business-design/).
          --- - Path: `features-and-modules/certificate-issuance` - URL: https://developer.incode.com/features-and-modules/certificate-issuance/ - Markdown: https://developer.incode.com/features-and-modules/certificate-issuance.md # Certificate Issuance This module issues a digital certificate tied to a verified identity, supporting legally binding and compliant document signing with enhanced security and authentication measures. It is available to organizations operating under applicable regulatory frameworks, such as Incode's Trust Service Provider (PSC) standing in Mexico. ## Integrations ✅ Web | ✅ iOS | ✅ Android ## How It Works Certificate Issuance runs at the end of an Onboarding journey, after the user has completed all required identity verification (IDV) steps. The module only proceeds if the user passes IDV scoring; if verification fails, no certificate is issued. When issuance is triggered, the user is prompted to create a password and can then download their certificate (`.cer`). Each identity can hold only one certificate. If a certificate already exists for that identity, the module skips issuance and presents a link to download the existing certificate instead. You can configure certificate validity as one-time, short-term, and long-term/permanent. Long-term certificates are blocked when the user's identity document expires within 12 months. ## Use Certificate Issuance For instructions on implementing and configuring Certificate Issuance on each supported platform, use the following pages: - [Certificate Issuance (Dashboard)](/dashboard-platform-administration/certificate-issuance-dashboard/) - [Certificate Issuance Module (Web SDK)](/sdk-reference/web-sdk-2-module-certificate-issuance/) --- - Path: `features-and-modules/claims-matching` - URL: https://developer.incode.com/features-and-modules/claims-matching/ - Markdown: https://developer.incode.com/features-and-modules/claims-matching.md # Claims Matching This module verifies an employee's identity by comparing attributes extracted from their verification Session—such as name, date of birth, and location—against trusted reference data from one or more connected directories (Okta, Entra ID, LDAP, CSV, or a no-directory candidate record flow). It is designed to reduce false approvals caused by name collisions or look-alike records by requiring agreement across multiple identity attributes before a Session is approved. ## Integrations ❌ Web | ✅ iOS | ✅ Android ## How It Works Claims Matching runs after identity verification has produced a set of claims—attributes like name, date of birth, country, city, and region extracted from the captured ID. It then retrieves reference attributes from one or more configured directory sources and evaluates whether those attributes agree, claim by claim, according to the matching policy defined in the project settings. Each claim in the policy is evaluated independently with two configurable dimensions: - **Match type** controls how strictly the values are compared. Exact matching requires the values to be identical. Fuzzy matching applies a looser comparison algorithm, which varies by claim type: for example, name matching behaves differently from date-of-birth matching. - **Presence rule** controls what happens when a claim is absent. If a claim is marked Required and is missing on either side—not present in the verification Session output or not present in the directory record—the claim fails. If a claim is marked Optional and is absent, it is skipped. All required claims must pass for the Session to be auto-approved. If any required claim fails or is missing, the Session is routed to **Claims Match Review** as a single consolidated review item. Reviewers approve or reject the full set of claims together; review is not done field by field. When multiple directories are connected, the system attempts matching against each one. If any directory satisfies the policy, the result is treated as a pass. ## Use Claims Matching For instructions on configuring Claims Matching in Dashboard, see: - [Claims Matching (Dashboard)](/dashboard-platform-administration/claims-matching-dashboard/) --- - Path: `features-and-modules/combined-consent` - URL: https://developer.incode.com/features-and-modules/combined-consent/ - Markdown: https://developer.incode.com/features-and-modules/combined-consent.md # Data Sharing Consent The Data Sharing Consent module shows the user one or more preconfigured [consents](/dashboard-platform-administration/configuration-consents-tab/) to review and accept, then records their agreement. Consents obtain the user's permission to collect and process their data. Most jurisdictions require this at the start of an identity verification journey. Incode includes default consent language that covers common regulatory requirements. You can use only the default consent, create your own to match your requirements, or use a combination of both. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android | :warning: React Native coming soon ## How It Works This module asks permission from the user to collect the information and photos required for verification. The module adapts to your organization's needs. You can: - Localize the consent screen into any language your users speak - Write custom titles, descriptions, and terms using markdown for rich formatting - Mark each checkbox as mandatory or optional This example consent displays to the user: - A clear title. - Detailed consent information. - Mandatory and optional consent checkboxes. - A "Continue" button that is enabled only after all mandatory consents are checked. The consent is displayed, with checkboxes and a Continue option at the bottom. ​You [create and manage consents](/dashboard-platform-administration/configuration-consents-tab/) in Dashboard. You can view Data Sharing Consent module results on the [Other tab in single Session view](/dashboard-platform-administration/single-session-view/#other). ## Use Data Sharing Consent For instructions on implementing and configuring Data Sharing Consent on each supported platform, use the following pages: - [Data Sharing Consent (Dashboard)](/dashboard-platform-administration/data-sharing-consent-dashboard/) - [Combined Consent (iOS)](/sdk-reference/module-combined-consent/) - [Combined Consent (Android)](/sdk-reference/android-combined-consent/) - [Consent Module (Web SDK)](/sdk-reference/web-sdk-2-module-consent/) - [Combined Consent (React Native)](/sdk-reference/react-native-modules/#combinedconsent) - [Combined Consent (Flutter)](/sdk-reference/flutter-modules/#combinedconsent) To view the end user experience screens and customization options for this module, see [Data Sharing Consent: Design and UX](/design-and-ux/data-sharing-consent-design/). --- - Path: `features-and-modules/cross-check` - URL: https://developer.incode.com/features-and-modules/cross-check/ - Markdown: https://developer.incode.com/features-and-modules/cross-check.md # Cross Check The Cross Check module compares a data field from one source against the same field from a second source and identifies whether the values match. For example, it can confirm that the name on a user's ID matches the name on their proof of address document. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works In Workflows, Cross Check is a process module. It operates on data collected by earlier modules in the Workflow, such as ID Capture, Proof of Address, and Custom Fields. It doesn't ask the user for data directly. In Flows, Cross Check is a configurable setting. It also relies on modules that collect data. You configure one or more comparisons. Each comparison specifies two document sources, the field to compare across those sources, and a severity level that controls how strictly the values must match. You can give each comparison a name to make it easier to identify when [viewing results](#fetch-and-read-results) later. Cross Check executes each configured comparison and produces a match or mismatch result. You can use these results in later conditional logic to route the session. For example, you can continue the flow on a match or mark the Session for review on a mismatch. ### Fetch and Read Results You can fetch results using the Fetching Crosscheck Results API. When reading results, iterate through the dictionary and use a "contains" comparison with the comparison name. Do not read the comparison name as a direct key on the JSON response. Incode's system automatically appends metadata to the end of each name, so a direct key lookup will not work. For example, if you name a comparison `FirstNameComparison` in Dashboard, the API may return it as `FirstNameComparison #i1class`. The appended metadata varies and should be ignored. To retrieve the result, loop through the top-level keys of the JSON response and find the key that contains `FirstNameComparison`. Name comparisons so there is no overlap in "contains" matching. For example, do not name one comparison `FirstNameComp` and another `FirstNameComparison`. This can cause your code to read from the wrong field. ## Use Cross Check For instructions on implementing and configuring Cross Check on each supported platform, use the following pages: - [Cross Check (Dashboard)](/dashboard-platform-administration/cross-check-dashboard/) - [Cross-Document Data Match Module (Web SDK)](/sdk-reference/web-sdk-2-module-cross-doc-match/) --- - Path: `features-and-modules/curp-validation` - URL: https://developer.incode.com/features-and-modules/curp-validation/ - Markdown: https://developer.incode.com/features-and-modules/curp-validation.md # CURP Validation The CURP Validation module validates a person's CURP (Clave Única de Registro de Población), a personal identification number issued in Mexico, against Mexico's RENAPO registry. It accepts a CURP extracted via OCR, entered manually, or generated from personal data when the user doesn't know it. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works When CURP Validation runs, it queries RENAPO through Incode's configured third-party providers (typically FIMPE and/or CECOBAN). If the CURP is present in the OCR output from a prior ID Capture step, the module uses that value automatically and can validate without additional input from the user. If no CURP is available from OCR, the user is prompted to enter it manually. If the user does not know their CURP, the module can generate one from name, birthdate, sex, and birth state data provided by the user. Your Incode Representative can configure providers for you. A primary provider and an optional fallback provider can be specified; the fallback is triggered if the primary times out or returns an error. Your Incode Representative can also configure per-provider timeout and daily request rate limits. ## Use CURP Validation For instructions on implementing and configuring CURP Validation on each supported platform, use the following pages: - [CURP Validation (Dashboard)](/dashboard-platform-administration/curp-validation-dashboard/) - [CURP Validation (iOS)](/sdk-reference/module-curp-validation/) - [CURP Validation (Android)](/sdk-reference/android-curp-validation/) - [CURP Validation Module (Web SDK)](/sdk-reference/web-sdk-2-module-curp-validation/) - [CURP (React Native)](/sdk-reference/react-native-modules/#curp) - [CURP (Flutter)](/sdk-reference/flutter-modules/#curp) - [CURP Validation (Cordova)](/sdk-reference/cordova-modules/#curpvalidation) To view the end user experience screens and customization options for this module, see [CURP: Design and UX](/design-and-ux/curp-design/). --- - Path: `features-and-modules/custom-fields` - URL: https://developer.incode.com/features-and-modules/custom-fields/ - Markdown: https://developer.incode.com/features-and-modules/custom-fields.md # Custom Fields The Custom Fields module captures additional user-provided data and saves it to the Session, making it available for reporting, server-side decisions, or cross-checking later in the journey. The data can either be collected from the user in the UI or supplied through the back end via API. :::warning This module is deprecated. Existing implementations may continue use, but it is not available in new implementations. ::: ## Integrations :white_check_mark: Web | :x: iOS | :x: Android ## How It Works Custom fields are first [defined in Dashboard](/dashboard-platform-administration/configuration-general-tab/#manage-custom-fields), where each field is given a name and a type (number, string, Boolean, or date). Once defined, they can be populated in two ways: - **Collected in the UI**: When the Custom Fields module is added to a Flow, it presents a form to the user during verification. On submit, the values are saved to the Session. - **Sent via the backend**: When the module is not added, the values are expected through the backend via API and saved to the Session. Either way, the data lands in the Session's custom fields payload, where it can be referenced by other modules or retrieved server-side after the Session completes. ## Use Custom Fields For instructions on adding and configuring the Custom Fields module on each supported platform, use the following pages: - [Custom Fields (Dashboard)](/dashboard-platform-administration/custom-fields-dashboard/) - [Custom Fields (iOS)](/sdk-reference/module-custom-fields) - [Custom Fields Module (Web SDK)](/sdk-reference/web-sdk-2-module-custom-fields/) --- - Path: `features-and-modules/custom-module` - URL: https://developer.incode.com/features-and-modules/custom-module/ - Markdown: https://developer.incode.com/features-and-modules/custom-module.md # Custom Module The Custom Module pauses a Workflow and hands control to your application, which runs custom logic and returns a result that determines how the Workflow continues. Use it to integrate Workflows with external systems, partner APIs, or proprietary business rules while keeping the end user in a single, seamless journey. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android :::warning The Custom Module requires an SDK integration to function. Dashboard configuration alone is not enough. The callback that resumes the Workflow is implemented in your SDK code. ::: ## How It Works The Workflow configuration in Dashboard defines which Custom Module runs and where it sits in the Workflow. The SDK callback (`onCustomModuleStarted`) defines what happens when the module runs. Both pieces are required. ### Responsibilities **Incode** runs the Workflow and manages the pause and resume around the Custom Module. **Your integration** implements the `onCustomModuleStarted` callback in the SDK, runs whatever logic the use case requires (such as a partner API call, a risk-engine evaluation, a custom UI screen, or a business rule check), and returns a result. ### Execution Flow 1. The Workflow runs until it reaches the Custom Module, then pauses. 2. The SDK invokes your `onCustomModuleStarted` callback. 3. Your callback runs its logic and returns one of three [results](#results). 4. The Workflow resumes and branches based on the returned result. ### Results Your callback must return exactly one of the following: | Result | Path | | ----------- | ------------------- | | `onSuccess` | Approved/pass | | `onFail` | Rejected/fail | | `onUnknown` | No decision/step-up | **Important:** If your callback does not return a result, the Workflow stays paused indefinitely. This is the most common integration issue. Make sure every code path in your callback, including error handlers, returns a result. ### When to Use the Custom Module The Custom Module is the right choice when: - A decision needs to happen outside of Incode - Your business logic shouldn't live in Incode's platform - The Workflow's next step depends on an external system, partner API, or proprietary rule - You need to insert a custom screen or step-up prompt mid-Workflow The Custom Module is **not** intended for: - Long-running or delayed decisions; the Workflow stays paused while the callback runs, so the operation should complete in a reasonable time - Logic that Incode already provides as a standard module - Workflows where no customer-side integration is available to handle the callback ## Use Custom Module The Custom Module requires **both** Dashboard configuration and an SDK integration. See the following pages: - [Custom Module (Dashboard)](/dashboard-platform-administration/custom-module-dashboard/) - [Custom Module (iOS)](/sdk-reference/module-custom-module/) - [Custom Module (Android)](/sdk-reference/android-custom-module/) --- - Path: `features-and-modules/custom-watchlist` - URL: https://developer.incode.com/features-and-modules/custom-watchlist/ - Markdown: https://developer.incode.com/features-and-modules/custom-watchlist.md # Custom Watchlist The Custom Watchlist module screens the user's collected data, including biometric face data when available, against your organization's private watchlist of blocked or trusted users, and influences the Session outcome accordingly. It runs as a background process and isn't visible to the end user. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works Custom Watchlist operates as a background process. It runs after user data has been collected earlier in the Session and does not present any visible step to the end user. Each watchlist entry is associated with one of the following list types: - **Blocklist**: Identifies users your organization wants to review or deny. - **Allowlist**: Identifies users your organization wants to explicitly trust or grant special access. When the module runs, it performs layered matching between the current session's collected data and your organization's watchlist entries. Matching can include: - Data matching against fields such as name, date of birth, ID number, personal ID number, email, phone, and device fingerprint. - [1:N](/get-started-with-incode/glossary/#1n-face-authentication) biometric face search against face data in the watchlist. - An optional fallback search. Matches are scored, with Blocklist matches reducing the Session score and Allowlist matches increasing it. The final result is made available as a condition that your Workflow or Flow can branch on, enabling you to block the user, route them for additional review, or apply special privileges. You can view watchlist matches on the [Risk tab in single Session view](/dashboard-platform-administration/single-session-view/#risk). Watchlist entries can be added in several ways: [manually through the Dashboard](/dashboard-platform-administration/manage-custom-watchlists/), [from a completed session](/dashboard-platform-administration/single-session-view/#risk), via CSV bulk import, or automatically. Each entry stores a snapshot of the user's data at the time of creation; entries are not automatically updated if the underlying identity record changes later. ## Use Custom Watchlist - [Custom Watchlist (Dashboard)](/dashboard-platform-administration/custom-watchlist-dashboard/) - [Custom Watchlist (iOS)](/sdk-reference/module-custom-watchlist/) - [Custom Watchlist (Android)](/sdk-reference/android-custom-watchlist/) - [Custom Watchlist Module (Web SDK)](/sdk-reference/web-sdk-2-module-custom-watchlist/) - [Custom Watchlist (React Native)](/sdk-reference/react-native-modules/#customwatchlist) - [Custom Watchlist (Flutter)](/sdk-reference/flutter-modules/#customwatchlist) To view the end user experience screens and customization options for this module, see [Watchlist and Custom Watchlist: Design and UX](/design-and-ux/watchlist-design/).
          --- - Path: `features-and-modules/deepsight` - URL: https://developer.incode.com/features-and-modules/deepsight/ - Markdown: https://developer.incode.com/features-and-modules/deepsight.md # Deepsight Overview and Implementation Incode Deepsight is the AI-powered fraud prevention suite that protects every step of identity verification experiences from deepfakes and identity spoofing injections. This guide will help you enable Deepsight in your integration. ![Diagram showing how Deepsight detects deepfake injection attacks across the verification flow.](https://developer.incode.com/assets/867c9a15872278983107584bb2873673.png) The diagram illustrates four trust layers Deepsight applies across the onboarding flow, from left to right: - **User → Behavior Trust:** Flags anomalies in device motion and user behavior that signal bots or scripted fraud. - **Device → Device Trust:** Detects tampered, emulated, or rooted devices that allow spoofing or injection. - **Selfie Capture → Camera Trust:** Blocks virtual cameras and prevents video injection using camera source validation. - **User Verified → Multi-Modal Intelligence:** Advanced multi-frame liveness, depth, and motion modalities deployed to detect deepfakes and physical spoofs in the captured selfie. A red arrow labeled "Injection bypasses device camera" shows the attack vector a deepfake attempts — entering directly at the Selfie Capture stage, bypassing the device layer. Deepsight's Camera Trust and Multi-Modal Intelligence layers are positioned to intercept this attack. ## Prerequisites Deepsight requires additional licensing. After you have purchased Deepsight, contact your Incode Admin to enable the Deepsight feature flag for the requested organization. Before using Deepsight, you should be familiar with concepts such as multimodal, spoof, evasion, stream frames, jailbroken phones, and deepfakes. If you have any questions, contact your Incode Admin for assistance. ## API Changes With Deepsight When Deepsight is enabled, the response structure of the `GET /omni/get/score` API changes. With Deepsight OFF, the response includes these sections:  - `liveness` - `deviceRisk` - `behavioralRisk` sections. With Deepsight ON, the response includes a `deepsight` section containing new and enhanced fields that build on the original fields: - `liveness` → `multimodalIntelligence` + new fields. - `deviceRisk` → `deviceTrust` - `behavioralRisk`  → `behavioralTrust` - `cameraTrust` (new field) #### Multi-modal Intelligence Multi-modal intelligence includes attack detection checks for face domain and attack vectors for document domain. **Face domain:** - **Physical Spoof Detection**: Catches 2D masks, 3D masks, paper replays, and screen replays. Depth Feed Analysis: Confirms 3D structures. - **Digital Spoof Detection**: Catches deepfakes, digitally generated or manipulated images or videos. - **Evasion**: Catches extreme expressions, extreme makeup, and paraphernalia. **Document domain:** - **AI Generated Document**: Catches digitally-generated or manipulated document images. ## Implementation This section contains instructions for implementing Deepsight based on the platform you are using. Use the tabs to switch to the instructions for your platform. # Web SDK 1. Update Web SDK to version 1.80.0 or higher. 2. Contact your Incode representative to request Deepsight for your organization. 3. Enable Deepsight in Workflow or Flow settings: 1. In the Dashboard left navigation, click **Workflows** or **Flows**, depending on your configuration. 2. Locate the Workflow or Flow you want to enable Deepsight for. 1. For Workflows, click to open it, then click **Edit**. 2. For Flows, click **Edit**. 3. Click to switch to the Settings tab. 4. At the top of the settings page, click to toggle Deepsight ON. If you don’t see Deepsight here, contact your Incode representative to ensure your organization is configured to use Deepsight. 5. Click **Save Changes**. 4. Call `renderCaptureFace` or `renderCaptureId` SDK methods. Example of `renderCaptureFace` usage below: ```javascript // When rendering the camera for selfie capture const container = document.getElementById("face-capture-container"); IncodeSDK.renderCaptureFace(container, { session={session} onSuccess: async (response) => { // Unlike renderCamera, renderCaptureFace will not call processFace automatically const processFaceResponse = await IncodeSDK.processFace({ token: session.token }); // go to next step }, onError: (error) = { // handle error }, }); // When rendering the camera for ID capture const container = document.getElementById("id-capture-container"); IncodeSDK.renderCaptureId(container, { session: session, onSuccess: (response) => { // ID capture completed successfully }, onError: (error) => { // handle error }, }); ``` # iOS SDK ## Standard Mode 1. Update SDK to version 5.35.0 or higher. 2. Contact your Incode representative to request Deepsight for your organization. 3. Enable Deepsight in Workflow or Flow settings: 1. In the Dashboard left navigation, click **Workflows** or **Flows**, depending on your configuration. 2. Locate the Workflow or Flow you want to enable Deepsight for. 1. For Workflows, click to open it, then click **Edit**. 2. For Flows, click **Edit**. 3. Click to switch to the Settings tab. 4. At the top of the settings page, click to toggle Deepsight ON. If you don’t see Deepsight here, contact your Incode representative to ensure your organization is configured to use Deepsight. 5. Click **Save Changes**. 4. Copy the ID for the Workflow or Flow you added Deepsight to. Provide this ID as a `configurationId` to the methods in the next step. More info here. 5. Use `startFlow()` , `startWorkflow()` , `startOnboarding()` or `startOnboardingSection()` APIs to access the feature **Important Considerations** * In Standard mode, Video Liveness recording is only available with `startFlow()` or `startWorkflow()` APIs ## Capture-Only Mode To enable Deepsight within the Selfie module, specify the `videoLivenessRecording` param: ```javascript let flowConfig = IncdOnboardingFlowConfiguration() flowConfig.addSelfieScan(videoLivenessRecording: true) ``` No additional configuration is needed for the ID module in capture-only. **Note**: When Deepsight is enabled, it overrides stream frames and session recording settings. **Important Considerations** * In Capture-Only mode, the video file path is returned in `SelfieScanResult.videoFileURL` * In Capture-Only mode, to get the results from Deepsight, you’ll need to call into Incode’s backend with the `metadata` string received in the `IdScanResult` or `SelfieScanResult` objects. This process is described [here](/release-notes/migration-guide/#4-handling-metadata-from-idscanresult-and-selfiescanresult). # Android SDK ## Standard Mode 1. Update SDK version 5.38.0 or later. 2. Contact your Incode representative to request Deepsight for your organization. 3. Enable Deepsight in Workflow or Flow settings: 1. In the Dashboard left navigation, click **Workflows** or **Flows**, depending on your configuration. 2. Locate the Workflow or Flow you want to enable Deepsight for. 1. For Workflows, click to open it, then click **Edit**. 2. For Flows, click **Edit**. 3. Click to switch to the Settings tab. 4. At the top of the settings page, click to toggle Deepsight ON. If you don’t see Deepsight here, contact your Incode representative to ensure your organization is configured to use Deepsight. 5. Click **Save Changes**. 4. Copy the ID for the Workflow or Flow you added Deepsight to. Provide this ID as a `configurationId`to the methods in next step 5. Use `startFlow()` , `startWorkflow()` , `startOnboarding()` or `startOnboardingSection()` APIs to access the feature ## Capture-Only Mode To enable Deepsight within the Selfie module, call the `setVideoLivenessRecordingEnabled` method when adding the `SelfieScan` module: ```java FlowConfig flowConfig = new FlowConfig.Builder() .addSelfieScan(new SelfieScan.Builder() .setVideoLivenessRecordingEnabled(true) .build() ) .build(); ``` No additional configuration is needed for the ID module in capture-only. **Note**: When Video Liveness is enabled through Deepsight, it overrides `SelfieScan.streamFramesEnabled` and `FlowConfig.isRecordSession` settings. **Important Considerations** * In Capture-Only mode, the video file path is returned in `SelfieScanResult.videoFilePath` * In Capture-Only mode, to get the results from Deepsight, you’ll need to call into Incode’s backend with the `metadata` string received int the `IdScanResult` or `SelfieScanResult` objects. This process is described [here](/release-notes/migration-guide/#4-handling-metadata-from-idscanresult-and-selfiescanresult). # React Native SDK React Native currently only supports Standard Mode for Deepsight. ## Standard Mode 1. Update SDK version to 9.4.0 or later 2. Contact your Incode representative to request Deepsight for your organization. 3. Enable Deepsight in Workflow or Flow settings: 1. In the Dashboard left navigation, click **Workflows** or **Flows**, depending on your configuration. 2. Locate the Workflow or Flow you want to enable Deepsight for. 1. For Workflows, click to open it, then click **Edit**. 2. For Flows, click **Edit**. 3. Click to switch to the Settings tab. 4. At the top of the settings page, click to toggle Deepsight ON. If you don’t see Deepsight here, contact your Incode representative to ensure your organization is configured to use Deepsight. 5. Click **Save Changes**. 4. Copy the ID for the Workflow or Flow you added Deepsight to. Provide this ID as a `configurationId`to the methods in next step 5. Use `startFlow()` , `startWorkflow()` , `startOnboarding()` or `startOnboardingSection()` APIs to access the feature. # Flutter SDK Flutter currently only supports Standard Mode for Deepsight. ## Standard Mode 1. Simply update to SDK version 4.8.0 or later. 2. Contact your Incode representative to request Deepsight for your organization. 3. Enable Deepsight in Workflow or Flow settings: 1. In the Dashboard left navigation, click **Workflows** or **Flows**, depending on your configuration. 2. Locate the Workflow or Flow you want to enable Deepsight for. 1. For Workflows, click to open it, then click **Edit**. 2. For Flows, click **Edit**. 3. Click to switch to the Settings tab. 4. At the top of the settings page, click to toggle Deepsight ON. If you don’t see Deepsight here, contact your Incode representative to ensure your organization is configured to use Deepsight. 5. Click **Save Changes**. 4. Copy the ID for the Workflow or Flow you added Deepsight to. Provide this ID as a `configurationId`to the methods in next step. 5. Use `startFlow()` , `startWorkflow()` , `startOnboarding()` or `startOnboardingSection()` APIs to access the feature. # Cordova SDK Cordova currently only supports Standard Mode for Deepsight. ## Standard Mode 1. Simply update to SDK version 2.8.0 or later. 2. Contact your Incode representative to request Deepsight for your organization. 3. Enable Deepsight in Workflow or Flow settings: 1. In the Dashboard left navigation, click **Workflows** or **Flows**, depending on your configuration. 2. Locate the Workflow or Flow you want to enable Deepsight for. 1. For Workflows, click to open it, then click **Edit**. 2. For Flows, click **Edit**. 3. Click to switch to the Settings tab. 4. At the top of the settings page, click to toggle Deepsight ON. If you don’t see Deepsight here, contact your Incode representative to ensure your organization is configured to use Deepsight. 5. Click **Save Changes**. 4. Copy the ID for the Workflow or Flow you added Deepsight to. Provide this ID as a `configurationId` to the methods in next step. 5. Use `startOnboardingSection` method: ```javascript cordova.exec(function(winParam) { console.log("Section completed successfully: " + winParam); }, function(err) { console.log("Error: " + err); // handle the error by showing some UI or alert. }, "Cplugin", "startOnboardingSection", ["addId", "addSelfieScan"]); ```
          --- - Path: `features-and-modules/digital-id-wallet-verification` - URL: https://developer.incode.com/features-and-modules/digital-id-wallet-verification/ - Markdown: https://developer.incode.com/features-and-modules/digital-id-wallet-verification.md # Digital ID Wallet Verification Digital ID Wallet Verification lets users verify with a mobile driver's license (mDL) or other supported digital ID from Apple Wallet or Google Wallet, instead of photographing a physical ID. You can offer this in two ways: - In the Incode Hosted onboarding app, where the wallet option appears automatically on the ID chooser screen after it is enabled in your flow configuration. - In your own custom web UI, using the Incode Web SDK headless `renderWallet` API to launch the wallet flow from your own button. For the full list of supported wallets, schemes, and attributes across regions, see [Supported Digital IDs](/general-reference/supported-digital-ids/). ## How it works Digital ID Wallet Verification follows the same onboarding session model as the rest of Incode ID verification: 1. Your application creates or opens an Incode onboarding session. 2. The user chooses to verify with a digital ID wallet. 3. The browser launches the native wallet sheet with `navigator.credentials.get()`. 4. The user selects the credential and consents to share the requested attributes. 5. The encrypted wallet response is sent to Incode for decryption and verification. 6. Verification results are stored on the session and can be retrieved using the standard Incode result APIs. The user's identity attributes are not returned directly to the web page from the wallet call. The wallet response is encrypted for Incode services, and verified attributes are made available through the session's standard OCR data, score, and webhook result surfaces. ## Web wallet support | Platform | Wallet | Browser | Provider | | -------- | ------------- | ------- | ----------- | | iOS | Apple Wallet | Safari | `apple_web` | | Android | Google Wallet | Chrome | `google` | Apple Wallet web support requires the relying-party domain to be approved for wallet presentation. Coordinate with your Incode Representative before going live with Apple Wallet. Incode is an approved Google Verifier registrar and handles Google Wallet registration on your behalf. The user must still be on a supported Android Chrome environment with a compatible digital ID in Google Wallet. ## Option 1: Use the Incode Hosted onboarding app If you use Incode's hosted or embedded onboarding app, no extra front-end integration is required after the flow is configured. When the user reaches the ID chooser screen, the app shows a digital ID wallet option alongside the normal document capture options, when all of the following are true: - Digital IDs are enabled in the flow configuration. - Apple Wallet or Google Wallet is enabled for the flow. - The user's device and browser support the wallet method. - The user has a compatible digital ID in their wallet. The user taps the wallet option, confirms the wallet presentation in Apple Wallet or Google Wallet, and returns to the onboarding flow after the encrypted response is verified. If the wallet flow cannot be completed, the user can continue with the regular ID capture fallback path, depending on your flow configuration. ## Option 2: Use the Web SDK headless wallet API Use the Web SDK `renderWallet` API when you are building your own UI and want to expose only the wallet functionality. This is useful when: - You do not use the Incode ID chooser screen. - You want a custom button, page, or modal for digital ID verification. - You want to offer wallet verification in a custom onboarding flow while still using Incode to create the wallet request, decrypt the response, and store results on the session. For the full API surface, parameters, and callback shapes, see the [`renderWallet` reference](/sdk-reference/web-sdk-reference/#renderwallet). ## Retrieving results Digital ID Wallet Verification writes verification output to the Incode onboarding session. Use your existing Incode result retrieval pattern: - OCR data retrieval for verified identity attributes - Score or validation result retrieval for decisioning - Webhooks for session status transitions and downstream automation The response from `renderWallet` is not a replacement for the final session result. Treat it as confirmation that the wallet response was submitted and processed. ## Recommended integration patterns **For Incode Hosted onboarding app customers:** - Enable Digital ID Acceptance in the flow configuration. - Let the wallet option appear in the hosted chooser screen. - Use standard Incode session result and webhook handling after completion. **For Web SDK customers using the built-in ID capture UI:** - Enable Digital IDs in the flow configuration. - Use the chooser wallet button by default. - Add `hideDigitalIdButton: true` only if you want to move the wallet entry point into your own UI. See [`renderCaptureId` config options](/sdk-reference/web-sdk-reference/#hide-the-built-in-digital-id-button-in-rendercaptureid). **For Web SDK customers with fully custom UI:** - Enable Digital IDs in the flow configuration. - Create your own wallet button. - Call `renderWallet` from the button click handler. - Use `onSuccess` and `onError` to control your own UX. - Fetch final results from the session using standard Incode result APIs. ## Error and fallback handling Wallet presentation can fail when: - The device or browser does not support Digital Credentials APIs. - The user does not have a compatible digital ID in their wallet. - The user cancels the wallet presentation. - Apple Wallet domain approval is not complete. - The wallet response cannot be decrypted or verified. Your application should provide a fallback path, such as retrying wallet verification or continuing with physical ID capture. ## Scope notes - Apple Wallet support on this page refers to Apple Wallet web (`apple_web`), not Apple native in-app wallet presentation. - Samsung Wallet is supported for US mDLs in the Hosted onboarding app but is not part of this web SDK integration surface. See [Supported Digital IDs: United States](/general-reference/supported-digital-ids-united-states/). - DigiLocker is a separate redirect-based document retrieval flow and is not covered by this page. See [Supported Digital IDs: Asia](/general-reference/supported-digital-ids-asia/). - The customer-facing integration model is flow-based. Requested attributes and enabled wallet methods are configured in the Dashboard, not passed ad hoc from the browser. ## Related pages - [Supported Digital IDs](/general-reference/supported-digital-ids/) for the full list of wallets, schemes, and attributes - [Enable Digital IDs in the ID Capture module configuration](/dashboard-platform-administration/id-capture-dashboard/) for Dashboard setup - [`renderWallet` API reference](/sdk-reference/web-sdk-reference/#renderwallet) for the headless Web SDK integration --- - Path: `features-and-modules/document-capture` - URL: https://developer.incode.com/features-and-modules/document-capture/ - Markdown: https://developer.incode.com/features-and-modules/document-capture.md # Document Capture The Document Capture module captures a supplementary document, such as a proof of address document, medical document, or bank statement. Users can upload a file or take a photo of the document with their device’s camera. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works When a user reaches the Document Capture module, they choose to either take a photo with their camera or upload an existing file from their device. After capturing or selecting a file, the user previews it and confirms before continuing to the next step in verification. Submitted documents appear in [single Session view](/dashboard-platform-administration/single-session-view/) in the **Other** tab > **Other Documents**. ## Use Document Capture For instructions on implementing and configuring Document Capture on each supported platform, use the following pages: - [Document Capture (Dashboard)](/dashboard-platform-administration/document-capture-dashboard/) - [Document Capture (iOS)](/sdk-reference/module-document-scan/) - [Document Scan (Android)](/sdk-reference/android-document-scan/) - [Document Capture Module (Web SDK)](/sdk-reference/web-sdk-2-module-document-capture/) - [Document Scan (React Native)](/sdk-reference/react-native-modules/#documentscan) - [Document Scan (Flutter)](/sdk-reference/flutter-modules/#documentscan) - [Document Scan (Cordova)](/sdk-reference/cordova-modules/#adddocumentscan) To view the end user experience screens and customization options for this module, see [Document Capture: Design and UX](/design-and-ux/document-capture-design/). --- - Path: `features-and-modules/ekyb` - URL: https://developer.incode.com/features-and-modules/ekyb/ - Markdown: https://developer.incode.com/features-and-modules/ekyb.md # eKYB (Electronic Know Your Business) eKYB (electronic Know Your Business) verifies the identity and legitimacy of a business by matching business details (such as business name, tax ID, address, and associated individuals) against records in recognized government and commercial data sources. It enables business onboarding while supporting regulatory compliance across jurisdictions. Incode eKYB offers two solutions: - **Verification**: The end user submits business details, and the system verifies them against a source of truth. Verification returns match results for each submitted field along with enrichment details such as registration status and entity type. - **Prefill**: An enrichment solution that lowers end-user friction by pre-filling verified business data from official registries. The end user submits only a tax ID and business name; the system returns additional details such as registered address and entity type. Prefill is currently available for Mexico only, in Flows only. Both solutions are configured on the [eKYB Dashboard configuration](/dashboard-platform-administration/ekyb-dashboard/) page. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android | :white_check_mark: React Native | :white_check_mark: Flutter ## How it Works ### Verification When the eKYB module runs in Verification mode, the end user is presented with a set of input fields collecting the business information required for verification. The fields shown depend on the module configuration and the country the end user selects for the check. Once the user submits their information, the module sends it to the eKYB source for the selected country and returns a set of match and status results that downstream Workflow or Flow steps can act on. By default, the module performs the following: - Collects business information from the end user through an input form. - Prompts the end user to select the country the check should verify against. - Submits the collected data to the eKYB source for the selected country. - Returns match results for individual fields (such as business name, tax ID, address, and associated individuals) and an overall registration status for the business. The module can also be configured to: - Select which fields are collected from the end user (business name, address, tax ID, UBO, and directors). - Branch the session on eKYB results using Workflow Conditions, including business name, tax ID verification, address verification, UBO name match, and address deliverability. ### Prefill When the eKYB module runs in Prefill mode, the end user submits only a tax ID and business name. The system looks up the business in official registries and returns matching business details (such as registered address and entity type) for pre-fill in the flow. Prefill does not verify submitted values; it retrieves and returns authoritative data. ## Use eKYB For instructions on implementing and configuring eKYB on each supported platform, use the following pages: - [eKYB (Dashboard)](/dashboard-platform-administration/ekyb-dashboard/) - [eKYB (iOS)](/sdk-reference/module-ekyb/) - [eKYB (Android)](/sdk-reference/android-ekyb/) - [eKYB Module (Web SDK)](/sdk-reference/web-sdk-2-module-ekyb) - [eKYB (React Native)](/sdk-reference/react-native-modules/#ekyb) - [eKYB (Flutter)](/sdk-reference/flutter-modules/#ekyb) To view the end user experience screens and customization options for this module, see [eKYB: Design and UX](/design-and-ux/ekyb-design/). --- - Path: `features-and-modules/ekyc` - URL: https://developer.incode.com/features-and-modules/ekyc/ - Markdown: https://developer.incode.com/features-and-modules/ekyc.md # eKYC (Electronic Know Your Customer) eKYC (electronic Know Your Customer) verifies an end user's identity by matching the personal information they provide (such as name, date of birth, address, tax ID, phone, and email) against records in recognized data sources. It enables online onboarding while supporting regulatory compliance across jurisdictions. ## Integrations ✅ Web | ✅ iOS | ✅ Android ## How it Works When the eKYC module runs, the end user is presented with a set of input fields collecting the personal information required for verification. The fields shown depend on the module configuration and on the country and data sources selected for the check. Once the user submits their information, the module sends it to the configured eKYC sources and returns a set of match and risk results that downstream Workflow or Flow steps can act on. By default, the module performs the following: - Collects personal information from the end user through a configurable input form. - Submits the collected data to one or more eKYC sources for verification. - Returns match results for individual fields (such as tax ID, name, address, and date of birth) and overall risk levels for the user, tax ID, phone, and other attributes. The module can also be configured to: - Select which fields are collected from the end user, based on the country and data sources in use. - Route to country-specific sources of truth. For example, United States checks can draw on telco data, credit bureau data, and state driver's license records. - Branch the session on eKYC results using Workflow Conditions, including overall eKYC level, tax ID status, tax ID level, and phone level. ## Use eKYC For instructions on implementing and configuring eKYC on each supported platform, use the following pages: - [eKYC (Dashboard)](/dashboard-platform-administration/ekyc-dashboard/) - [eKYC (iOS)](/sdk-reference/module-ekyc/) - [eKYC (Android)](/sdk-reference/android-ekyc/) - [eKYC Module (Web SDK)](/sdk-reference/web-sdk-2-module-ekyc/) - [eKYC (React Native)](/sdk-reference/react-native-modules#ekyc) - [eKYC (Flutter)](/sdk-reference/flutter-modules/#ekyc) - [eKYC (Cordova)](/sdk-reference/cordova-modules/#addekyc) To view the end user experience screens and customization options for this module, see [eKYC: Design and UX](/design-and-ux/ekyc-design/). --- - Path: `features-and-modules/electronic-signature-module` - URL: https://developer.incode.com/features-and-modules/electronic-signature-module/ - Markdown: https://developer.incode.com/features-and-modules/electronic-signature-module.md # Electronic Signature The Electronic Signature module captures a signature the user hand-draws on screen. It is typically placed at the end of a verification journey to capture explicit consent. For a certificate-backed signature with stronger legal weight, use the [Advanced Electronic Signature](/features-and-modules/advanced-electronic-signature/) module. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android | :white_check_mark: Flutter | :white_check_mark: React Native | :white_check_mark: Cordova | :white_check_mark: Xamarin ## How It Works When the Electronic Signature module runs, the user is guided through a short signing sequence at the end of the verification process. By default, the module: - Prompts the user to draw their initials on a canvas. **Continue** becomes active after input is detected. - Prompts the user to draw their full signature on a canvas. **Done** becomes active after input is detected. - Displays a confirmation screen where the user can review their signature and clear and redraw it if needed. - Processes the submission and displays a success confirmation when the signature is accepted. The module can also be configured to display a custom title and subtitle, allowing you to add instructions or communicate the purpose of the signature to the user. After the session is complete and approved, the captured signature can be visually added to the session record or digitally attached to one or more PDF documents. > Capturing initials and attaching a signature to a PDF are not available for the Incode Webflow app. They are only available for SDK integrations. ## Use Electronic Signature For instructions on implementing and configuring Electronic Signature on each supported platform, use the following pages: - [Electronic Signature (Dashboard)](/dashboard-platform-administration/electronic-signature-dashboard/) - [Signature (iOS)](/sdk-reference/module-signature/) - [Signature (Android)](/sdk-reference/android-signature/) - [Electronic Signature Module (Web SDK)](/sdk-reference/web-sdk-2-module-electronic-signature/) - [Signature (React Native)](/sdk-reference/react-native-modules/#signature) - [Signature (Flutter)](/sdk-reference/flutter-modules/#signature) - [Signature (Cordova)](/sdk-reference/cordova-modules/#addsignature) To view the end user experience screens and customization options for this module, see [Electronic Signature: Design and UX](/design-and-ux/electronic-signature-design/). --- - Path: `features-and-modules/email-input` - URL: https://developer.incode.com/features-and-modules/email-input/ - Markdown: https://developer.incode.com/features-and-modules/email-input.md # Email Input The Email Input module collects a user's email address and can confirm email ownership by sending a one-time password (OTP) to that address. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works The Email Input module prompts the user to enter their email address. If one-time password (OTP) verification is enabled, the system sends a code that email address. The user enters the code, the system validates it, and the user proceeds. If the code is incorrect or expired, the user sees an error and can request a new code. If OTP verification is not enabled, the user continues without that step. The module can be positioned at any point in an onboarding journey where an email address is required. ## Use Email Input For instructions on implementing and configuring Email Input on each supported platform, use the following pages: - [Email Input (Dashboard)](/dashboard-platform-administration/email-input-dashboard/) - [Email (iOS)](/sdk-reference/module-email/) - [Email (Android)](/sdk-reference/android-email/) - [Email Module (Web SDK)](/sdk-reference/web-sdk-2-module-email/) - [Email (React Native)](/sdk-reference/react-native-modules/#email) - [Email (Flutter)](/sdk-reference/flutter-modules/#email) - [Email (Cordova)](/sdk-reference/cordova-modules/#addemail) To view the end user experience screens and customization options for this module, see [Email Input: Design and UX](/design-and-ux/email-input-design/). --- - Path: `features-and-modules/external-decision` - URL: https://developer.incode.com/features-and-modules/external-decision/ - Markdown: https://developer.incode.com/features-and-modules/external-decision.md # External Decision The External Decision module calls a configured external endpoint and exposes the returned decision value for routing [Conditions](/dashboard-platform-administration/configure-workflow-conditions/). Use this module to incorporate signals you own, such as account status, risk, or eligibility, into identity verification. This is commonly used in cases where identity alone is not enough to determine what happens next. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android This module is not exposed as a standalone SDK module and has no end-user-facing UI. ## How It Works External Decision is a **process node**: when the Workflow engine reaches it, the Incode backend calls the configured endpoint synchronously, receives a single decision string in response, and routes the Workflow based on that value using standard business rules. Nothing is shown to the end user. On each execution, Incode sends a fixed payload with the session context (`sessionId`, `identityId`, `flowId`, and `timestamp`). The client endpoint returns a single string representing its decision; the value is client-defined, and Incode does not interpret or constrain it. An optional `reason` field is supported for observability and does not affect routing. The node can be placed anywhere in the Workflow. Place it after an authentication module only when the decision depends on `identityId`; otherwise it runs using `sessionId`, `flowId`, and `timestamp` alone. ### Failure handling The Incode backend waits up to 30 seconds for a response from the client endpoint. If the endpoint does not respond within that window, is unavailable, returns an error, returns an invalid format, or returns a string that matches no configured condition, the decision value is set to the reserved value `INCODE_UNRESOLVED`. This value is available in Conditions like any other, so you decide how to handle it (terminate the session, proceed, or trigger a step-up). The 30-second timeout is fixed and cannot be adjusted. Endpoints that may take longer than 30 seconds to respond are not compatible with the External Decision module. ### Authentication Incode authenticates to the client endpoint using OAuth 2.0 (client credentials). The client stands up a standard OAuth token endpoint and issues Incode a Client ID and Secret. On each execution, Incode requests an access token from the client's authorization URL using the client-credentials grant, then calls the client endpoint with that token. ## Use External Decision For instructions on configuring the External Decision module in Dashboard, see: - [External Decision (Dashboard)](/dashboard-platform-administration/external-decision-dashboard/)
          --- - Path: `features-and-modules/face-authentication` - URL: https://developer.incode.com/features-and-modules/face-authentication/ - Markdown: https://developer.incode.com/features-and-modules/face-authentication.md # Face Authentication The Face Authentication module captures a returning user's face with the device camera and matches it against the face already enrolled for that user. It then returns a pass or fail result. Face Authentication detects liveness, physical and digital attacks, and image quality. It can also check for lenses, hats, closed eyes, or face masks. Face Authentication provides an added level of security for organizations, applications, and higher-level permissions. For example, you can use Face Authentication to grant access to specific functionality within your application. This ensures the person requesting access has a valid, registered Incode Identity. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works Face Authentication captures a selfie image of a user, creates a biometric template from the captured image, and compares it against biometric identities to confirm a match. There are two identification strategies to confirm an [identity](/get-started-with-incode/glossary/#incode-identity): - 1:1 searches for a specific identity - 1:N searches for an identity among all your Incode identities After the authentication process is complete, you can review the results and decide what happens next in your application. ## Use Face Authentication For instructions on implementing and configuring Face Authentication on each supported platform, use the following pages: - [Face Authentication (Dashboard)](/dashboard-platform-administration/face-authentication-dashboard/) - [Face Authentication (iOS)](/sdk-reference/module-face-authentication/) - [Face Authentication (Android)](/sdk-reference/android-face-authentication/) - [Auth Face (Web SDK 1.x)](/sdk-reference/web-sdk-reference/#renderauthface) - [Authentication (Web SDK 2.x)](/sdk-reference/web-sdk-2-module-authentication/) - [Face Authentication (React Native)](/sdk-reference/react-native-modules/#faceauthentication) - [Face Authentication (Flutter)](/sdk-reference/flutter-modules/#faceauthentication) - [addFaceAuthentication (Cordova)](/sdk-reference/cordova-modules/#addfaceauthentication)
          --- - Path: `features-and-modules/face-capture` - URL: https://developer.incode.com/features-and-modules/face-capture/ - Markdown: https://developer.incode.com/features-and-modules/face-capture.md # Face Capture The Face Capture module captures a user’s face with their device’s camera and runs configurable liveness, face recognition, and image quality checks. It can enroll new users so their face can be matched against an ID photo or used for later authentication. It can also log in returning users using [1:1](/get-started-with-incode/glossary/#11-face-authentication) or [1:N](/get-started-with-incode/glossary/#1n-face-authentication) face authentication. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works When Face Capture runs, the user is guided through a selfie capture step with on-screen feedback to center their face. The module attempts automatic capture for a configurable window, falling back to additional attempts if the image cannot be captured cleanly. Once an image is captured, the module can run any combination of the following checks, depending on configuration: - **Liveness checks** that detect physical presentation attacks (e.g., printed photos, masks), digital presentation attacks (e.g., a face shown on a screen), and evasion attempts (e.g., obscuring or distorting the face). Each check has a configurable threshold. - **Image quality validation** at a configurable severity level. - **Occlusion and obstruction checks** for glasses or contact lenses, masks, hats, closed eyes, and image brightness. - **Reliable age estimation** against a configurable minimum age. Sessions that fail capture can optionally be routed for manual review rather than rejected outright. Processing can run server-side or on the user's device. ## Use Face Capture For instructions on implementing and configuring Face Capture on each supported platform, use the following pages: - [Face Capture (Dashboard)](/dashboard-platform-administration/face-capture-dashboard/) - [Selfie (iOS)](/sdk-reference/module-selfie/) - [Selfie Scan (Android)](/sdk-reference/android-selfie-scan/) - [Selfie Module (Web SDK)](/sdk-reference/web-sdk-2-module-selfie-1/) - [Selfie Scan (React Native)](/sdk-reference/react-native-modules/#selfiescan) - [Selfie Scan (Flutter)](/sdk-reference/flutter-modules/#selfiescan) - [Selfie Scan (Cordova)](/sdk-reference/cordova-modules/#addselfiescan) To view the end user experience screens and customization options for this module, see [Face Capture: Design and UX](/design-and-ux/face-capture-design/). --- - Path: `features-and-modules/face-match` - URL: https://developer.incode.com/features-and-modules/face-match/ - Markdown: https://developer.incode.com/features-and-modules/face-match.md # Face Match The Face Match module compares the user's selfie against their ID photo, their NFC chip photo, or both in a 3-way match. It then returns a confidence score. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works Face Match runs after [Face Capture](/features-and-modules/face-capture/) and [ID Capture](/features-and-modules/id-capture/) have collected their images. The module compares a configurable pair of images—the captured selfie against the photo from the ID, the photo read from the document's NFC chip, or both—and returns a match result based on a configurable severity threshold. For sessions that capture more than one identity document, Face Match can be scoped to a specific ID (First ID or Second ID) so it compares against the intended document. Face Match can also optionally inspect the EXIF metadata of the captured face image to detect signs of software modification or to reject images captured well before the session began. ## Use Face Match For instructions on implementing and configuring Face Match on each supported platform, use the following pages: - [Face Match (Dashboard)](/dashboard-platform-administration/face-match-dashboard/) - [Face Match (iOS)](/sdk-reference/module-face-match/) - [Face Match (Android)](/sdk-reference/android-face-match/) - [Face Match Module (Web SDK)](/sdk-reference/web-sdk-2-module-face-match) - [Face Match (React Native)](/sdk-reference/react-native-modules/#facematch) - [Face Match (Flutter)](/sdk-reference/flutter-modules/#facematch) - [Face Match (Cordova)](/sdk-reference/cordova-modules/#addfacematch) To view the end user experience screens and customization options for this module, see [Face Match: Design and UX](/design-and-ux/face-match-design/). --- - Path: `features-and-modules/face-onboarding` - URL: https://developer.incode.com/features-and-modules/face-onboarding/ - Markdown: https://developer.incode.com/features-and-modules/face-onboarding.md # Face Onboarding The Face Onboarding module allows a user to begin or resume Onboarding using face recognition, reusing their data from a previous Session with their consent. This reduces friction for returning users. If no previous Session is found, the verification continues along a standard Onboarding or KYC path. ## Integrations :white_check_mark: Web | :x: iOS | :x: Android ## How It Works When a user reaches the Face Onboarding module, they are prompted to proceed with face recognition. If the user has completed a prior Onboarding, they are asked to consent to reusing that data. The system then attempts to match the user's face against existing records. - **If a match is found**, prior Onboarding data is available for reuse, streamlining the remainder of the flow. - **If no match is found**, the verification continues with a full Onboarding or KYC path. This approach helps prevent duplicate accounts and supports fraud mitigation by identifying whether a user record already exists before collecting new information. ## Use Face Onboarding For instructions on implementing and configuring Face Onboarding on each supported platform, use the following pages: - [Face Onboarding (Dashboard)](/dashboard-platform-administration/face-onboarding-dashboard/) --- - Path: `features-and-modules/feature-deep-dive` - URL: https://developer.incode.com/features-and-modules/feature-deep-dive/ - Markdown: https://developer.incode.com/features-and-modules/feature-deep-dive.md # Feature Deep Dive This section contains more detailed information about products, features, or settings that are part of other pages or processes. - [Request New Onboarding API](/features-and-modules/b2b-request-new-onboarding-api/) - [Deepsight Overview and Implementation](/features-and-modules/deepsight/) - [INE Fingerprint Validation](/features-and-modules/ine-fingerprint-validation/) - [Risk AI Agent Overview](/features-and-modules/risk-ai-agent/) - [Silent Network Authentication](/features-and-modules/silent-network-authentication-sna/) - [Digital ID Wallet Verification](/features-and-modules/digital-id-wallet-verification/)
          --- - Path: `features-and-modules/features-and-modules` - URL: https://developer.incode.com/features-and-modules/ - Markdown: https://developer.incode.com/features-and-modules.md # Features and Modules This section covers modules, the building blocks you use to construct a Workflow or Flow, and the advanced features that extend or harden a verification session beyond core identity checks. *** ## Modules - **[Modules Overview](/features-and-modules/modules-overview-and-availability/)**: The full catalog of modules available for Workflows and Flows, organized by category: collecting identity data, verifying and authenticating users, capturing signatures and consent, adding human-assisted verification, and configuring the user experience. ## Advanced Fraud & Risk Features - **[Deepsight](/features-and-modules/deepsight/)**: Incode's AI-powered fraud prevention suite. Adds device, camera, and behavioral trust layers on top of standard liveness to detect deepfakes, virtual cameras, and injection attacks. Requires additional licensing. - **[Risk AI Agent](/features-and-modules/risk-ai-agent/)**: An adaptive, machine-learning-based fraud decisioning system that replaces the legacy TotalScore model. It weighs signals from across a session in context (document validation, biometrics, device and behavioral risk) to produce a single pass/fail decision, rather than applying fixed rule thresholds. Currently available for Mexico, the United States, and Colombia. ## Specialized Verification Features - **[Digital ID Wallet Verification](/features-and-modules/digital-id-wallet-verification/)**: Lets users verify with a mobile driver's license (mDL) or other supported digital ID from Apple Wallet, Google Wallet, Samsung Wallet, or a national identity scheme, instead of photographing a physical ID. Available in the Hosted onboarding app or via the Web SDK `renderWallet` API. Configured within the ID Capture module; see [Supported Digital IDs](/general-reference/supported-digital-ids/) for the full list of wallets, schemes, and attributes by region. * **[INE Fingerprint Validation](/features-and-modules/ine-fingerprint-validation/)**: Verifies a user's identity against Mexico's INE using fingerprint biometrics captured at a branch or kiosk, returning a per-finger confidence score alongside the standard government validation result. Configured within the Government Record Verification module. * **[Silent Network Authentication (SNA)](/features-and-modules/silent-network-authentication-sna/)**: A carrier-based phone verification method, available within the Phone Number Input module, that confirms possession of a mobile number directly through the mobile network — no SMS or OTP entry required. Falls back to SMS OTP automatically when SNA isn't available. Currently supported in Flows only. ## Server-to-Server Integration - **[B2B Request New Onboarding API](/features-and-modules/b2b-request-new-onboarding-api/)**: Lets a B2B client trigger a new onboarding session for a specific user from its own backend, authenticated via OAuth 2.0 Client Credentials, and returns a link to deliver to the end user. Replaces the legacy Workforce integration pattern. *** **Note:** Deepsight, Risk AI Agent, INE Fingerprint Validation, SNA, and Digital IDs all require your Incode representative to enable them for your organization before they can be configured. --- - Path: `features-and-modules/field-comparison-1` - URL: https://developer.incode.com/features-and-modules/field-comparison-1/ - Markdown: https://developer.incode.com/features-and-modules/field-comparison-1.md # Field Comparison The Field Comparison module compares fields from different sources, such as OCR data extracted from an ID and information entered by the user, to verify they match. It supports branching, so you can route users down separate paths depending on whether the comparison passes or fails. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works Field Comparison performs a crosscheck between fields from two different sources and produces a named result that downstream logic can act on. You configure the module by choosing the sources and specific fields to include in the comparison. Common sources include: - OCR data extracted from a captured ID - Input fields entered directly by the user - Other data collected earlier in the Session (such as custom fields or additional captured sources) The comparison output is saved under a Comparison Name you define. Once configured, that name becomes available in the rules list of any Condition node that follows; the result is reusable, not just a one-time pass/fail gate. ## Use Field Comparison For instructions on implementing and configuring Field Comparison on each supported platform, use the following pages: - [Field Comparison (Dashboard)](/dashboard-platform-administration/field-comparison-dashboard/) - [Field Comparison Module (Web SDK)](/sdk-reference/web-sdk-2-module-field-comparison/) --- - Path: `features-and-modules/fiscal-qr-ocr` - URL: https://developer.incode.com/features-and-modules/fiscal-qr-ocr/ - Markdown: https://developer.incode.com/features-and-modules/fiscal-qr-ocr.md # Fiscal QR OCR The Fiscal QR OCR module scans the QR code on a Constancia de Situación Fiscal, the SAT tax document issued in Mexico, and extracts the associated fiscal data. The parsed result is available via API as a Fiscal QR Response tied to the Session. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android | :white_check_mark: Flutter | :white_check_mark: React Native ## How It Works The Fiscal QR OCR module prompts the user to scan the QR code on their Constancia de Situación Fiscal. Incode extracts the URL embedded in the QR code and attaches it to the Session. Incode then scrapes the fiscal data returned by that URL, including information tied to the user's RFC (tax identification record), and makes it available as a structured Fiscal QR Response. You can retrieve the parsed data using the following API endpoint: `GET /omni/fiscal-qr-url-response/{interviewId}` This endpoint returns the information obtained from the fiscal QR URL added to the session. It is available for Mexico only. ## Use Fiscal QR OCR For instructions on implementing Fiscal QR OCR on each supported platform, use the following pages: - [Fiscal QR OCR (Dashboard)](/dashboard-platform-administration/fiscal-qr-ocr-dashboard/) To view the end user experience screens and customization options for this module, see [Fiscal QR OCR: Design and UX](/design-and-ux/fiscal-qr-ocr-design/). --- - Path: `features-and-modules/forms-and-data-entry` - URL: https://developer.incode.com/features-and-modules/forms-and-data-entry/ - Markdown: https://developer.incode.com/features-and-modules/forms-and-data-entry.md # Forms and Data Entry The Forms and Data Entry module presents one or more custom form screens to collect information from a user. Responses are stored in the Session and can be retrieved via API. Use this module when identity documents alone don't capture everything you need. Common use cases include collecting information not present on the user's ID (such as a residential address or a Brazilian CPF number), routing users to different verification paths based on citizenship or residency status, and gathering more information for enhanced due diligence. ### Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ### How It Works When the Forms and Data Entry module runs, the user is presented with one or more pages of questions you configure. The module displays a title, if configured. It shows one question at a time or a set of questions per page, depending on how you set up the form. By default, the module: - Displays questions in the order they were configured, across one or multiple pages. - Enforces required fields before allowing the user to proceed. **Continue** is disabled until all required inputs on the current page contain valid responses. - Validates input in real time, showing inline errors for invalid entries: for example, an invalid email address or an out-of-range date. - Stores all responses in the Session, where they can be reviewed on the [Other tab in single Session view](/dashboard-platform-administration/single-session-view/#other) and retrieved via the [Fetch Form Answers](/reference/fetchformanswers/) API. The module can also be configured to: - Display a custom title at the top of the form or hide the title entirely. - Spread questions across multiple pages, with **Continue** advancing the user between pages and **Done** completing the form on the final page. - Mix pre-defined questions, which come with question text and input type already set, with custom questions, where you write the question text and select the input type. - Mark individual questions as required or optional. In Workflows, form responses can be used as [conditions](/dashboard-platform-administration/configure-workflow-conditions/). This allows you to route users to different verification paths based on their answers. For example, you can request additional documents from non-citizens or collect more information from users flagged for enhanced due diligence. ### Use Forms and Data Entry For instructions on implementing and configuring Forms and Data Entry on each supported platform, use the following pages: - [Forms and Data Entry (Dashboard)](/dashboard-platform-administration/forms-and-data-entry-dashboard/) - [Dynamic Forms (iOS)](/sdk-reference/module-dynamic-forms/) - [Dynamic Forms (Android)](/sdk-reference/android-dynamic-forms/) - [Dynamic Forms Module (Web SDK)](/sdk-reference/web-sdk-2-module-dynamic-forms/) To view the end user experience screens and customization options for this module, see [Forms and Data Entry: Design and UX](/design-and-ux/forms-and-data-entry-design/).
          --- - Path: `features-and-modules/geolocation-2` - URL: https://developer.incode.com/features-and-modules/geolocation-2/ - Markdown: https://developer.incode.com/features-and-modules/geolocation-2.md # Geolocation The Geolocation module requests location permission, then captures the precise physical location of the user's device, using its GPS sensor to record coordinates and location fields such as country, state, and city. Use this module to: - Identify Sessions where the device location differs significantly from the location implied by the user's IP address or identity document - Detect potential VPN or proxy use :::info IP-based location is captured automatically for every session as part of device info, even if the Geolocation module isn't in your Flow or Workflow. If you only need country- or region-level location information, you may not need this module. ::: ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works When the Geolocation module runs, it asks the user to allow location access on their device. If the user allows it, the module records the device's GPS coordinates and location fields such as country, region, city, and postal code. If the user denies or skips the step, no GPS location is captured. IP-based location is still available through device info. Precise location data can drive Workflow [conditions](/dashboard-platform-administration/configure-workflow-conditions/) to route users, block access, or send sessions to manual review. Location data is stored in the Session. You can review it on the [Other tab in single Session view](/dashboard-platform-administration/single-session-view/#other) and retrieve it via the [Fetch Device Info](/api-reference/get-device-info/) API. Geolocation extracts the following data. Each confidence level indicates how reliable that data is for driving Workflow conditions and compliance decisions. For routing and access decisions, use conditions based on data with high confidence levels. | Data | Description | Confidence Level | | ----------------------------------------------- | ------------------------------------------------------------------ | ---------------- | | Latitude | North-south coordinate | High | | Longitude | East-west coordinate | High | | Admin Area | Primary administrative division: for example, state or province | High | | Sub Admin Area | Secondary administrative division: for example, county | High | | Locality | City or town | High | | Country Code | ISO 3166-1 alpha-3 country code | High | | Country Name | Full name of the country | High | | Device Location | Address or place where the device is located | Medium | | Device Location vs IP Address Location Distance | Distance between the device's GPS location and IP address location | Medium | | Sub Locality | Smaller area within the locality: for example, neighborhood | Medium | | Thoroughfare | Street or road name | Medium | | Postal Code | Postal or ZIP code | Medium | | Sub Thoroughfare | Specific address number or additional street information | Low | ## Use Geolocation For instructions on implementing and configuring Geolocation on each supported platform, use the following pages: - [Geolocation (Dashboard)](/dashboard-platform-administration/geolocation-dashboard/) - [Geolocation (iOS)](/sdk-reference/module-geolocation/) - [Geolocation (Android)](/sdk-reference/android-geolocation/) - [Geolocation Module (Web SDK)](/sdk-reference/web-sdk-2-module-geolocation/) - [Geolocation (React Native)](/sdk-reference/react-native-modules/#geolocation) - [Geolocation (Flutter)](/sdk-reference/flutter-modules/#geolocation) - [Geolocation (Cordova)](/sdk-reference/cordova-modules/#addgeolocation) To view the end user experience screens and customization options for this module, see [Geolocation: Design and UX](/design-and-ux/geolocation-design/). --- - Path: `features-and-modules/government-record-verification` - URL: https://developer.incode.com/features-and-modules/government-record-verification/ - Markdown: https://developer.incode.com/features-and-modules/government-record-verification.md # Government Record Verification The Government Record Verification module validates identity data extracted from a user's ID document and/or biometrics extracted from a user’s selfie against an authoritative government registry. The process runs in the background and isn't visible to the user. After relevant identity attributes and selfie image are captured via OCR or barcode scan alongside selfie capture, the module submits them to the corresponding government provider for that country. The provider returns a field-by-field match result and an overall status that can be used in downstream decisioning. ## Integrations :white_check_mark: iOS | :white_check_mark: Android | :white_check_mark: Web ## How It Works Government Record Verification receives identity data and/or selfie images already collected in the session, typically from the [ID Capture](/features-and-modules/id-capture/) and [Face Capture](/features-and-modules/face-capture/) modules. It sends that data to a country-specific provider to verify identity against authoritative government databases through either direct or indirect connections. For country-specific guides, refer to the [Government Verification](/general-reference/government-verification-sources/) section. A fallback mode is available for situations where the primary provider is unavailable. Contact your Incode representative to configure providers. The provider checks the submitted data fields and selfie image against its system of record and returns match results for each submitted input along with an overall verification status. The module supports two verification types, depending on the country and the terms of a client’s contract: - **Data validation**: Compares biographic fields—such as document number, name, and date of birth—against the government record. - **Facial validation**: Where supported, compares a biometric captured during the session against a government-held portrait or biometric source. These can be used together or independently. Verification results are displayed in Dashboard on the [GovMatch tab in single Session view](/dashboard-platform-administration/single-session-view/#govmatch). You may use the Process Government Validation API to directly interact with the module, bypassing the default configuration and using Session-specific details for verification. ## Use Government Record Verification - [Government Record Verification (Dashboard)](/dashboard-platform-administration/government-record-verification-dashboard/) - [Government Validation (iOS)](/sdk-reference/module-government-validation/) - [Government Validation (Android)](/sdk-reference/android-government-validation/) - [Government Validation Module (Web SDK)](/sdk-reference/web-sdk-2-module-gov-validation-1/) - [Government Validation (React Native)](/sdk-reference/react-native-modules/#governmentvalidation) - [Government Validation (Flutter)](/sdk-reference/flutter-modules/#governmentvalidation) - [Government Validation (Cordova)](/sdk-reference/cordova-modules/#addgovernmentvalidation) To view the end user experience screens and customization options for this module, see [Government Record Verification: Design and UX](/design-and-ux/government-record-verification-design/). --- - Path: `features-and-modules/id-capture` - URL: https://developer.incode.com/features-and-modules/id-capture/ - Markdown: https://developer.incode.com/features-and-modules/id-capture.md # ID Capture The ID Capture module captures the front and back of a government-issued ID, with auto-capture and quality checks, and produces clean images for processing. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works When the ID Capture module runs, the end user is prompted to present an identity document to their device camera. The module displays visual guidelines to help the user center the document in the frame and provides real-time feedback on framing, focus, and lighting. By default, the module performs the following: - Detects the document in the camera frame and applies alignment classification to confirm the ID is properly positioned before accepting the image. - Automatically captures the front of the ID when image quality criteria are met (autocapture), with configurable timeouts and a configurable maximum number of attempts. - Prompts the user to capture the back of the ID and, when applicable, reads the barcode on the back. The module can also be configured to: - Restrict accepted documents to a specific country or to a defined set of document types (for example, passports only). - Allow the user to upload an existing image of their ID instead of capturing live, or to submit a digital ID from a device wallet. - Capture only the front of the ID, only the back, or require both regardless of document type. - Redact sensitive fields (such as document numbers or personal identifiers) from the captured images on a per-country, per-document-type basis. ## Digital ID Wallet Verification ID Capture supports Digital ID verification alongside physical document capture. Users can verify with a mobile driver's license (mDL) or other supported digital ID from Apple Wallet, Google Wallet, or Samsung Wallet, instead of photographing a physical ID. Digital IDs are enabled per flow in the Dashboard. Once enabled, the wallet option appears automatically in the Hosted onboarding app's ID chooser, or can be launched from a custom UI using the Web SDK `renderWallet` API. For the integration model, end-user experience, and recommended patterns, see [Digital ID Wallet Verification](/features-and-modules/digital-id-wallet-verification/). For the full list of supported wallets, schemes, and attributes by region, see [Supported Digital IDs](/general-reference/supported-digital-ids/). ## Use ID Capture For instructions on implementing and configuring ID Capture on each supported platform, use the following pages: - [ID Capture (Dashboard)](/dashboard-platform-administration/id-capture-dashboard/) - [ID Capture (iOS)](/sdk-reference/module-id-scan/) - [ID Scan (Android)](/sdk-reference/android-id-scan/) - [ID Capture Module (Web SDK)](/sdk-reference/web-sdk-2-module-id-capture/) - [ID Scan (React Native)](/sdk-reference/react-native-modules/#idscan) - [ID Scan (Flutter)](/sdk-reference/flutter-modules/#idscan) - [Add ID (Cordova)](/sdk-reference/cordova-modules/#addid) To view the end user experience screens and customization options for this module, see [ID Capture: Design and UX](/design-and-ux/id-capture-design/).
          --- - Path: `features-and-modules/id-validation-module` - URL: https://developer.incode.com/features-and-modules/id-validation-module/ - Markdown: https://developer.incode.com/features-and-modules/id-validation-module.md # ID Validation The ID Validation module determines whether a submitted identity document is authentic. It analyzes the images captured by the [ID Capture](/features-and-modules/id-capture/) module against known parameters for the document type, runs a set of authenticity checks, and produces a validation result. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works The Capture ID module collects images of the front and, where applicable, back of the user's ID. When the ID Validation module runs, the Incode Platform performs OCR data extraction and a series of authenticity checks on the captured ID images. These checks assess factors such as document liveness, tamper detection, barcode content, font consistency, and more. These depend on which checks are enabled in your configuration. The module produces a validation score at the module level. That score contributes to an overall Session outcome (approved, rejected, or manual review) based on your configured thresholds and workflow logic. ## Use ID Validation For instructions on implementing and configuring ID Validation on each supported platform, use the following pages: - [ID Validation (Dashboard)](/dashboard-platform-administration/id-validation-dashboard/) - [Process ID (iOS)](/sdk-reference/module-process-id/) - [Process ID (Android)](/sdk-reference/android-process-id/) - [Process ID (React Native)](/sdk-reference/react-native-modules/#processid) - [Process ID (Flutter)](/sdk-reference/flutter-modules/#processid) - [Add ID (Cordova)—includes Process ID](/sdk-reference/cordova-modules/#addid) --- - Path: `features-and-modules/ine-fingerprint-validation` - URL: https://developer.incode.com/features-and-modules/ine-fingerprint-validation/ - Markdown: https://developer.incode.com/features-and-modules/ine-fingerprint-validation.md # INE Fingerprint Validation Incode's INE Fingerprint Validation lets you verify a user's identity against Mexico's Instituto Nacional Electoral (INE) using fingerprint biometrics captured at a branch or kiosk. You supply fingerprint scans from your existing hardware; Incode forwards them to INE for matching and returns a per-finger confidence score alongside the standard government validation result. This feature must be enabled for your organization before use. Contact your Incode representative if you are interested in this feature. When enabled, this feature is configurable in the [Government Record Verification](/dashboard-platform-administration/government-record-verification-dashboard/) module. *** ## How It Works Fingerprint validation is a two-step flow: 1. **Collection** — your app uploads fingerprints to the active session using `/omni/add/fingerprints`. 2. **Validation** — your app calls `/omni/process/government-validation`. Incode selects the best available fingerprints, sends them to INE alongside face and ID data, and returns a combined result. Fingerprints can also be passed inline in the validation request instead of pre-uploading them. See [Sample Request](#sample-request) below. *** ## Supported Fingerprint Formats | Value | Format | | ----- | ------ | | `1` | ANSI | | `2` | WSQ | | `3` | RAW | All formats submitted in a single session must use the same type. If you upload fingerprints with a different `type` than what is already stored in the session, all previously stored fingerprints are deleted before the new ones are saved. The most common format in production is **WSQ (**`type: 2`**)**. *** ## Finger Index Mapping Use the `index` field to identify which finger was scanned. | Index | Finger | Hand | | ----- | ------ | ----- | | 1 | Thumb | Right | | 2 | Index | Right | | 3 | Middle | Right | | 4 | Ring | Right | | 5 | Pinky | Right | | 6 | Thumb | Left | | 7 | Index | Left | | 8 | Middle | Left | | 9 | Ring | Left | | 10 | Pinky | Left | The most common submission in production is the **right index finger (**`index: 2`**)** in WSQ format. If a user cannot provide a specific finger, submit whichever finger is available. A single fingerprint is sufficient — there is no minimum beyond one. *** ## API Reference ### POST `/omni/add/fingerprints` Upload one or more fingerprints to the active session. **Request body:** ```json { "type": 2, "fingerprints": [ { "index": 2, "base64Fingerprint": "", "fingerprintMetadata": { "device": "scanner_device", "resolution": "500x500", "qualityScore": "95" } } ] } ``` **Fields:** | Field | Type | Required | Description | | ------------------------------------------------- | -------------- | -------- | ---------------------------------------------------- | | `type` | integer | Yes | Fingerprint format: `1` = ANSI, `2` = WSQ, `3` = RAW | | `fingerprints` | array | Yes | Array of fingerprint objects | | `fingerprints[].index` | integer (1–10) | Yes | Which finger was scanned | | `fingerprints[].base64Fingerprint` | string | Yes | Base64-encoded fingerprint image | | `fingerprints[].fingerprintMetadata.device` | string | No | Scanner device identifier | | `fingerprints[].fingerprintMetadata.resolution` | string | No | Image resolution | | `fingerprints[].fingerprintMetadata.qualityScore` | string | No | Quality score reported by the scanner | **Response:** ```json { "success": true } ``` **Behavior notes:** - The session must be active. Fingerprints cannot be added to a completed or expired session. - Submitting a fingerprint with the same `index` as one already stored in the session overwrites the previous one. Use this to replace a low-quality scan. - You may upload up to 10 fingerprints per session (one per index). *** ### GET `/omni/get/fingerprints?interviewId={id}` Retrieve the fingerprints stored for a session. Returns the same structure as the add request, with `base64Fingerprint` populated from storage. *** ### POST `/omni/process/government-validation` Trigger INE identity validation. Incode selects the best available fingerprints from the session and sends them to INE alongside face and ID data. Fingerprints can be passed inline in this request using the `fingerprintsData` field, or omitted entirely if they were already uploaded via `/omni/add/fingerprints` — the service retrieves them from storage automatically. Inline fingerprints take precedence over stored ones. See the [Sample Request](#sample-request) section for a full example. *** ## Finger Selection Logic INE accepts a maximum of 2 fingerprints per validation request. Incode automatically selects the best available fingerprints from the session before forwarding to INE. **Selection priority:** 1. A matched pair (same finger position, both hands) is preferred over a single finger. 2. Pairs are evaluated in this order: Index (2/7) → Thumb (1/6) → Middle (3/8) → Ring (4/9) → Pinky (5/10). 3. If no matched pair is available, the highest-priority single finger is sent. 4. If no fingerprints are available, the request proceeds without fingerprint data. **Example:** If the session contains fingers 2, 5, and 7 — the selector sends fingers 2 and 7 (right index + left index, highest-priority pair). *** ## Sample Request Full example calling `/omni/process/government-validation` with fingerprints passed inline: ```bash curl -X POST "https:///omni/process/government-validation?interviewId=" \ -H "Content-Type: application/json" \ -H "X-Incode-Hardware-Id: " \ -H "Authorization: Bearer " \ -d '{ "cic": "1234567890", "claveElector": "ABCDEF123456789012", "nombre": "JUAN", "apellidoPaterno": "GARCIA", "apellidoMaterno": "LOPEZ", "curp": "GALJ800101HDFRCN09", "anioRegistro": "2010", "anioEmision": "2020", "numeroEmisionCredencial": "01", "base64Image": "", "fingerprintsData": { "type": 2, "fingerprints": [ { "index": 2, "base64Fingerprint": "", "fingerprintMetadata": { "device": "Suprema BioMini", "resolution": "500x500", "qualityScore": "92" } }, { "index": 7, "base64Fingerprint": "", "fingerprintMetadata": { "device": "Suprema BioMini", "resolution": "500x500", "qualityScore": "88" } } ] } }' ``` ### Sample Success Response ```json { "governmentValidationStatus": "OK", "governmentRecognitionConfidence": 97.3, "governmentRecognitionConfidence2": 95.1, "governmentFingerprintConfidence": { "finger1": null, "finger2": 98.5, "finger3": null, "finger4": null, "finger5": null, "finger6": null, "finger7": 96.2, "finger8": null, "finger9": null, "finger10": null }, "comparisonResults": { "nombre": true, "apellidoPaterno": true, "apellidoMaterno": true, "claveElector": true, "curp": true, "ocr": true, "anioRegistro": true, "anioEmision": true, "numeroEmisionCredencial": true }, "registralSituation": { "tipoSituacionRegistral": "VIGENTE", "tipoReporteRoboExtravio": null } } ``` `null` values for fingers not submitted are expected. INE only scores the fingers it received. *** ## Response Fields ### Fingerprint Confidence `governmentFingerprintConfidence` contains per-finger similarity scores returned by INE. Scores range from 0–100. Only fingers included in the request will have non-null values. Incode applies a pass/fail threshold to each finger's score internally before returning the result. ### Face Confidence | Field | Description | | ---------------------------------- | -------------------------- | | `governmentRecognitionConfidence` | Primary face match score | | `governmentRecognitionConfidence2` | Secondary face match score | ### Comparison Results INE validates whether the data on the ID card matches its records. Each field returns `true` or `false`. | Field | What is validated | | ------------------------- | -------------------------- | | `nombre` | First name | | `apellidoPaterno` | Paternal last name | | `apellidoMaterno` | Maternal last name | | `claveElector` | Voter key | | `curp` | CURP | | `ocr` | OCR data | | `anioRegistro` | Registration year | | `anioEmision` | Issuance year | | `numeroEmisionCredencial` | Credential emission number | ### Registral Situation INE returns the current status of the credential. `tipoSituacionRegistral`**:** | Value | Meaning | | ---------------------- | ----------------------- | | `VIGENTE` | ID is current and valid | | `NO_VIGENTE` | ID is no longer valid | | `DATOS_NO_ENCONTRADOS` | No data found | `tipoReporteRoboExtravio`**:** | Value | Meaning | | --------------------- | ------------------ | | `null` | No report on file | | `REPORTE_DE_EXTRAVIO` | ID reported lost | | `REPORTE_DE_ROBO` | ID reported stolen | *** ## Status Codes | Status Code | Internal Status | Meaning | | ------------ | --------------------------- | -------------------------------- | | `0` | `OK` | Identity verified successfully | | `-1` | `PROCESSING_INE` | Result pending (async) | | `112`, `113` | `INE_SIGNATURE_ERROR` | Signature validation error | | `204` | `INE_CONNECTION_ERROR` | Connection error to INE | | `205` | `NOT_ENOUGH_DATA` | Insufficient data provided | | `1403` | `USER_NOT_FOUND_IN_INE_DB` | Person not found in INE database | | `1404` | `INE_NOT_CURRENT` | ID card is not current | | `1405` | `INE_REPORTED_LOST` | ID reported lost | | `1406` | `INE_REPORTED_STOLEN` | ID reported stolen | | `1505` | `INE_NOT_VALID` | ID is not valid | | `1506` | `PROVIDER_UNAVAILABLE` | INE provider is unavailable | | `1507` | `MODULE_NOT_SUPPORTED` | Module not supported | | `2336` | `TRANSACTION_LIMIT_REACHED` | Rate limit exceeded | *** ## Dashboard When fingerprint validation is enabled, the Gov Verification section in the single session view displays: - Fingerprint images for each finger submitted - Which finger was captured (index 1–10) - Individual confidence score per finger - Pass/fail status per finger - Overall verification result - Device metadata - Timestamp and INE response details Only fingers that were actually submitted appear in the dashboard — all 10 slots are not shown by default. *** ## Flow / Workflow Configuration Fingerprint validation behavior is configured per Flow or Workflow within the Government Record Verification module. The following fingerprint-specific options are available when Mexico is selected as a validation country: - **Fingerprint Validation**: Enables fingerprint capture and biometric matching as part of the government identity verification flow. - **Minimum Passing Fingerprints**: Sets the minimum number of fingerprints that must return a passing match score for the verification to succeed. - **Fingerprint Match Override Score**: When enabled, a successful fingerprint match overrides a failed face or data comparison, and the verification is approved based on the fingerprint result alone. *** ## Key Constraints | Constraint | Detail | | ----------------------- | ------------------------------------------------------------------------------------- | | Max fingers per session | 10 (one per index) | | Max fingers sent to INE | 2 | | Supported formats | ANSI, WSQ, RAW — cannot mix formats in the same session | | Session requirement | Session must be active to add fingerprints | | Re-upload behavior | Re-uploading the same `index` replaces the existing fingerprint | | INE preference | Matched pair (same finger, both hands) preferred over single | | Inline vs. pre-stored | Fingerprints passed inline in the validation request take precedence over stored ones |
          --- - Path: `features-and-modules/instant-bav` - URL: https://developer.incode.com/features-and-modules/instant-bav/ - Markdown: https://developer.incode.com/features-and-modules/instant-bav.md # Instant BAV The Instant BAV (Bank Account Verification) module validates a user's bank account information by checking key details such as name, address, account ID, and balance. ## Integrations :white_check_mark: Web | :x: iOS | :x: Android ## How It Works When Instant BAV is included in a Flow, the user is prompted to connect their bank account for verification. The module guides the user through an integrated bank account verification flow, typically provided by a third-party vendor, and retrieves key account details from the bank. Once the bank account information is returned, the module validates it against expected identity and account attributes, such as name, address, account ID, and balance. The module then returns a verification result along with the underlying account attributes used in the check, depending on the integration and your organization's configuration. ## Use Instant BAV For instructions on implementing and configuring Instant BAV on each supported platform, use the following pages: - [Instant BAV (Dashboard)](/dashboard-platform-administration/instant-bav-dashboard/) --- - Path: `features-and-modules/modules-overview-and-availability` - URL: https://developer.incode.com/features-and-modules/modules-overview-and-availability/ - Markdown: https://developer.incode.com/features-and-modules/modules-overview-and-availability.md # Modules Overview Modules are the primary building blocks of Workflows and Flows. They allow you to collect selfies, documents, consent, or information from users. Each module is a part of the identity verification (IDV) process. In Workflows, some modules are considered Processes. Processes are prebuilt steps for validating data, identity checks, and fraud signals. Some modules have prerequisites that must be configured before they can be used. Refer to each module's documentation page for specific requirements. You can configure modules as a part of Workflows or Flows directly in Dashboard or in the code of your SDK. We recommend using Dashboard for configuration, then calling to the Workflow/Flow ID from the SDK. Depending on your organization's configuration, you may not see all possible modules. Contact your Incode representative if you have questions about the modules available in your organization. The following tables can help you choose which modules to use. They are divided by category. ## Collect Identity Data These modules gather raw inputs from users. No pass/fail determination is made; these modules receive and record. | Module | Description | | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Custom Fields](/features-and-modules/custom-fields/) | Allows you to capture additional user-provided data. | | [Document Capture](/features-and-modules/document-capture/) | Allows users to submit document images or files. | | [Email Input](/features-and-modules/email-input/) | Collects the user's email address. | | [Face Capture](/features-and-modules/face-capture/) | Captures a photo of the user's face. | | [Face Onboarding](/features-and-modules/face-onboarding/) | Onboards a user's face to establish a biometric record for future authentication. | | [Fiscal QR OCR](/features-and-modules/fiscal-qr-ocr/) | Scans and extracts data from the QR code printed on a Constancia de Situación Fiscal, the SAT tax document issued in Mexico. | | [Forms and Data Entry](/features-and-modules/forms-and-data-entry/) | Presents a customizable form to collect data from the user. | | [Geolocation](/features-and-modules/geolocation-2/) | Captures the user's exact geographic location. | | [ID Capture](/features-and-modules/id-capture/) | Captures an image of the user's government-issued ID. | | [NFC Scan](/features-and-modules/nfc/) | Reads data from the [NFC](/get-started-with-incode/glossary#nfc-scan) chip embedded in compatible IDs. | | [Phone Number Input](/features-and-modules/phone-number-input/) | Collects the user's phone number. | | [Proof of Address Capture](/features-and-modules/proof-of-address-capture/) | Captures a document that verifies the user's residential address. | | [Review OCR Data](/features-and-modules/review-ocr-data/) | Extracts text from a captured document using [Optical Character Recognition (OCR)](/get-started-with-incode/glossary/#ocr) and presents it to the user for confirmation. | | [Video Selfie](/features-and-modules/video-selfie/) | Captures a short video of the user capturing their ID and face. | ## Verify and Authenticate These modules run checks against collected data to produce a pass/fail or match/no-match determination. | Module | Description | | ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Antifraud Check](/features-and-modules/antifraud-check/) | Runs automated checks to detect fraudulent activity. | | [Claims Matching](/features-and-modules/claims-matching/) | Verifies an employee's identity by comparing data from their IDV session with trusted reference data from one or more connected directories. | | [Cross Check](/features-and-modules/cross-check/) | Compares a data field from one source against the same field from a second source and identifies whether the values match. | | [CURP Validation](/features-and-modules/curp-validation/) | Validates a Mexican CURP (Clave Única de Registro de Población) identifier. | | [Custom Watchlist](/features-and-modules/custom-watchlist/) | Screens the user against a watchlist you define. | | [eKYB (electronic Know Your Business)](/features-and-modules/ekyb/) | Electronically verifies a business's identity and legitimacy. | | [eKYC (electronic Know Your Customer)](/features-and-modules/ekyc/) | Electronically verifies a user's identity against authoritative data sources. | | [Face Authentication](/features-and-modules/face-authentication/) | Authenticates a returning user by matching their face against a previously onboarded biometric record. | | [Face Login](/features-and-modules/user_guide_face_login/) | Performs face authentication to allow users to log in without a password or token. | | [Face Match](/features-and-modules/face-match/) | Compares faces captured during the Face Capture and ID Capture modules to confirm they belong to the same person. | | [Field Comparison](/features-and-modules/field-comparison-1/) | Matches information from two or more sources to validate consistency. | | [Government Record Verification](/features-and-modules/government-record-verification/) | Verifies the user's identity against official government records. | | [ID Validation](/features-and-modules/id-validation-module/) | Determines whether a submitted ID is authentic. | | [Instant BAV](/features-and-modules/instant-bav/) | Verifies a user's bank account information and validates key details such as name, address, and account ID. | | [Watchlist](/features-and-modules/watchlist/) | Screens the user against standard watchlists. | | [Watchlist Business](/features-and-modules/business-watchlist/) | Screens a business against standard watchlists. | ## Capture Signatures and Consent These modules capture legally binding signatures and record user consent. | Module | Description | | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | [Advanced Electronic Signature](/features-and-modules/advanced-electronic-signature/) | Captures a certificate-backed electronic signature that meets higher legal standards. | | [Certificate Issuance](/features-and-modules/certificate-issuance) | Issues a certificate upon successful completion of the verification process to support legal and compliance standards. | | [Data Sharing Consent](/features-and-modules/combined-consent) | Collects the user's consent to collect and process their data. | | [Electronic Signature](/features-and-modules/electronic-signature-module) | Captures a standard electronic signature from the user. | | [Qualified Electronic Signature](/features-and-modules/qualified-electronic-signature) | Captures an electronic signature that meets the highest legal standards, specifically under the EU eIDAS Regulation. | ## Add Human-Assisted Verification These modules introduce a live agent into the IDV process. | Module | Description | | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------- | | [Video Conference](/features-and-modules/video-conference) | Connects the user with a live agent who conducts an identity verification interview through video. | ## Configure the User Experience These modules shape the user experience of a Workflow or Flow, including routing decisions. They do not collect or verify data. | Module | Description | | -------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Custom Module](/features-and-modules/custom-module) | Allows you to point the IDV session to your application to run custom logic and return a result. | | [External Decision](/features-and-modules/external-decision) | Calls a configured external endpoint and exposes the returned decision value for routing [conditions](/dashboard-platform-administration/configure-workflow-conditions/). | --- - Path: `features-and-modules/nfc` - URL: https://developer.incode.com/features-and-modules/nfc/ - Markdown: https://developer.incode.com/features-and-modules/nfc.md # NFC Scan The NFC Scan module reads the secure [NFC](/get-started-with-incode/glossary/#nfc-scan) chip embedded in ICAO 9303-compliant travel documents, such as e-passports. It then returns the document holder's data, including the chip's portrait image. It reads the chip directly using the device's NFC hardware, providing a high-assurance data source that complements optical capture and OCR. ## Integrations :x: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works NFC Scan works in conjunction with [Document Capture](/features-and-modules/document-capture/) and [OCR](/get-started-with-incode/glossary/#ocr). The user is prompted to hold the document near their device to begin an NFC session. The module uses details extracted from the document during OCR to establish a secure connection with the chip before reading its contents. Once authenticated, NFC Scan reads the chip's data groups and validates the document's authenticity using the embedded digital signature. The extracted chip data is returned for use in later verification steps, where it can be matched against other identity signals captured during the session. ## Use NFC Scan For instructions on implementing and configuring NFC Scan on each supported platform, use the following pages: - [NFC Scan (Dashboard)](/dashboard-platform-administration/nfc-scan-dashboard/) - [NFC (iOS)](/sdk-reference/module-nfc-scan/) - [NFC Scan (Android)](/sdk-reference/android-nfc-scan-2/) - [NFC Scan (React Native)](/sdk-reference/react-native-modules/#nfcscan) - [NFC Scan (Flutter)](/sdk-reference/flutter-modules/#nfcscan) - [Add NFC (Cordova)](/sdk-reference/cordova-modules/#addnfc) To view the end user experience screens and customization options for this module, see [NFC: Design and UX](/design-and-ux/nfc-design/). --- - Path: `features-and-modules/phone-number-input` - URL: https://developer.incode.com/features-and-modules/phone-number-input/ - Markdown: https://developer.incode.com/features-and-modules/phone-number-input.md # Phone Number Input The Phone Number Input module collects a user's phone number and can confirm phone ownership using either Silent Network Authentication (SNA) or an SMS one-time password (OTP). When SNA is enabled, it runs as the primary verification method, with SMS OTP as an automatic fallback when SNA is unavailable. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works The user is shown a phone number input field, optionally pre-populated with a default country prefix. The user enters their phone number and continues. If SNA is enabled and supported for the user's carrier and device, verification happens silently in the background with no code entry required. If SNA is not enabled, or if it is unavailable for the user's carrier or device, the system sends an SMS code to the provided number and the user enters the code to confirm ownership. On success, the module completes and returns the captured phone number (for example, +11234567890). For a deeper explanation of how SNA works, its benefits, and its limitations, see Silent Network Authentication. ## Use Phone Number Input For instructions on implementing and configuring Phone Number Input on each supported platform, use the following pages: - [Phone Number Input (Dashboard)](/dashboard-platform-administration/phone-number-input-dashboard/) - [Phone (iOS)](/sdk-reference/module-phone/) - [Phone (Android)](/sdk-reference/android-phone/) - [Phone Module (Web SDK)](/sdk-reference/web-sdk-2-module-phone/) - [Phone (React Native)](/sdk-reference/react-native-modules/#phone) - [Phone (Flutter)](/sdk-reference/flutter-modules/#phone) - [Phone (Cordova)](/sdk-reference/cordova-modules/#addphone) To view the end user experience screens and customization options for this module, see [Phone Number Input: Design and UX](/design-and-ux/phone-number-input-design/). --- - Path: `features-and-modules/proof-of-address-capture` - URL: https://developer.incode.com/features-and-modules/proof-of-address-capture/ - Markdown: https://developer.incode.com/features-and-modules/proof-of-address-capture.md # Proof of Address Capture The Proof of Address Capture module captures a proof-of-address document, such as a utility bill, bank statement, or telecom agreement, as an image or PDF. It then extracts the address data through [OCR](/get-started-with-incode/glossary/#ocr) to validate the user's residential address. This module is optional by default but can be made mandatory through configuration. ## Integrations :white_check_mark: iOS | :white_check_mark: Android | :white_check_mark: Web | :white_check_mark: Flutter | :white_check_mark: React Native | :white_check_mark: Cordova | :white_check_mark: Xamarin ## How It Works The user is prompted to take or upload an image or PDF of a proof-of-address document. The document is then processed using OCR and machine learning to extract: - Document type - Full name - Address (as a raw string and, where available, structured address components) - Dates on the document The extracted data is returned in the Session's OCR response. Incode extracts and structures the address data. You can define pass/fail business logic, such as requiring a document dated within the last three months. ## Use Proof of Address Capture For instructions on implementing and configuring Proof of Address Capture on each supported platform, use the following pages: - [Proof of Address Capture (Dashboard)](/dashboard-platform-administration/proof-of-address-capture-dashboard/) --- - Path: `features-and-modules/qualified-electronic-signature` - URL: https://developer.incode.com/features-and-modules/qualified-electronic-signature/ - Markdown: https://developer.incode.com/features-and-modules/qualified-electronic-signature.md # Qualified Electronic Signature The Qualified Electronic Signature module shows the user documents to sign, collects their consent, and captures a Qualified Electronic Signature (QES), the highest-assurance electronic signature under the [EU eIDAS Regulation](https://eur-lex.europa.eu/eli/reg/2014/910/oj/eng). A qualified certificate from a Qualified Trust Service Provider (QTSP) backs the signature, making it legally equivalent to a handwritten signature across EU member states. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works When the Qualified Electronic Signature module runs, the user is presented with the document or documents to be signed and guided through a consent and signing process. Qualified Electronic Signature is based on qualified certificates issued by a Qualified Trust Service Provider (QTSP) and uses PKI cryptography to cryptographically link the signature to the document, ensuring it cannot be altered without invalidation. By default, this module: - Displays the documents to be signed, each with a **View** link so the user can review them before proceeding. - Presents required consent checkboxes covering the Trust Center terms and conditions, electronic signing authorization, and the legal binding nature of the signature. - Keeps the **Finish signing** button disabled until all required consents are accepted. - Issues a qualified certificate and applies the cryptographic signature upon submission. - Displays a processing state during signature issuance, followed by a success confirmation when signing is complete. The module can also be configured to: - Restrict signing to a specific region. Country-specific Qualified Electronic Signature configurations are available. For more information, contact your Incode representative. - Allow the user to upload a PDF document to sign. - Allow the user to download the signed document after signing is complete. - Use a one-time, short-term, or long-term certificate for the signature. - Display the user's email address as part of the issued certificate. ## Use Qualified Electronic Signature For instructions on implementing and configuring Qualified Electronic Signature on each supported platform, use the following pages: - [Qualified Electronic Signature (Dashboard)](/dashboard-platform-administration/qualified-electronic-signature-dashboard-1/) - [QES (iOS)](/sdk-reference/module-qes/) - [QES (Android)](/sdk-reference/android-qes/) - [Electronic Signature Module (Web SDK)—includes Qualified Electronic Signature](/sdk-reference/web-sdk-2-module-electronic-signature/) To view the end user experience screens and customization options for this module, see [Qualified Signature: Design and UX](/design-and-ux/qualified-signature-design/). --- - Path: `features-and-modules/review-ocr-data` - URL: https://developer.incode.com/features-and-modules/review-ocr-data/ - Markdown: https://developer.incode.com/features-and-modules/review-ocr-data.md # Review OCR Data The Review OCR Data module extracts text from a captured identity document using [Optical Character Recognition (OCR)](/get-started-with-incode/glossary/#ocr)​. It then shows that text to the user to confirm it's correct before the session continues. When enabled, users can correct missing or misread fields. It runs after [ID Capture](/features-and-modules/id-capture/). ## Integrations :x: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works After the user completes ID Capture, Incode runs OCR on the captured document to extract its text fields. The Review OCR Data module then displays those fields to the user on a review screen. By default, the module: - Displays OCR-extracted fields from the identity document, including Full Name, Date of Birth, Gender, Document Number, Expiry Date, and Address. - Allows the user to confirm the extracted data is correct before the session proceeds. The module can also allow the user to edit and correct OCR-extracted values. This is useful when a field is missing or was misread. For example, when an address is not detected on the document, the user can enter it manually. Enabling this feature may require back-end enablement. Contact your Incode Representative for more information. ## Use Review OCR Data For instructions on implementing and configuring Review OCR Data on each supported platform, use the following pages: - [Review OCR Data (Dashboard)](/dashboard-platform-administration/review-ocr-data-dashboard/) - [ID OCR (iOS)](/sdk-reference/module-id-info/) - [ID Info (Android)](/sdk-reference/android-id-info/) - [OCR Edit (React Native)](/sdk-reference/react-native-modules/#ocredit) - [OCR Edit (Flutter)](/sdk-reference/flutter-modules/#ocredit) --- - Path: `features-and-modules/risk-ai-agent` - URL: https://developer.incode.com/features-and-modules/risk-ai-agent/ - Markdown: https://developer.incode.com/features-and-modules/risk-ai-agent.md # Risk AI Agent Overview Risk AI Agent is Incode's adaptive, machine-learning-based fraud decisioning system. Instead of applying fixed rules and weights to individual checks, it evaluates all available signals from a verification session in context. After weighing how each signal affects the others, it produces a single, more accurate pass/fail decision. It reduces the need for regular threshold tuning or custom rules. Risk AI Agent replaces the legacy TotalScore model. Risk AI Agent must be enabled for your organization. Contact your Incode representative to enable it. *** ## Session Decisioning Risk AI Agent evaluates signals from across the verification session, including document validation, biometric checks, cross-field consistency, session timing, device risk, and more. It produces a fraud probability score between 0 and 1. Sessions scoring above the threshold fail; sessions scoring below pass. ![Diagram showing how Risk AI Agent processes multiple signal types to produce a context-aware session decision.](https://developer.incode.com/assets/7724e431f58763a33ed647e0d1bbb39a.png)
          The diagram shows Risk AI Agent's decision architecture. Input signals flow from right to left into a central Autopilot AI Agent. This agent undergoes continuous retraining and outputs a context-aware session decision. The agent draws on two primary input categories: - **OCR & data cross-check**: Optical character recognition and data validation signals - **Biometric matching**: Comparison of biometric data across the session These branch into more granular signals, including: - **Liveness**: Sub-signals for **Client ID**, **Face features**, and **Behavior and device signals** - **Document features**: Document-level signals feeding into the same decision pipeline Additional signal inputs are indicated but not individually labeled. ### Decisioning Logic Risk AI Agent does not operate in isolation. A session fails if any of the following are true, regardless of the Risk AI Agent score: - Trust Graph fails - Deepsight scores below 0.5 - Government Validation scores below 0.81 If Risk AI Agent does not run, the session falls back to TotalScore. When Risk AI Agent is active, the `total_score` field in the score API response returns a pass/fail value instead of a numeric score. *** ## Signal Inputs The model ingests confidence scores, not pass/fail statuses, from most checks, including: - ID validation - Tamper and alteration detection - Fake document detection - Paper and screen liveness - Face recognition - OCR It also incorporates session timing signals, device risk indicators, the client ID, and the document type. Because Risk AI Agent uses underlying confidence scores rather than check statuses, severity settings on most checks have little effect on its output. The exceptions are liveness (physical, digital, and evasion) and face recognition. For these, Risk AI Agent uses both status and confidence thresholds, so severity settings on those checks can influence outcomes. \*\*Required dependency: [ID Validation](/features-and-modules/id-validation-module/) (`processID`) must be included in the Flow or Workflow for Risk AI Agent to function. Liveness and face recognition are not required but improve accuracy. *** ## Explainability Risk AI Agent is a gradient-boosting decision tree model and cannot produce a rule-based explanation of its output. Instead: - For sessions that fail, it surfaces the top 3 contributing signals that drove the decision: for example, document alteration and face recognition. - For sessions that pass, it surfaces signals that support legitimacy. A narrative risk assessment summary is also available in the `responseText` field of the API response. *** ## Rules Engine Compatibility Rules that override the final session decision (for example, forcing a fail when a specific check fails) continue to work alongside Risk AI Agent. Rules that send sessions to Manual Review also continue to work. Rules that modify module weights or scores do not affect Risk AI Agent, because the model uses the original confidence scores as inputs. *** ## Supported Regions Risk AI Agent is available for Mexico, the United States, and Colombia. Sessions from other countries fall back to TotalScore. --- - Path: `features-and-modules/silent-network-authentication-sna` - URL: https://developer.incode.com/features-and-modules/silent-network-authentication-sna/ - Markdown: https://developer.incode.com/features-and-modules/silent-network-authentication-sna.md # Silent Network Authentication Silent Network Authentication (SNA) is a carrier-based phone verification method that confirms a user's possession of a mobile number directly through the mobile network, without sending an SMS or requiring the user to enter a code. SNA is available as a verification method within the [Phone Number Input](/features-and-modules/phone-number-input/) module. It is currently only available for Flows. When enabled, SNA runs as the primary verification method, with SMS OTP as an automatic fallback when SNA is unavailable. This feature must be enabled for your organization before use. Contact your Incode representative if you are interested in this feature. ## How It Works SNA verifies that the device associated with the provided phone number is active and connected to the mobile network. This validation happens through secure interactions with mobile network operators, establishing a proof of possession tied to the SIM. The following sequence diagram shows how SNA runs within a verification flow, including coverage checks, carrier validation, and fallback to SMS OTP when required. ![SNA Sequence Diagram](https://developer.incode.com/assets/64e6ff45d42c82b880d2a3dda6aff7b8.png) ## Benefits SNA improves the phone verification experience across three dimensions: - Low-friction user experience: Users only need to enter their phone number. Verification happens in the background without OTP retrieval or manual input, which reduces user effort and improves completion rates. - Reliable verification: Removing the dependency on SMS delivery avoids common issues such as message delays, delivery failures, and repeated OTP requests. - Improved security: Carrier-level validation reduces exposure to SMS-based threats such as phishing, OTP interception, and SIM swap attacks. ## Considerations - Requires mobile network connectivity: SNA relies on communication with the mobile carrier network and will not work if the device has no mobile data connectivity. - Fallback is required for full coverage: When SNA is not supported due to device, carrier, or connectivity constraints, the flow automatically falls back to SMS OTP to complete verification. ## SNA and Identity Verification SNA provides a real-time signal that a user controls the phone number they are claiming, by validating the association between the device and SIM through the mobile network. On its own, SNA answers foundational questions about phone ownership and device linkage. Combined with other Incode signals such as biometrics, document verification, and device intelligence, it contributes to a more complete view of the user. This supports stronger identity decisions by helping answer questions such as: - Does the user control this phone number? - Is this number actively linked to the device being used? - Has this phone or device been reused across multiple accounts? - Is this identity linked to known or previously detected fraud? - Is this identity part of a suspicious network of users or devices? These insights are powered by Incode's ability to connect signals across sessions and workflows, supporting detection of repeat fraud, account sharing, and coordinated activity. For deeper network-level insights and relationship-based risk analysis, SNA can be combined with Trust Graph. Contact your Incode representative for more information. ## Implementation SNA implementation is platform-specific. See the SDK reference for your platform: - [Phone Number Input (Dashboard)](/dashboard-platform-administration/phone-number-input-dashboard/) - [Phone Number Input (iOS)](/sdk-reference/module-phone/) - [Phone Number Input (Android)](/sdk-reference/android-phone/)
          --- - Path: `features-and-modules/user_guide_face_login` - URL: https://developer.incode.com/features-and-modules/user_guide_face_login/ - Markdown: https://developer.incode.com/features-and-modules/user_guide_face_login.md # Face Login (iOS) The Face Login module performs face authentication to allow users to log in without a password or token. ## Supported Platforms - iOS ## How It Works Face Login uses biometric face scanning to authenticate users without passwords or tokens. When a user initiates a login, the SDK captures a selfie and runs liveness detection to confirm the person is physically present and not a spoofed image or recording. There are two authentication modes: - **1:N (Identify)**: The captured face is compared against your entire database of approved users. The system finds the closest match and returns that user's identity. If multiple similar faces are detected, the system performs step-up authentication, prompting the user to confirm their identity with an additional code. Use this mode when you do not know in advance who is trying to log in. - **1:1 (Verify)**: The captured face is compared against a single, pre-specified user identified by their [customer UUID](/get-started-with-incode/glossary/#customer-uuid). The system returns a pass or fail for that specific person only. Use this mode when the user has already been identified by another means and you only need to confirm they are physically present. In both modes, if liveness detection fails, the result is flagged as a spoof attempt rather than a failed face match, allowing your application to handle the two cases differently. ## Prerequisites - The user must have completed a full Incode onboarding flow and be an approved customer. ## Integrate Face Login Module ### Initialize the IncdOnboarding SDK Add the following line of code to your `AppDelegate` class: ``` IncdOnboardingManager.shared.initIncdOnboarding(url: url, apiKey: apiKey) ``` Incode provides `url` and `apiKey`. If you are running the app on a simulator, set the `testMode` parameter to `true`. ### Execute 1:N Face Login: Identify a User Call `startFaceLogin` without a `customerUUID` to match against your full user database: ```swift IncdOnboardingManager.shared.presentingViewController = self IncdOnboardingManager.shared.startFaceLogin() { result in guard let loginResult = result.faceLoginResult else { // An error occurred print(result.error) return } if loginResult.success == true { // Face authentication successful let customerUUID = loginResult.customerUUID let token = loginResult.token let interviewId = loginResult.interviewId } else { if result.spoofAttempt == true { // Liveness check failed } else { // No matching face found in database } } } ``` ### Execute 1:1 Face Login: Verify a Specific User Call `startFaceLogin` with the `customerUUID` of the user you want to verify: ```swift IncdOnboardingManager.shared.presentingViewController = self IncdOnboardingManager.shared.startFaceLogin(customerUUID: "YOUR_CUSTOMER_ID") { result in guard let loginResult = result.faceLoginResult else { // An error occurred print(result.error) return } if loginResult.success == true { // Face authentication successful let customerUUID = loginResult.customerUUID let token = loginResult.token let interviewId = loginResult.interviewId } else { if result.spoofAttempt == true { // Liveness check failed } else { // User's face did not match } } } ``` ### View Face Login Result The callback returns a `SelfieScanResult` object with the following fields: - `faceLoginResult`: A `FaceLoginResult` object that contains: - `success`: `true` if face login was successful; `false` if it was not. - `customerUUID`: The customer UUID of the matched user; `nil` if no match was found. - `token`: The customer token of the matched user; `nil` if no match was found. - `interviewId`: The session [interviewId](/get-started-with-incode/glossary/#interviewid) from the user's original approval flow. - `interviewToken`: The session [interviewToken](/get-started-with-incode/glossary/#session-token) used during user approval. - `transactionId`: The transaction ID of the face login attempt. - `spoofAttempt`: `true` if the attempt was flagged as a spoof; `false` if it was not. - `image`: The selfie image captured during the scan. - `error`: A `SelfieScanError` describing any error that occurred. ### Specify Login Parameters By default, Face Login performs liveness detection and face matching on the server. For faster authentication and reduced network dependency, switch to on-device processing using the `faceAuthMode` parameter: - To use on-device liveness detection with server-side face matching, specify `FaceAuthMode.hybrid` via the `faceAuthMode` param of the `startFaceLogin` method: ```swift IncdOnboardingManager.shared.presentingViewController = self IncdOnboardingManager.shared.startFaceLogin(faceAuthMode: .hybrid) { result in ... } ``` - To use on-device liveness detection and on-device face matching, specify `FaceAuthMode.local` via the `faceAuthMode` param of the `startFaceLogin` method: ```swift IncdOnboardingManager.shared.presentingViewController = self IncdOnboardingManager.shared.startFaceLogin(faceAuthMode: .local) { result in ... } ``` ### Note `FaceAuthMode.hybrid` and `FaceAuthMode.local` require specific Onboarding SDK frameworks with FaceAuth models included. If using CocoaPods, specify the `l` variant: for example, `5.48.0-d-l`. The following additional parameters are available on `startFaceLogin`: | Parameter | Type | Default | Description | | -------------------------- | ------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `showTutorials` | Boolean | `true` | Shows a tutorial screen before the selfie scan. | | `faceAuthModeFallback` | Boolean | | When `true`, falls back to `FaceAuthMode.server` if `FaceAuthMode.local` cannot run due to a missing face template on the device. Applies to 1:1 Face Login only. | | `lensesCheck` | Boolean | `true` | Detects whether the user is wearing lenses during the selfie scan. Set to `false` to disable. | | `faceMaskCheck` | Boolean | `false` | Detects whether the user is wearing a face mask during capture. Set to `true` to enable. | | `logAuthenticationEnabled` | Boolean | `true` | Sends liveness statistics after each login attempt. Set to `false` to disable. | | `customLogo` | Image | | A custom logo to display during face capture. Uses the default Incode logo if not specified. | ### Manage Locally Stored Identities To authenticate multiple users using 1:N mode with `FaceAuhtMode.local`, you must populate a local database of user identities on the device. You can use the following methods to manage that database. **Add a Face** To add a single identity to the local database, use the `addFace` method and provide a `FaceInfo` object that contains the following fields: | Field | Type | Description | | -------------- | ------ | ---------------------------------------------------------------------------------------------- | | `faceTemplate` | String | The biometric representation of the user's face. | | `customerUUID` | String | The user's unique customer identifier in Incode's database. | | `templateId` | String | The unique identifier of the biometric representation of the user's face in Incode's database. | ```swift let face = FaceInfo(faceTemplate: template, customerUUID: uuid, templateId: templateId) IncdOnboardingManager.shared.addFace(face) ``` **Remove a Face** To remove a single identity from the local database, use the `removeFace` method and provide a `customerUUID`: ```swift IncdOnboardingManager.shared.removeFace(customerUUID: customerUUID) ``` **Get Faces** To fetch all identities currently stored in the local database, use the `getFaces` method: ```swift var identities: [FaceInfo] = IncdOnboardingManager.shared.getFaces() ``` **Set Multiple Faces** To replace the entire local database with a new list of identities, use the `setFaces` method and provide a list of `FaceInfo` objects: ```swift IncdOnboardingManager.shared.setFaces(faceInfoList) ``` ### Warning This method deletes all existing entries before the new list is written. **Clear the Face Database** To remove all identities from the local database, use the `setFaces` method and provide an empty list of `FaceInfo `objects: ``` IncdOnboardingManager.shared.setFaces([]) ```
          --- - Path: `features-and-modules/video-conference` - URL: https://developer.incode.com/features-and-modules/video-conference/ - Markdown: https://developer.incode.com/features-and-modules/video-conference.md # Video Conference The Video Conference module connects the user with a live agent over video and audio to conduct an identity verification interview. The agent can request that documents be shown on camera and complete any verifications needed to meet regulatory or business requirements. The agent may be an Incode representative or an agent in your organization. Video Conference is designed for regulated markets and high-assurance scenarios where automated verification alone is insufficient. Incode's video conference design complies with the regulatory requirements issued by the Comisión Nacional Bancaria y de Valores (CNBV). ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works Video Conference is triggered after the end user completes prior modules in the session, typically ID Capture and Face Capture. When the module runs, the user is placed in a waiting queue until an available agent accepts the call. When the Video Conference module runs, the user is prompted to connect to a live call at the Conference step. A representative logs into the conference portal and answers the incoming call. Once the call is established, the representative interviews the user and conducts any verifications required by the Session configuration. The session result is recorded and tied to the user's onboarding session. The module can also be configured to require a One-Time Password (OTP) before the user connects to the call. When Conference OTP is enabled, the user must enter a code to confirm their identity before the live session begins. Video Conference uses OpenTok (Vonage) as its underlying video streaming technology. ### Agent Setup Before your agents can use Video Conference with end users, the following setup is required: - A Flow or Workflow with the Video Conference module enabled - An executive user (agent) account added to the conference portal - The conference portal URL provisioned and shared with the relevant team alongside the standard Dashboard URL ## Use Video Conference For instructions on implementing and configuring Video Conference on each supported platform, use the following pages: - [Video Conference (Dashboard)](/dashboard-platform-administration/video-conference-dashboard/) - [Video Conference (iOS)](/sdk-reference/module-conference/) - [Conference (Assisted Video) (Android)](/sdk-reference/android-conference-assisted-video/) - [Conference (React Native)](/sdk-reference/react-native-modules/#conference) --- - Path: `features-and-modules/video-selfie` - URL: https://developer.incode.com/features-and-modules/video-selfie/ - Markdown: https://developer.incode.com/features-and-modules/video-selfie.md # Video Selfie The Video Selfie module records a short video of the user performing a guided series of actions, including capturing their ID and selfie, to confirm physical presence and run liveness and face match checks. It can also capture voice consent. It is commonly used by financial institutions to meet regulatory requirements for remote identity verification. The module digitally replicates what a branch manager would do in person. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works Video Selfie is a multi-check verification step, not simply a video recording. It depends on the ID Capture and Face Capture modules being completed earlier in the session. Those modules provide the reference data for all the comparisons Video Selfie performs. During Video Selfie, the user records a short video in which they are guided to show their face. Depending on configuration, they may also be guided to show their identity document and provide spoken consent. The recording is then processed against the following checks: **Checks that contribute to the Video Selfie score:** | Check | What it does | | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Speech Recognition | Transcribes the user's spoken consent and validates it against the expected statement. Only runs when **_Voice Consent_** is enabled. | | Face Recognition | Compares the selfie captured during Video Selfie against the selfie from the prior Face Capture module step. You can configure sensitivity using **_Face Recognition Severity_**. | | Liveness | Confirms the user is physically present, not a photo or spoof, in real time during recording. | **Informational checks (do not affect score by default):** | Check | What it does | | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Face Match | Compares the ID photo from ID Capture against the ID shown during Video Selfie. | | Type of ID Match | Confirms the same document type is used throughout the session. | | OCR Match | Compares the full name extracted from the ID shown in Video Selfie against the original [OCR](/get-started-with-incode/glossary/#ocr) data. | | Back ID Type Match | Performs the same document-type check for the back of the ID. | | Back ID OCR Match | Compares back-of-ID data against original OCR data. | | Voice Consent Face Recognition | Validates that the person giving voice consent matches the prior selfie. Only runs when the Voice Consent setting is enabled. | | Hat Check | Detects whether the person is wearing a hat or other head covering during the selfie. | | Lenses Check | Detects whether the person is wearing glasses or sunglasses during the selfie. | | Mask Check | Detects whether the person’s face is covered by a mask during the selfie | | Closed Eyes Check | Detects whether the person’s eyes are closed during the selfie. | The Video Selfie score is the average of the three scoring checks above. Custom decisions based on any check can be configured to affect either the Video Selfie score or the total session score. Captured video is uploaded asynchronously after recording. The Incode Platform checks for the file every 20 seconds, up to a configurable maximum window. The default window is 4 minutes. You can configure a webhook to notify your system when processing is complete. ## Use Video Selfie For instructions on configuring your Flow or Workflow to use Video Selfie and then implementing it in your supported integration, use the following pages: - [Video Selfie (Dashboard)](/dashboard-platform-administration/video-selfie-dashboard/) - [Video Selfie (iOS)](/sdk-reference/module-video-selfie/) - [Video Selfie (Android)](/sdk-reference/android-video-selfie/) - [Video Selfie Module (Web SDK)](/sdk-reference/web-sdk-2-module-video-selfie/) - [Video Selfie (React Native)](/sdk-reference/react-native-modules/#videoselfie) - [Video Selfie (Flutter)](/sdk-reference/flutter-modules/#videoselfie) - [Video Selfie (Cordova)](/sdk-reference/cordova-modules/#addvideoselfie) --- - Path: `features-and-modules/watchlist` - URL: https://developer.incode.com/features-and-modules/watchlist/ - Markdown: https://developer.incode.com/features-and-modules/watchlist.md # Watchlist The Watchlist module screens the user's identity against sources of sanctions, Politically Exposed Persons (PEP) databases, and adverse media, returning any matches found across the configured sources. ## Integrations :white_check_mark: Web | :white_check_mark: iOS | :white_check_mark: Android ## How It Works Watchlist is a processing module, so it runs after user data has been collected earlier in the session. It needs a name and date of birth to perform a search, and it can source these from either the [Forms and Data Entry](/features-and-modules/forms-and-data-entry/) module (using the predefined questions "What is your name?" and "What is your date of birth?") or from an [ID Capture](/features-and-modules/id-capture/) module followed by [ID Validation](/features-and-modules/id-validation-module/). If both sources are present, data collected through Forms takes priority over data extracted from the ID. When the module runs, it submits the collected name and date of birth to the configured watchlist sources and returns the results. Watchlist matches on first name and last name only; middle names are not processed. The search can be scoped in several ways: - Narrowed by the customer's birth year, to reduce false positives on common names. - Filtered by one or more countries of operation, so results are limited to entities tied to those countries by nationality or residence. Country filtering does not apply to entities on sanction lists, entities with adverse media mentions only, or entities with no country assigned. These always appear regardless of the country filter. - Restricted to specific watchlist categories (such as sanctions, PEP classes, fitness-probity, or FATF-aligned adverse media categories), or to a defined search profile. Watchlist categories and search profile are mutually exclusive; only configure one or the other. - Tuned for match strictness using a fuzziness value, where lower values require closer matches to the supplied name and higher values allow looser matching. The module can also subscribe to ongoing updates for a search. When subscribed, Incode sends a notification to a configured webhook whenever the underlying watchlist data for that search changes, so downstream systems can retrieve the updated result. For setup instructions, see [Global Watchlist Webhook](/general-reference/global-watchlists-webhook/). ## Use Watchlist For instructions on implementing and configuring ID Capture on each supported platform, use the following pages: - [Watchlist (Dashboard)](/dashboard-platform-administration/watchlist-dashboard/) - [Global Watchlist (iOS)](/sdk-reference/module-global-watchlist/) - [Global Watchlist (Android)](/sdk-reference/android-global-watchlist/) - [Watchlist Module (Web SDK)](/sdk-reference/web-sdk-2-module-watchlist/) - [Global Watchlist (React Native)](/sdk-reference/react-native-modules/#globalwatchlist) - [Global Watchlist (Flutter)](/sdk-reference/flutter-modules/#globalwatchlist) To view the end user experience screens and customization options for this module, see [Watchlist and Custom Watchlist: Design and UX](/design-and-ux/watchlist-design/). --- - Path: `general-reference/accessibility` - URL: https://developer.incode.com/general-reference/accessibility/ - Markdown: https://developer.incode.com/general-reference/accessibility.md # Accessibility Manifest Incode is committed to delivering products that adhere to recognized accessibility standards and practices, including [WCAG](https://www.w3.org/TR/WCAG22/) (globally), [ADA](https://www.access-board.gov/ada/) in the US, and [EEA](https://sorry.ec.europa.eu/) in Europe. ## WCAG Criteria The Web Content Accessibility Guidelines (WCAG) outline criteria for designers and developers to enhance accessibility for individuals with general disability, like hearing, listening, or visual (from minor to severe levels). It groups compliance into three levels: Level A, Level AA, and Level AAA. Level A stands for the most fundamental level of accessibility, and Level AAA stands for the highest level of accessibility possible. It is strongly recommended that businesses adhere to the standards set out by at least the AA rating. ## Our Accessibility Audits We are continually improving our product with newest accessibility standards. ### Latest Audit Incode conducts WCAG accessibility audits at least once per year. - January 2025: Incode products are partially compliant with **WCAG 2.2** - Covered Native (Android & iOS), as well as Web - Covered Dashboard - December 2024: Incode products are partially compliant with **WCAG 2.2** - Covered Web The table below indicates the WCAG 2.2 Level AA compliance for each Incode offering. | Incode Offering | Partial compliance | Full compliance | | :--------------- | :----------------- | :-------------- | | Web SDK | X | | | Android SDK | X | | | iOS SDK | X | | | React Native SDK | X | | | Dashboard | X | | Partial compliance indicates that certain aspects of the content may not fully meet accessibility standards. Efforts are underway to ensure that all our products achieve full compliance with WCAG 2.2 level AA standards. ### Methodology For our evaluation, we used the WCAG Evaluation Method (WCAG-EM), a common procedure for auditing website accessibility. It uses the following steps: 1. Define the scope of the evaluation, including the WCAG conformance level (A, AA or AAA), technologies used, and baseline required 2. Explore the target product 3. Select a representative sample 4. Evaluate the sample 5. Report findings 1. We have evaluated all 50 Level A and Level AA success criteria from version 2.2 of the Web Content\Accessibility Guidelines. ### Accessibility support The audited website should work in at least the following browsers and assistive technologies: - Microsoft Edge (last 3 versions) - Mozilla Firefox (last 3 versions) - Google Chrome (last 3 versions) - Apple Safari (last 3 versions) - Apple Safari on iOS - Common assistive technologies ### Technologies used The audited web page relies on the following technologies: - HTML - CSS - JavaScript - WAI-ARIA - SVG - NonVisual Desktop Access (NVDA) - JAWS - ANDI / WAVE / WebAIM / IBM Scanner ### Commonly Asked Questions from Customers How often does Incode conduct a full audit for WCAG compliance? - Annually, at a minimum. Who performs the WCAG audits? - Our annual audits are performed by external certified accessibility specialists, or CPWAs. Do you have a VPAT? - Yes. A VPAT can be provided upon request. Is your WCAG testing automated or manual? - Automated tools can only detect about 30-40% of WCAG issues. We perform both automated and manual testing to identify the full spectrum of results. If an accessibility issue is identified, what is the process and typical turn-around time for remediation? - Incode works to proactively implement WCAG improvements into our platform through many channels - design, QA, and development. If an accessibility issue is identified after a release, we strive to remediate any critical and moderate findings within 90 days.
          --- - Path: `general-reference/api-error-codes` - URL: https://developer.incode.com/general-reference/api-error-codes/ - Markdown: https://developer.incode.com/general-reference/api-error-codes.md # API Error Codes The Incode Omni API uses standard HTTP status codes to indicate whether a request succeeded or failed. For certain errors, the response body also contains an Incode-specific status code that provides more precise information about what went wrong. This page covers API error codes. [SDK error handling](/general-reference/sdk-error-handling/) and Dashboard error messages are documented separately. :::note SDK error handling documentation is coming soon. In the meantime, refer to the error handling section in each platform's integration guide. ::: *** ## Error Response Format All error responses from the Omni API return a JSON object with the following structure: ```json { "timestamp": 1722948860110, "status": 4004, "error": "Bad Request", "message": "Could not find user", "path": "/omni/add/front-id/v2" } ``` | Field | Type | Description | | ----------- | ------- | -------------------------------------------------------------------- | | `timestamp` | integer | UTC timestamp of the error, in milliseconds | | `status` | integer | HTTP status code, or an Incode custom error code for `400` responses | | `error` | string | HTTP status text (e.g., `"Bad Request"`, `"Forbidden"`) | | `message` | string | Human-readable description of the error | | `path` | string | The endpoint path that returned the error | | `details` | object | Additional error context, when present | :::info When an Incode custom error code is returned, the `status` field in the response body will contain the custom code (e.g., `4004`) rather than the HTTP status code. The HTTP status of the response itself will still be `400`. ::: *** ## HTTP Status Codes The following standard HTTP status codes are used across the Omni API. | Code | Name | Description | | ----- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `200` | OK | The request succeeded. | | `400` | Bad Request | The request was invalid. This may be due to missing or malformed parameters, or an Incode-specific condition described by a custom error code in the response body. | | `403` | Forbidden | The request is not permitted. This can occur when a feature is disabled for your organization (for example, score retrieval). | | `429` | Too Many Requests | The request was rate-limited. A cooldown period must complete before retrying. This applies to OTP send operations. | | `500` | Internal Server Error | An unexpected error occurred on Incode's servers. | | `504` | Gateway Timeout | The request exceeded the allowed time limit. This can occur during external validation operations such as CURP validation. | *** ## Incode Custom Error Codes When a request fails with a `400` response, the `status` field in the response body may contain an Incode-specific error code. These codes provide more precise information than the HTTP status alone. Custom error codes are grouped below by functional area. ### Session Initialization These errors are returned by `POST /omni/start` when a session cannot be created due to configuration or parameter issues. | Code | Message | Description | | ------ | ------------------------------------------------- | --------------------------------------------------------------------------------------------------- | | `4026` | Invalid uuid parameter | The `uuid` parameter provided is not valid. | | `4027` | Invalid configurationId | The `configurationId` does not correspond to a valid configuration. | | `4028` | Flow is not activated | The specified Flow or Workflow has not been activated. Activate it in the Dashboard before use. | | `4081` | Invalid parameters for validation | One or more parameters failed validation on session start. | | `4082` | Start endpoint version forbidden in flow/workflow | The version of the `/omni/start` endpoint used is not permitted by the configured Flow or Workflow. | ### User and Identity These errors indicate that a required user record could not be found or that a conflict exists with existing user data. | Code | Message | Returned by | | ------ | ------------------------------------ | ----------------------------------------------------------------------------------------- | | `4004` | Could not find user | `POST /omni/external/send-sms`, `POST /omni/add/front-id/v2`, `POST /omni/add/back-id/v2` | | `4006` | User with given phone already exists | `POST /omni/process/approve` | ### Face and Selfie Processing These errors are returned when a face or selfie image cannot be processed successfully. They are most commonly returned by ID upload and face capture endpoints. | Code | Message | Description | | ------ | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | | `1003` | Face cropping failure | A face was detected in the image but could not be cropped successfully. | | `4010` | More than one face detected | The image contains multiple faces. Only a single face is expected. | | `4019` | Face not found | No face was detected in the submitted image. | | `4077` | Selfie image has low quality | The selfie image does not meet minimum quality requirements. | | `4078` | Selfie face is occluded or partially covered | The face in the selfie is obscured. Prompt the user to remove obstructions (glasses, masks, hands) and retry. | **Affected endpoints:** `POST /omni/add/front-id/v2`, `POST /omni/add/front-second-id/v2`, `POST /omni/add/face/third-party` ### Image Quality These errors indicate that a submitted image does not meet technical requirements. | Code | Message | Description | | ------ | ---------------------- | ------------------------------------------------------ | | `5003` | Unsatisfied image size | The image does not meet the minimum size requirements. | **Affected endpoints:** `POST /omni/add/back-id/v2` ### B2B Integration These errors are specific to B2B onboarding flows (`POST /omni/b2b/onboarding/request-new`). | Code | Message | Description | | ------ | ---------------------------------------- | --------------------------------------------------------------------------- | | `4300` | Integration not found by id | The integration ID provided does not match a known integration. | | `4301` | Employee by login factor cannot be found | An employee record matching the provided login factor could not be located. | ### OTP and Contact Verification These errors are returned by `GET /omni/send/otp`. | HTTP Code | Message | Description | | --------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------- | | `400` | Contact Already Verified | The phone number or email address is already verified for this session. | | `429` | Cooldown period not completed | An OTP was recently sent to this contact. Wait for the cooldown period to expire before requesting a new one. | ### Government Validation (Mexico) These errors apply to Mexican tax ID and identity validation endpoints. | HTTP Code | Endpoint | Description | | --------- | ------------------------- | ------------------------------------------------------------ | | `400` | `POST /api/validate/rfc` | Invalid RFC format. | | `400` | `POST /api/calculate/rfc` | Invalid input data provided for RFC calculation. | | `500` | `POST /api/validate/rfc` | Internal server error during RFC validation. | | `500` | `POST /api/calculate/rfc` | Internal server error during RFC calculation. | | `500` | CURP validation endpoints | Internal error during CURP validation. | | `504` | CURP validation endpoints | The CURP validation request exceeded the allowed time limit. | ### Score Retrieval | HTTP Code | Endpoint | Description | | --------- | --------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | `403` | `GET /omni/get/score` | Score retrieval is disabled for this organization for session users. Contact your Incode account team to enable this feature. | *** ## Known Gaps The API specification documents custom error codes for a subset of endpoints. Many endpoints that return `400 Bad Request` do not currently have custom error codes defined in the API spec. If you encounter a `400` response without a custom code from an endpoint not listed above, the `message` field in the response body is the best available source of information about the specific failure. :::note This reference will be updated as custom error codes are confirmed for additional endpoints. If you encounter an undocumented error code, contact Incode Support or your customer success manager. ::: *** ## Handling Errors A few general practices for handling Omni API errors: - **For **`400`** errors:** Check the `status` field in the response body first. If it contains a value from the custom error code tables above, use that to determine the specific failure. If `status` is `400`, fall back to the `message` field. - **For **`429`** errors:** Implement a retry with a backoff delay. Do not retry immediately — the response indicates a cooldown period is required. - **For **`500`** and **`504`** errors:** These indicate a server-side or timeout condition. Retry with exponential backoff. If errors persist, check the [Incode Status Page](/dashboard-platform-administration/check-system-status/) for any ongoing incidents. - **For **`403`** errors:** These are typically configuration issues, not transient failures. Retrying will not resolve them — contact your Incode account team. --- - Path: `general-reference/aus-kyb-prefill` - URL: https://developer.incode.com/general-reference/aus-kyb-prefill/ - Markdown: https://developer.incode.com/general-reference/aus-kyb-prefill.md # Australia eKYB Prefill in Australia leverages Australia's source of truth to automatically retrieve and populate business information based on a company's registration number, including the business name, entity type, registration status, registration date, credit rating, and other corporate details, without requiring manual input from the user. ## Source | Country | Source | Description | | --- | --- | --- | | Australia | `AU_KYB_PREFILL` | Returns matching Australian business details from Australia's source of truth for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --- | --- | --- | | `plugins` | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | `source` | Mandatory | String. Must be `AU_KYB_PREFILL`. Identifies the Prefill source. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `AU`. | | `taxId` | Mandatory | String. ACN or ABN. See [Tax ID formats](#tax-id-formats) for details. | | `businessName` | Optional | String. Registered or trading business name, used to verify the match against the source of truth. | | `address` | Optional | String. Business address, used to verify the match against the source of truth. | ### Tax ID formats Australia uses two business identifier formats. Input must be numeric only — no other lengths or formats are accepted. Requests with an invalid format return a 400 error. | Entity Type | Format | | --- | --- | | ACN (Australian Company Number) | 9 numeric digits (e.g. `000014675`) | | ABN (Australian Business Number) | 11 numeric digits (e.g. `88000014675`) | ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "AU_KYB_PREFILL", "country": "AU", "taxId": "51 824 753 556", "businessName": "ACME GROUP LIMITED", "address": "123 Example Street, Sydney NSW 2000, Australia" } ``` ### Sample response The Prefill response returns business data retrieved directly from the source of truth. Passthrough fields are returned as-is from the source, without fuzzy matching or verification scoring. Match fields (`nameMatch`, `addressMatch`) are only returned when the corresponding input (`businessName`, `address`) was submitted. ```json { "kyb-prefill": [ { "tin": "51824753556", "vatNo": "51824753556", "name": "ACME GROUP LIMITED", "nameMatch": "Verified", "address": "123 Example Street, Sydney NSW 2000, Australia", "addressMatch": "Verified", "city": "Sydney", "postalCode": "2000", "entityType": "Australian Public Company", "registrationStatus": "Active", "registrationDate": "1998-03-15", "creditRating": "A", "creditRatingDescription": "Very Low Risk", "industry": "Retail Trade", "industryDesc": "Supermarket, grocery, and general retail trade operations", "turnover": { "currency": "AUD", "value": 69346000000 }, "otherAddresses": [ { "type": "Principal Place of Business", "otherAddress": "456 Sample Avenue, Melbourne VIC 3000, Australia" } ], "directors": [ { "name": "John Sample Smith", "positionName": "Director" }, { "name": "Jane Example Doe", "positionName": "Director" } ], "otherNames": [ { "name": "ACME Retail", "businessNameType": "Main Trading Name" }, { "name": "ACME Supermarkets", "businessNameType": "Main Trading Name" } ], "activityDesc": "Supermarket and Grocery Stores" } ] } ``` :::info Some fields — `shareholders`, `employeeCount`, `ultimateParent`, and `immediateParent` — are not always present in the response. They are only returned when the source of truth has the underlying data (for example, `ultimateParent`/`immediateParent` are omitted when the entity is not itself a subsidiary of another company, and `shareholders`/`employeeCount` may be unavailable depending on the entity's filing history). This is expected and does not indicate an error. ::: ### Response fields | Key | Value | Description | | --- | --- | --- | | `tin` | Registration number | The tax ID submitted in the request (ACN), as returned and confirmed by the source of truth. | | `vatNo` | Registration number | The ABN associated with the business, as returned by the source of truth. | | `name` | Business name | The registered legal name of the business as returned from the source of truth. | | `nameMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the registered name. Only returned when `businessName` is submitted. | | `address` | Address | The registered business address as returned from the source of truth. | | `addressMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against the registered address. Only returned when `address` is submitted. | | `city` | City | The city associated with the registered business address. | | `postalCode` | Postal code | The postal code associated with the registered business address. | | `entityType` | Entity type | The legal entity type of the business (e.g. Australian Public Company). | | `registrationStatus` | Active, Expired, Unknown, Not Found | Current registration status of the business. See [Registration status values](#registration-status-values). | | `registrationDate` | Date | The date the business was registered. | | `creditRating` | Rating value (e.g. A, C) | The business's credit rating, as returned from the source of truth. | | `creditRatingDescription` | Description (e.g. Very Low Risk, Moderate Risk) | Human-readable description of the credit rating. | | `industry` | Industry sector | The primary industry sector associated with the business. | | `industryDesc` | Industry description | Description of the business's main activity. | | `turnover` | `{currency, value}` object | The business's latest reported turnover figure. May not be present for all companies (e.g. smaller/private entities with no filed financials). | | `otherAddresses` | Array of `{type, otherAddress}` | Addresses associated with the business other than the main registered address, if any. | | `shareholders` | Array of `{name, percentSharesHeld}` | Shareholder information, if available. | | `directors` | Array of `{name, positionName}` | Directors associated with the business, if available. | | `otherNames` | Array of `{name, businessNameType}` | Other registered or trading names associated with the business, if available. | | `activityDesc` | Activity description | Description of the business's classified activity. | | `employeeCount` | Number | Latest reported number of employees, if available. | | `ultimateParent` | `{name, country, registrationNumber}` | The business's ultimate parent company, if the business is a subsidiary. | | `immediateParent` | `{name, country, registrationNumber}` | The business's immediate parent company, if the business is a subsidiary. | ### Registration status values | Status | Description | | --- | --- | | Active | The business is currently registered and active. | | Expired | The business registration has lapsed. | | Unknown | The registration status could not be determined. | | Not Found | The business is inactive or could not be found in the source of truth. | ## Error responses For standard HTTP response codes, see the API Error Response page. Australia Prefill returns the following country-specific 400 errors. `taxId` is missing, empty, or not 9 or 11 numeric digits: ```json { "status": 400, "error": "Bad Request", "message": "taxId must be a valid ACN (9 digits) or ABN (11 digits), numeric only", "path": "/omni/externalVerification/ekyb-prefill" } ``` Any mandatory field (`plugins`, `source`, `country`, or `taxId`) is missing: ```json { "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` ## Single Session Dashboard results Prefill results are available on the **Business** tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/austria` - URL: https://developer.incode.com/general-reference/austria/ - Markdown: https://developer.incode.com/general-reference/austria.md # Austria eKYB Prefill in Austria leverages Austria's source of truth to automatically retrieve and populate business information based on a company's FN number or VAT number, including the business name, entity type, registration status, registration date, credit rating, and other corporate details, without requiring manual input from the user. ## Source | Country | Source | Description | | --- | --- | --- | | Austria | `AT_KYB_PREFILL` | Returns matching Austrian business details from Austria's source of truth for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --- | --- | --- | | `plugins` | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | `source` | Mandatory | String. Must be `AT_KYB_PREFILL`. Identifies the Prefill source. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `AT`. | | `taxId` | Mandatory | String. FN number or VAT number. See [Tax ID formats](#tax-id-formats) for details. | | `businessName` | Optional | String. Registered business name, used to verify the match against the source of truth. | | `address` | Optional | String. Business address, used to verify the match against the source of truth. | ### Tax ID formats Austria supports two business identifier formats as search input. Requests with an invalid format return a 400 error. | Entity Type | Format | | --- | --- | | FN (Firmenbuchnummer) | `FN` + a space + digits + a check letter (e.g. `FN 109608P`) | | VAT number | `AT` + `U` + 8 digits (e.g. `ATU25486907`) | ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "AT_KYB_PREFILL", "country": "AT", "taxId": "FN 109608P", "businessName": "", "address": "" } ``` ### Sample response The Prefill response returns business data retrieved directly from the source of truth. Passthrough fields are returned as-is from the source, without fuzzy matching or verification scoring. Match fields (`nameMatch`, `addressMatch`) are only returned when the corresponding input (`businessName`, `address`) was submitted. Field availability varies significantly by company — see the notes under each example below. **Example 1 — large, established company (with parent)** ```json { "kyb-prefill": [ { "tin": "FN 109608p", "vatNo": "ATU25486907", "name": "Sample Shoes Austria GmbH", "nameMatch": "Verified", "address": "Sample Straße 2, 9560 Sampletown", "city": "Sampletown", "postalCode": "9560", "entityType": "limited liability company", "registrationStatus": "Active", "registrationDate": "1969-08-13T00:00:00Z", "creditRating": "A", "creditRatingDescription": "Very Low Risk", "industryDesc": "Wholesale of footwear", "activityDesc": "WHOLESALE AND RETAIL TRADE", "turnover": { "currency": "EUR", "value": 56160000 }, "employeeCount": "81", "leiNumber": "5299000000000000AB12", "websites": ["https://www.sampleshoes.example"], "shareholders": [ { "name": "Sample Shoes GmbH", "percentSharesHeld": 100 } ], "ultimateParent": { "name": "SAMPLE SHOES HOLDING", "country": "DE" }, "immediateParent": { "name": "SAMPLE SHOES HOLDING", "country": "DE" }, "otherNames": [ { "name": "Sample Shoes GmbH", "businessNameType": "Previous Name" }, { "name": "Sample-Schuhfabriken Gesellschaft m.b.H.", "businessNameType": "Previous Name" } ] } ] } ``` **Example 2 — small, single-owner company** ```json { "kyb-prefill": [ { "tin": "FN 292309t", "vatNo": "ATU63372512", "name": "Sample Planning GmbH", "nameMatch": "Verified", "address": "Sample Weg B8, 7093 Sample Village", "city": "Sample Village", "postalCode": "7093", "entityType": "limited liability company", "registrationStatus": "Active", "registrationDate": "2007-04-28T00:00:00Z", "creditRating": "A", "creditRatingDescription": "Very Low Risk", "industryDesc": "Other renting and operating of own or leased real estate", "activityDesc": "REAL ESTATE ACTIVITIES", "employeeCount": "1", "shareholders": [ { "name": "Sample Owner Name", "percentSharesHeld": 100 } ], "otherNames": [ { "name": "Sample Architect Studio GmbH", "businessNameType": "Previous Name" }, { "name": "Sample Planning GmbH (old)", "businessNameType": "Previous Name" } ] } ] } ``` **Example 3 — large holding-type entity (cross-border parent)** ```json { "kyb-prefill": [ { "tin": "FN 364103x", "name": "Sample Glass Trading GmbH", "nameMatch": "Verified", "address": "Sample Platz 7, 1010 Sample City", "city": "Sample City", "postalCode": "1010", "entityType": "limited liability company", "registrationStatus": "Active", "registrationDate": "2011-06-17T00:00:00Z", "creditRating": "A", "creditRatingDescription": "Very Low Risk", "industryDesc": "Wholesale of china and glassware and cleaning materials", "activityDesc": "WHOLESALE AND RETAIL TRADE", "employeeCount": "0", "leiNumber": "5299000000000000CD34", "shareholders": [ { "name": "Sample Green Energy GmbH", "percentSharesHeld": 100 } ], "ultimateParent": { "name": "SAMPLE GLASS HOLDING GMBH", "country": "LI" }, "immediateParent": { "name": "SAMPLE GLASS HOLDING GMBH", "country": "LI" }, "otherNames": [ { "name": "Sample-East Glass Trading GmbH", "businessNameType": "Previous Name" } ] } ] } ``` :::info Field availability differs significantly by company, regardless of size. `vatNo`, `turnover`, `leiNumber`, `ultimateParent`/`immediateParent`, and `websites` may all be absent even for large, established companies — this is expected and does not indicate an error. ::: ### Response fields | Key | Value | Description | | --- | --- | --- | | `tin` | FN number | Firmenbuchnummer, as returned from the source of truth. | | `vatNo` | VAT number | May not be present, even for large companies. | | `name` | Business name | The registered legal name of the business as returned from the source of truth. | | `nameMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the registered name. Only returned when `businessName` is submitted. | | `address` | Address | The registered business address as returned from the source of truth. | | `addressMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against the registered address. Only returned when `address` is submitted. | | `city` | City | The city associated with the registered business address, when available. | | `postalCode` | Postal code | The postal code associated with the registered business address, when available. | | `entityType` | Entity type | The legal entity type of the business (e.g. limited liability company). Defaults to "Unknown" when not available. | | `registrationStatus` | Active, Expired, Unknown, Not Found | Current registration status of the business. Defaults to "Unknown" when not available. | | `registrationDate` | Date | The date the business was registered. | | `creditRating` | Rating value (e.g. A, C) | The business's credit rating, as returned from the source of truth. Defaults to "Unknown" when not available. | | `creditRatingDescription` | Description (e.g. Very Low Risk) | Human-readable description of the credit rating. Defaults to "Unknown" when not available. | | `industryDesc` | Industry description | A specific description of the business's main activity (e.g. "Wholesale of footwear"). | | `activityDesc` | Activity description | A broader category describing the business's principal activity (e.g. "WHOLESALE AND RETAIL TRADE"). Genuinely distinct from `industryDesc` for Austria. | | `turnover` | `{currency, value}` object | The business's latest reported turnover figure. May not be present. | | `employeeCount` | Number (as string) | Latest reported number of employees. May not be present, or may be `"0"` for pure holding entities. | | `shareholders` | Array of `{name, percentSharesHeld}` | Shareholder information. May be an individual person or a corporate entity. | | `directors` | Array of `{name, positionName}` | Directors associated with the business, if available. May not be present. | | `ultimateParent` | `{name, country}` | The business's ultimate parent company, if the business is a subsidiary. May not be present. | | `immediateParent` | `{name, country}` | The business's immediate parent company, if the business is a subsidiary. May not be present. | | `leiNumber` | LEI | Legal Entity Identifier, if available. May not be present for smaller companies. | | `otherNames` | Array of `{name, businessNameType}` | Former legal names of the business, with `businessNameType` set to `"Previous Name"`. | | `websites` | Array of strings | Websites associated with the business, if available. | ## Error responses For standard HTTP response codes, see the API Error Response page. Austria Prefill returns the following country-specific 400 errors. `taxId` is not a valid FN number (`FN` + digits + check letter) or VAT number (`AT` + `U` + 8 digits): ```json { "status": 400, "error": "Bad Request", "message": "taxId must be a valid Austrian FN number or VAT number", "path": "/omni/externalVerification/ekyb-prefill" } ``` Any mandatory field (`plugins`, `source`, `country`, or `taxId`) is missing: ```json { "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` No business match is found for the submitted `taxId`: ```json { "timestamp": 1782851583695, "status": 200, "message": "No business found matching the provided tax ID.", "path": "/omni/externalVerification/ekyb-prefill" } ``` ## Single Session Dashboard results Prefill results are available on the **Business** tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/authorizing-webhooks-requests` - URL: https://developer.incode.com/general-reference/authorizing-webhooks-requests/ - Markdown: https://developer.incode.com/general-reference/authorizing-webhooks-requests.md # Authorizing Webhook Requests with OAuth 2.0 If your system uses OAuth 2.0 for authentication and authorization, you can ensure that every webhook request to your Incode system is authenticated. You can define these three authentication parameters: * `authentication URL` * `client_id` * `client_secret` To define these parameters, go to`Dashboard > Configuration > General`. # Request Authentication Flow When you configure authentication for webhook requests, Incode exchanges the `client_id` and `client_secret` for an access token. This token is then used to send future notifications. This image shows a sample request issued to the authentication URL you configure in the Incode Dashboard. ```curl cURL curl --location '' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --header 'Authorization: Basic ' \ --data 'grant_type=client_credentials' ``` The following image shows an expected response example, which is a JSON body with two fields: `access token`, and `expires_in`: ```json json { "access_token": "", //String, mandatory. Access token to be usend when sending notifications. "expires_in": 0000000000 //Number, mandatory. Access token expiration time in seconds. } ``` --- - Path: `general-reference/belgium` - URL: https://developer.incode.com/general-reference/belgium/ - Markdown: https://developer.incode.com/general-reference/belgium.md # Belgium eKYB Prefill in Belgium leverages Belgium's source of truth to automatically retrieve and populate business information based on a company's BCE/KBO number or VAT number, including the business name, entity type, registration status, registration date, credit rating, and other corporate details, without requiring manual input from the user. ## Source | Country | Source | Description | | --- | --- | --- | | Belgium | `BE_KYB_PREFILL` | Returns matching Belgian business details from Belgium's source of truth for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --- | --- | --- | | `plugins` | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | `source` | Mandatory | String. Must be `BE_KYB_PREFILL`. Identifies the Prefill source. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `BE`. | | `taxId` | Mandatory | String. BCE/KBO number or VAT number. See [Tax ID formats](#tax-id-formats) for details. | | `businessName` | Optional | String. Registered business name, used to verify the match against the source of truth. | | `address` | Optional | String. Business address, used to verify the match against the source of truth. | ### Tax ID formats Belgium supports two business identifier formats as search input. Requests with an invalid format return a 400 error. | Entity Type | Format | | --- | --- | | BCE/KBO number | 9 numeric digits, no prefix (e.g. `656908546`) | | VAT number | `BE0` + the same 9-digit BCE number (e.g. `BE0656908546`) | ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "BE_KYB_PREFILL", "country": "BE", "taxId": "656908546", "businessName": "", "address": "" } ``` ### Sample response The Prefill response returns business data retrieved directly from the source of truth. Passthrough fields are returned as-is from the source, without fuzzy matching or verification scoring. Match fields (`nameMatch`, `addressMatch`) are only returned when the corresponding input (`businessName`, `address`) was submitted. Field availability varies significantly by company — see the notes under each example below. **Example 1 — purchasing cooperative (large turnover, small headcount)** ```json { "kyb-prefill": [ { "tin": "123456789", "vatNo": "BE0123456789", "name": "SAMPLE TRADING CV", "nameMatch": "Verified", "address": "Sample Straat 10, 1040 Sample City", "city": "Sample City", "postalCode": "1040", "entityType": "Cooperative company", "registrationStatus": "ACTIVE", "registrationDate": "2016-06-22T00:00:00Z", "creditRating": "B", "creditRatingDescription": "Low Risk", "industryDesc": "Activities of business and employers membership organisations", "turnover": { "currency": "EUR", "value": 13390642077 }, "employeeCount": "39", "shareholders": [ { "name": "SAMPLE HOLDING SA", "percentSharesHeld": 32.67 } ], "directors": [ { "name": "SAMPLE DIRECTOR NAME", "positionName": "Director" } ], "otherAddresses": [ { "otherAddress": "Sample Straat 10 1040 Sample City" } ], "otherNames": [ { "name": "SAMPLE TRADING", "businessNameType": "Trading Name" } ] } ] } ``` **Example 2 — multinational subsidiary (cross-border parent)** ```json { "kyb-prefill": [ { "tin": "987654321", "vatNo": "BE0987654321", "name": "SAMPLE CHOCOLATE BELGIUM SA", "nameMatch": "Verified", "address": "Sample Dreve 13, 7700 Sample Town", "city": "Sample Town", "postalCode": "7700", "entityType": "Public limited company", "registrationStatus": "ACTIVE", "registrationDate": "1997-09-24T00:00:00Z", "industryDesc": "Wholesale of sugar, chocolate and sugar confectionery", "turnover": { "currency": "EUR", "value": 48835433 }, "employeeCount": "270", "websites": ["http://www.samplechocolate.example"], "shareholders": [ { "name": "SAMPLE HOLDING FRANCE SAS", "percentSharesHeld": 100 } ], "ultimateParent": { "name": "SAMPLE NETHERLANDS HOLDING B.V.", "country": "NL" }, "immediateParent": { "name": "SAMPLE NETHERLANDS HOLDING B.V.", "country": "NL" }, "otherAddresses": [ { "otherAddress": "Sample Dreve(L) 13 7700 Sample Town" }, { "otherAddress": "Sample Lei 37 2018 Sample City" } ], "otherNames": [ { "name": "SAMPLE CHOCOLATE BELGIUM NV", "businessNameType": "Trading Name" } ] } ] } ``` **Example 3 — small boutique with a distinct trading name** ```json { "kyb-prefill": [ { "tin": "456789123", "vatNo": "BE0456789123", "name": "SAMPLE BOUTIQUE BVBA", "nameMatch": "Verified", "address": "Sample Walletje 20 C, 8300 Sample Coast", "city": "Sample Coast", "postalCode": "8300", "entityType": "Private limited liability company", "registrationStatus": "ACTIVE", "registrationDate": "2010-07-30T00:00:00Z", "industryDesc": "Tour operator activities", "otherNames": [ { "name": "SAMPLE LUXURY BRAND BOUTIQUE", "businessNameType": "Trading Name" } ] } ] } ``` :::info Field availability differs significantly by company. `turnover`, `employeeCount`, `shareholders`, `directors`, `websites`, `otherAddresses`, and `creditRating` may all be absent for a given company — this is expected and does not indicate an error. `ultimateParent`/`immediateParent` are absent for companies that sit at the top of their own group. ::: ### Response fields | Key | Value | Description | | --- | --- | --- | | `tin` | BCE/KBO number | 9-digit registration number, as returned from the source of truth. | | `vatNo` | VAT number | `BE0` + the 9-digit BCE number. | | `name` | Business name | The registered legal name of the business as returned from the source of truth. | | `nameMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the registered name. Only returned when `businessName` is submitted. | | `address` | Address | The registered business address as returned from the source of truth. | | `addressMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against the registered address. Only returned when `address` is submitted. | | `city` | City | The city associated with the registered business address, when available. | | `postalCode` | Postal code | The postal code associated with the registered business address, when available. | | `entityType` | Entity type | The legal entity type of the business (e.g. Cooperative company, Public limited company). Defaults to "Unknown" when not available. | | `registrationStatus` | Active, Expired, Unknown, Not Found | Current registration status of the business. Defaults to "Unknown" when not available. | | `registrationDate` | Date | The date the business was registered. | | `creditRating` | Rating value (e.g. A, B) | The business's credit rating, as returned from the source of truth. Defaults to "Unknown" when not available. | | `creditRatingDescription` | Description (e.g. Low Risk) | Human-readable description of the credit rating. Defaults to "Unknown" when not available. | | `industryDesc` | Industry description | Description of the business's main activity. May not reflect the company's actual current business activity in all cases. | | `activityDesc` | Activity description | Description of the business's principal activity. Same data-quirk caveat as `industryDesc`. | | `turnover` | `{currency, value}` object | The business's latest reported turnover figure. May not be present. | | `employeeCount` | Number (as string) | Latest reported number of employees, if available. | | `shareholders` | Array of `{name, percentSharesHeld}` | Shareholder information. May not be present, or may only reflect a partial capitalization table for large companies. | | `directors` | Array of `{name, positionName}` | Directors associated with the business, if available. | | `ultimateParent` | `{name, country}` | The business's ultimate parent company, if the business is a subsidiary. Absent when the entity sits at the top of its own group. | | `immediateParent` | `{name, country}` | The business's immediate parent company, if the business is a subsidiary. Absent when the entity sits at the top of its own group. | | `otherNames` | Array of `{name, businessNameType}` | The business's trading name, with `businessNameType` set to `"Trading Name"`. Usually identical to `name`, but can genuinely differ. | | `otherAddresses` | Array of `{otherAddress}` | Addresses associated with the business other than the main registered address, if any. May not be present for smaller companies. | | `websites` | Array of strings | Websites associated with the business, if available. | ## Error responses For standard HTTP response codes, see the API Error Response page. Belgium Prefill returns the following country-specific 400 errors. `taxId` is not a valid BCE/KBO number (bare 9 digits) or VAT number (`BE0` + 9 digits): ```json { "status": 400, "error": "Bad Request", "message": "taxId must be a valid Belgian BCE/KBO number or VAT number", "path": "/omni/externalVerification/ekyb-prefill" } ``` Any mandatory field (`plugins`, `source`, `country`, or `taxId`) is missing: ```json { "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` No business match is found for the submitted `taxId`: ```json { "timestamp": 1782851583695, "status": 200, "message": "No business found matching the provided tax ID.", "path": "/omni/externalVerification/ekyb-prefill" } ``` ## Single Session Dashboard results Prefill results are available on the **Business** tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/coverage-hub` - URL: https://developer.incode.com/general-reference/coverage-hub/ - Markdown: https://developer.incode.com/general-reference/coverage-hub.md # Incode Coverage Hub Four sections of the documentation define what Incode supports in a given country. Use this hub to find country-specific policies, accepted document types, and verification sources. *** ## Supported IDs **What this covers:** The full catalog of government-issued identity documents that Incode can classify, read, and extract data from using OCR. Organized by region: Africa, Asia, Caribbean, Europe, North and Central America, Oceania, and South America. **Question this answers:** Can Incode's camera capture and OCR read this physical document? **When it applies:** Use this when you need to confirm that a specific document type from a specific country is recognized by the platform. [View supported IDs →](/general-reference/supported-ids/) *** ## Government Verification Sources (System of Records) **What this covers:** After a user submits an ID document and biometric, Incode cross-checks the extracted data against official government registries to confirm the document is authentic and currently valid. Country-specific pages detail which registries are used and what data fields are validated. **Question this answers:** Can Incode validate this identity against a government registry? **When it applies:** Use this when your compliance requirements demand that identity data be validated at the source, not just scanned and extracted. [View verification sources →](/general-reference/government-verification-sources/) *** ## eKYC Coverage **What this covers:** Verifying a customer's identity without physical documents. Incode checks submitted data directly against authoritative country sources such as voter registers, credit bureaus, civil registries, and telecom records. Sub-pages provide country-specific data source details and supported fields. **Question this answers:** Can Incode verify this person's data against a private or government data source? **When it applies:** Use this when your flow needs data-only KYC without a document scan. [View eKYC coverage →](/general-reference/ekyc-coverage/) *** ## KYB Coverage **What this covers:** Instant access to verified company information from official registries worldwide, including registration status, legal entity type, tax ID, address, and UBO/director details. Sub-pages provide country-specific source details and supported fields. **Question this answers:** Can Incode verify this business against a country's business registry? **When it applies:** Use this when onboarding a business rather than an individual, or when you need to confirm a company's legitimacy before extending services. View KYB coverage → > 📘 Note > > Not all countries and data sources are live in production. Contact the sales team to learn more about our expanding network.
          --- - Path: `general-reference/curp-validation-error-codes-reference` - URL: https://developer.incode.com/general-reference/curp-validation-error-codes-reference/ - Markdown: https://developer.incode.com/general-reference/curp-validation-error-codes-reference.md # CURP Validation Error Codes Incode uses a third party provider to access the official RENAPO records. Errors while requesting the CURP validation might come from different sources: Provider and RENAPO. The details of the error will be included within the `error` field in the response. * The errors from the Provider suggest a connectivity error. These are provided via a pair of fields: `codigoRespuesta` and `descripcionRespuesta`. * RENAPO errors are of a different nature, as they indicate errors with the CURP data itself or RENAPO internal errors. These errors are provided with a pair of fields: `tipoError` and `codigoError` ## Provider Error Codes Errors originated directly from the Provider do not reach to query the information at the RENAPO services. When an error happens at the Provider level, you should get a response similar to these: ```json { "success": false, "error": { "descripcionRespuesta": "LOS DATOS SON INCORRECTOS", "codigoRespuesta": "03", "codigoError": "06", "tipoError": "01", }, "result": "error" } ``` ```json { "success": false, "error": { "codigoRespuesta": "01", "descripcionRespuesta": "SIN RESPUESTA DE RENAPO", "referencia": "", "respuestaRENAPO": null }, "result": "" } ``` Here are the possible values of the `codigoRespuesta` and `descripcionRespuesta` fields: | codigoRespuesta | descripcionRespuesta | descripcionRespuesta | |---|---|---| | 01 | SIN RESPUESTA DE RENAPO | No response from RENAPO | | 02 | SERVIDOR SVBI NO RESPONDE
          SE HA ALCANZADO EL LIMITE DE TRANSACCIONES PERMITIDAS POR MES
          SE HA ALCANZADO EL LIMITE DE TRANSACCIONES PERMITIDAS POR MINUTO
          SE HA ALCANZADO EL LÍMITE DE TRANSACCIONES PERMITIDAS POR DIA | * SVBI server is not responding
          * The limit of transactions allowed per month has been reached
          * The limit of transactions allowed per minute has been reached
          * The limit of transactions allowed per day has been reached | | 03 | LOS DATOS SON INCORRECTOS | Data is incorrect | | 05 | ERROR INESPERADO | Unexpected error | ## Renapo Error Codes When a CURP validation request is successful (meaning, RENAPO responded), you will get a response that looks like the following: ```json { "success": false, "error": { "codigoError": "06", "tipoError": "01", "message": "", }, "result": "", "renapo_valid": false } ``` Errors are divided in 3 groups. You can identify them by the `tipoError` and `codigoError` fields. * Group 1: Errors most likely to be found. Might be due to incorrect CURP input in the session. * Group 2: Connectivity errors (within RENAPO). Most of these should be transient and might require you to retry. * Group 3: Internal errors. These should not be found. Please reach out to Incode technical support if you find any of these. **Group 1** | tipoError | codigoError | message | Description | | --------- | ----------- | ------------------------------------------------------ | :------------------------------------------------- | | 01 | 04 | CURP previamente dada de baja | The CURP was previously deactivated. | | 01 | 06 | La CURP no se encuentra en la base de datos. | The CURP is not found in the database. | | 01 | 09 | La llave de la CURP no está bien formada. | The CURP key is not correctly formatted. | | 01 | 20 | Más de una CURP para estos datos | More than one CURP exists for this data. | | 01 | 90 | Curp status is not acceptable | Curp status is not acceptable | | 03 | 01 | \[Nombre campo]: No cumple con el formato especificado | \[Field name]: Does not meet the specified format. |
          For **Group 2** and **Group 3** , you can handle the same meaning for all combinations: | tipoError | codigoError | Meaning | Group | | --------- | ----------- | -------------------- | ------- | | 01 | 13 | **Connection Error** | Group 2 | | 01 | 14 | **Connection Error** | Group 2 | | 01 | 18 | **Connection Error** | Group 2 | | 02 | 01 | **Connection Error** | Group 2 | | 02 | 02 | **Connection Error** | Group 2 | | 02 | 03 | **Connection Error** | Group 2 | | 04 | 01 | **Connection Error** | Group 2 | | 99 | 01 | **Connection Error** | Group 2 | | 99 | 02 | **Connection Error** | Group 2 | | 01 | 01 | **Internal Error** | Group 3 | | 01 | 02 | **Internal Error** | Group 3 | | 01 | 03 | **Internal Error** | Group 3 | | 01 | 05 | **Internal Error** | Group 3 | | 01 | 07 | **Internal Error** | Group 3 | | 01 | 08 | **Internal Error** | Group 3 | | 01 | 10 | **Internal Error** | Group 3 | | 01 | 11 | **Internal Error** | Group 3 | | 01 | 12 | **Internal Error** | Group 3 | | 01 | 15 | **Internal Error** | Group 3 | | 01 | 16 | **Internal Error** | Group 3 | | 01 | 17 | **Internal Error** | Group 3 | | 01 | 19 | **Internal Error** | Group 3 | | 03 | 02 | **Internal Error** | Group 3 | | 05 | 01 | **Internal Error** | Group 3 |
          In case there is a communication error and it was not possible to establish a connection with the provider, you will see the following message: "The CURP validation service is not available": ```json { "success": false, "error": { "codigoError": "01", "tipoError": "99", "message": "The CURP validation service is not available" }, "result": "The CURP validation service is not available", "renapo_valid": false } ``` --- - Path: `general-reference/dmv-data-match-technical-details` - URL: https://developer.incode.com/general-reference/dmv-data-match-technical-details/ - Markdown: https://developer.incode.com/general-reference/dmv-data-match-technical-details.md # DMV Data Match Technical Details GovDataMatch is Incode's data verification service through AAMVA or through validation of Verifiable Credentials. During verification, the supported document data fields are validated against the data on the record held by the issuing state's DMV. GovDataMatch is part of the overall [US GovMatch](https://developer.incode.com/update/docs/united-states-govmatch) offering. ## Decisioning When a connection is made and the provided Document Number matches to a record within the state DMV system, the supported data fields collected from the session are sent to the GovDataMatch provider for verification. Below are all data fields that could be available for matching. Not all participating states support all 5. * `"firstName"` * `"paternalLastName"` * `"birthDate"` * `"issueDate"` * `"expirationDate"` Decisioning should be based on the `status` value in the `overall` object. The `status` value can be: * **OK**: Data Match is successful * **FAIL**: Data Match is unsuccessful The default AAMVA DLDV score is 100, with each data field that returns `FAIL` status causing a 15 point score deduction. The total module score is computed after all data field matches are complete. This calculation determines whether the overall module passed or failed: * **OK**: 2 or fewer fields failed, or a module score of 70 or greater * **FAIL**: More than 2 fields failed, or a module score of less than 70 GovDataMatch supports NY through the validation of the Verifiable Credential within the document. A successful Data Match confirms the document was issued by the New York Department of Motor Vehicles and the identity data in the barcode has not been altered or tampered with. Results are returned as OK (100.0) or FAIL (0.0). Note: supports New York driver’s licenses and ID cards issued after 2005 ## Standalone API `POST` `/omni/process/government-validation?countryCode=USA` ### Request Body ```json { "idNumber": "D12345678", "firstName": "JOHNTEST", "paternalLastName": "DOETEST", "birthDate": "03-16-1990", "issueDate": "01-15-2020", "expirationDate": "01-15-2028", "issuerState": "TX" } ``` ### Response Body ```json { "valid": true, "statusCode": 0, "governmentValidation": { "validationStatus": { "value": "0", "status": "OK", "key": "ok" }, "ocrValidation": [ { "value": "true", "status": "OK", "key": "documentNumber" }, { "value": "true", "status": "OK", "key": "firstName" }, { "value": "true", "status": "OK", "key": "paternalLastName" }, { "value": "true", "status": "OK", "key": "birthDate" }, { "value": "true", "status": "OK", "key": "issueDate" }, { "value": "true", "status": "OK", "key": "expirationDate" } ], "ocrValidationOverall": { "value": "100.0", "status": "OK" }, "overall": { "value": "100.0", "status": "OK" }, "provider": "GOVDATAMATCH" } } ``` ### Response Details The response for GovDataMatch is contained within the `governmentValidation` object. This object contains the following fields: | Field | Type | Description | |---|---|---| | `validationStatus` | StatusValue | Provider status code for error handling. Contains a `value`, `status`, and `key`. See [below](#statusvalue-keyvalue-pairs) for more information. | | `ocrValidation`
          _Optional_ | Array[StatusValue] | Individual data field match results. Each data field result contains a `value`, `status`, and `key`. See [below](#statusvalue-keyvalue-pairs) for more information. | | `ocrValidationOverall`
          _Optional_ | StatusValue | Percentage of OCR fields that matched. Supplementary data for analysis. Contains a `value` and `status`. See [below](#statusvalue-keyvalue-pairs) for more information. | | `overall` | StatusValue | Primary verification result. Use this field to determine pass/fail. Contains a `value` and `status`. See [below](#statusvalue-keyvalue-pairs) for more information. | | `provider`
          _Optional_ | String | Indicates whether the request was sent to GovFaceMatch (`GOVFACEMATCH`) or GovDataMatch (`GOVDATAMATCH`). Only present for US verification. | #### StatusValue key/value pairs This object contains the following fields: | Field | Type | Description | |---|---|---| | `value`
          _Optional_ | String | The numeric or boolean value. | | `status` | String | The status code. Possible statuses are:

          - `OK`: User passed verification.
          - `FAIL`: Data did not match during validation.
          - `UNKNOWN`: GovDataMatch was run, but the submitted document or region isn't supported or something went wrong when trying to perform validation. | | `key`
          _Optional_ | String | The key for which the status is being reported. For example, `firstName`, `birthDate`, or `documentNumber`. | ### Error Codes If these errors appear for a legitimate user, or if the errors persist, submit a support ticket through [http://support.incode.com/](http://support.incode.com/) for further investigation. | Reason Code | Description | Status | Next Steps | | :---------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------- | :-------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `providerNotConfigured` | **Provider Not Configured** Provider is not configured or is incorrectly configured for this flow. | `UNKNOWN` | Submit a support ticket through [http://support.incode.com/](http://support.incode.com/) to troubleshoot issues with your configuration. | | `missingDocumentId` | **Missing Document Number** Document number missing or has an invalid pattern. | `UNKNOWN` | Check ID capture quality for barcode/OCR readability issues. | | `invalidExpirationDate` | **Invalid Expiration Date** Expiration date is not valid per document standards. | `UNKNOWN` | Check ID capture quality for barcode/OCR readability issues. If user is legitimate, submit a support ticket through [http://support.incode.com/](http://support.incode.com/) for further investigation. | | `notEnoughData` | **Missing Required Data**
          One or more required fields are missing or invalid. | `UNKNOWN` | Ensure all required fields are provided by user into session. | | `documentTypeNotSupported` | **Document Type Not Supported** Invalid document type for validation by the configured provider. | `UNKNOWN` | Ensure the user is providing a supported document type. | | `geographicRegionNotSupported` | **Country Not Supported** Document country not supported by the configured provider. | `UNKNOWN` | Verify the user is providing supported document and countries are provisioned correctly. | | `geographicStateRegionNotSupported` | **State Not Supported** Document state not supported by the configured provider. | `UNKNOWN` | Verify the user is providing supported document and states are provisioned correctly. | | `connectionError` | **Provider Connection Error**
          Error occurred during processing within provider environment. | `UNKNOWN` | Try again later; if issue persists, submit a support ticket through [http://support.incode.com/](http://support.incode.com/). | | `infrastructureError` | **Incode Processing Error**
          Error occurred during processing within Incode environment. | `UNKNOWN` | Try again later; if issue persists, submit a support ticket through [http://support.incode.com/](http://support.incode.com/). | | `null` | If government validation status is not present, then it means the module was not run. | `UNKNOWN` | Try again later; if issue persists, submit a support ticket through [http://support.incode.com/](http://support.incode.com/). | | `userNotFound` | **User Not Found**
          ID not found in government database. | `FAIL` | Check data extraction quality. If user is legitimate, submit a support ticket through [http://support.incode.com/](http://support.incode.com/) for further investigation. | | `documentNumberMismatch` | **Document Number Mismatch**
          Record exists in government database but the person may be deceased or were issued a different more recent number. | `FAIL` | Check data extraction quality. If user is legitimate, ask that a newer identity document is used for verification or submit a support ticket through http\://support.incode.com/ for further investigation. | --- - Path: `general-reference/dmv-face-match-technical-details` - URL: https://developer.incode.com/general-reference/dmv-face-match-technical-details/ - Markdown: https://developer.incode.com/general-reference/dmv-face-match-technical-details.md # GovFaceMatch Technical Details GovFaceMatch is Incode’s direct connection to state DMV systems for biometric face comparison. During verification, the supported document data fields are sent to the DMV. If the document data fields match to a record within the DMV database, the uploaded selfie is compared against the official portrait stored in the state’s DMV database. A successful Face Match guarantees that the Data Match also passed, and provides the highest level of assurance that the person presenting the document is the legitimate holder. GovFaceMatch is part of the overall [US GovMatch](/general-reference/united-states-govmatch/) offering. *** ## Decisioning State requirements mandate that certain data fields must match before Incode can access the DMV selfie. Face matching only occurs after this data match succeeds. Therefore, a successful Face Match guarantees that the Data Match also passed. Decisioning should be based on the `status` value in the `overall` object. The `status` value can be: * **OK**: Face Match is successful * **FAIL**: Face Match is unsuccessful * Did not meet Must-Match requirements of the state OR * Met Must-Match requirements of the state, but uploaded face image did not match official photograph stored in the state's DMV database Most states return a face match confidence score with a passing threshold of 77. Due to variability of image quality by state, face match confidence thresholds vary, and not every state may provide that level of granularity. Numeric match confidence is provided where applicable and acceptance thresholds are subject to change. When numeric match confidence is not returned, a simple pass (100.0) / fail (0.0) is used when determining a match. For California, the following data must meet the listed match requirements: * Document Number: Exact match * First 3 letters of Last Name: Partial match * Date of Birth: Exact match For Georgia, Mississippi, and Virginia, the following data must meet the listed match requirements: * Document Number: Exact match * First Name: Exact match * Last Name: Exact match * Date of Birth: Exact match *** ## Standalone API `POST` `/omni/process/government-validation?countryCode=USA` To retrieve the results of GovMatch, use the [Fetch Scores endpoint](/reference/getscores/). When government record verification is enabled for your organization, a `governmentValidation` field is present in the endpoint results. ### Request Body ```json { "idNumber": "T123456789", "firstName": "EMILYTEST", "paternalLastName": "DAVISTEST", "birthDate": "1987-04-18", "base64Image": "{{selfie}}", "issuerState": "VA" } ``` ### Response Body ```json { "valid": true, "statusCode": 0, "governmentValidation": { "recognitionConfidence": { "value": "100.0", "status": "OK" }, "validationStatus": { "value": "0", "status": "OK", "key": "ok" }, "ocrValidation": [ { "value": "true", "status": "OK", "key": "documentNumber" }, { "value": "true", "status": "OK", "key": "firstName" }, { "value": "true", "status": "OK", "key": "paternalLastName" }, { "value": "true", "status": "OK", "key": "birthDate" } ], "ocrValidationOverall": { "value": "100.0", "status": "OK" }, "overall": { "value": "100.0", "status": "OK" }, "provider": "GOVFACEMATCH" } } ``` ### Response Details The response for GovFaceMatch is contained within the `governmentValidation` object. This object contains the following fields: | **Field** | Type | **Description** | | --------------------------------------- | ------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `validationStatus` | StatusValue | Provider status code for error handling. Contains a `value`, `status`, and `key`. See [below](#statusvalue-keyvalue-pairs) for more information. | | `ocrValidation`
          _Optional_ | Array\[StatusValue] | Individual data field match results. Each data field result contains a `value`, `status`, and `key`. See [below](#statusvalue-keyvalue-pairs) for more information. | | `recognitionConfidence`
          _Optional_ | StatusValue | Face Match confidence score. Only present for GovFaceMatch; indicates biometric verification was performed. Contains a `value` and `status`. See [below](#statusvalue-keyvalue-pairs) for more information. | | `ocrValidationOverall`
          _Optional_ | StatusValue | Percentage of OCR fields that matched. Supplementary data for analysis. Contains a `value` and `status`. See [below](#statusvalue-keyvalue-pairs) for more information. | | `overall` | StatusValue | Primary verification result. Use this field to determine pass/fail. Contains a `value` and `status`. See [below](#statusvalue-keyvalue-pairs) for more information. | | `provider`
          _Optional_ | String | Indicates whether the request was sent to GovFaceMatch (`GOVFACEMATCH`) or GovDataMatch (`GOVDATAMATCH`). Only present for US verification. | #### StatusValue key/value pairs Any field listed as StatusValue in the table above contains a `value` and a `status`. Some also contain a `key`. | Field | Type | Description | |---|---|---| | `value`
          _Optional_ | String | The numeric or boolean value. | | `status` | String | The status code. Possible statuses are:

          - `OK`: User passed verification.
          - `FAIL`: Either data or face did not match during validation.
          - `UNKNOWN`: GovFaceMatch was run, but the submitted document or region isn’t supported or something went wrong when trying to perform validation. | | `key`
          _Optional_ | String | The key for which the status is being reported. For example, `firstName`, `birthDate`, or `documentNumber`. | #### Error Codes If these errors appear for a legitimate user, or if the errors persist, submit a support ticket through [http://support.incode.com/](http://support.incode.com/) for further investigation. | Reason Code | Description | Status | Next Steps | |---|---|---|---| | `providerNotConfigured` | **Provider Not Configured**
          Provider is not configured or is incorrectly configured for this flow. | `UNKNOWN` | Submit a support ticket through [http://support.incode.com/](http://support.incode.com/) to troubleshoot issues with your configuration. | | `missingDocumentId` | **Missing Document Number**
          Document number missing or has an invalid pattern. | `UNKNOWN` | Check ID capture quality for barcode/OCR readability issues. | | `invalidExpirationDate` | **Invalid Expiration Date**
          Expiration date is not valid per document standards. | `UNKNOWN` | Check ID capture quality for barcode/OCR readability issues. If user is legitimate, submit a support ticket through [http://support.incode.com/](http://support.incode.com/) for further investigation. | | `notEnoughData` | **Missing Required Data**
          One or more required fields are missing or invalid. | `UNKNOWN` | Ensure all required fields are provided by the user in the session. | | `missingSelfie` | **Missing Selfie**
          Provider requires selfie for processing but not provided in session. | `UNKNOWN` | Ensure the user provides a selfie in the session. | | `selfieChecksFailed` | **Selfie Image Quality Check Failed**
          Higher-quality selfie needed for processing by provider. | `UNKNOWN` | Ensure the user retakes a higher-quality selfie (e.g. check brightness, blurriness, face mask, occlusion). | | `documentTypeNotSupported` | **Document Type Not Supported**
          Invalid document type for validation by the configured provider. | `UNKNOWN` | Ensure the user is providing a supported document type. | | `geographicRegionNotSupported` | **Country Not Supported**
          Document country not supported by the configured provider. | `UNKNOWN` | Verify the user is providing a supported document and countries are provisioned correctly. | | `geographicStateRegionNotSupported` | **State Not Supported**
          Document state not supported by the configured provider. | `UNKNOWN` | Verify the user is providing a supported document and states are provisioned correctly. | | `connectionError` | **Provider Connection Error**
          Error occurred during processing within provider environment. | `UNKNOWN` | Try again later; if issue persists, submit a support ticket through [http://support.incode.com/](http://support.incode.com/). | | `infrastructureError` | **Incode Processing Error**
          Error occurred during processing within Incode environment. | `UNKNOWN` | Try again later; if issue persists, submit a support ticket through [http://support.incode.com/](http://support.incode.com/). | | `null` | If government validation status is not present, then it means the module was not run. | `UNKNOWN` | Try again later; if issue persists, submit a support ticket through [http://support.incode.com/](http://support.incode.com/). | | `userNotFound` | **User Not Found**
          ID not found in government database. | `FAIL` | Check data extraction quality. If user is legitimate, submit a support ticket through [http://support.incode.com/](http://support.incode.com/) for further investigation. | | `faceComparisonFailed` | **Face Match Failed**
          Selfie does not match government database portrait. | `FAIL` | Check selfie capture quality. If user is legitimate, submit a support ticket through [http://support.incode.com/](http://support.incode.com/) for further investigation. |
          --- - Path: `general-reference/ekyb-prefill-api-reference` - URL: https://developer.incode.com/general-reference/ekyb-prefill-api-reference/ - Markdown: https://developer.incode.com/general-reference/ekyb-prefill-api-reference.md # eKYB Prefill API Reference eKYB Prefill is a data enrichment solution that retrieves and returns business information from official sources of truth using a minimum set of inputs, typically a tax ID. Unlike Verification, which compares submitted data against official records, Prefill is a pure data-fetching solution: it returns available business data as-is, without performing fuzzy matching, transformations, or assessments. Prefill is designed for use cases where you want to populate business information automatically before presenting it to the user or passing it downstream into your own business logic. ### How it differs from Verification [eKYB Verification](/general-reference/ekyb-verification-api-reference/) takes multiple inputs (business name, address, tax ID, UBOs, directors) and returns a `Verified` / `Approximate Match` / `Unverified` result for each field. eKYB Prefill takes a minimum input (tax ID + country) and returns raw business data retrieved from the source of truth (business name, entity type, registration status, incorporation date, and contact details) without performing any assessment on that data. This page documents the request and response semantics shared across all eKYB Prefill sources. For source-specific request formats, response fields, and status values, see the country page for the country you are querying. The full list of country pages is on the [eKYB Prefill Coverage](/general-reference/ekyb-prefill-coverage/) page. ### API authentication All endpoints require authentication headers. See the [Incode API Documentation](/reference/introduction/) for details. ## Endpoint `POST /omni/externalVerification/ekyb-prefill` The endpoint retrieves business data from the source of truth for the specified tax ID and country. See the OpenAPI reference for the endpoint schema. ## Request parameters All four parameters are mandatory for every Prefill request. | Field | Data type | Description | | --------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------- | | `plugins` | String array | Must be `["ekyb-prefill"]`. This value is static. | | `source` | String | Identifies the Prefill data source to route the request. Value is country- and configuration-specific (for example, `MX_KYB_PREFILL`). | | `country` | String | Two-letter Alpha-2 country code (for example, `MX`). | | `taxId` | String | Tax identifier for the business. Format requirements vary by country. | The `country` and `source` parameters are used together to route the request to the correct data source. Both are required for every Prefill request. ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "MX_KYB_PREFILL", "country": "MX", "taxId": "ABC12345" } ``` ## Response The response returns business data as retrieved from the source of truth. Fields are passed through without modification, matching, or scoring. The response structure uses the `kyb-prefill` key. ### Sample response ```json { "kyb-prefill": [ { "tin": "ABC12345", "name": "COMPANY NAME ABC", "entityType": "Company/Legal Entity", "registrationStatus": "Active", "taxIdEffectiveDate": "2025-07-17", "incorporationDate": "2025-05-29", "email": "example@domain.com" } ] } ``` ### Available fields vary by country The fields returned in the `kyb-prefill` response depend on what information is available from the source of truth for the requested country. Not all fields are available in all countries. See the country page for the exact response structure for that source. ## Error responses For standard HTTP response codes, see the [API Error Response](/reference/introduction/#api-responses) page. `taxId`** is missing, empty, or in an invalid format for the requested country:** ``` message: BadRequestException: Invalid taxId. ``` `country`** or **`source`** is missing or empty:** ``` message: BadRequestException: Missing required field. ``` Country-specific error responses may also apply. See the country page for the country-specific error responses returned by that source. ## Behavior and design considerations ### What Prefill returns Prefill is scoped to fetching and returning data from the source of truth. It does not: - Perform fuzzy matching or name comparison. - Return `Verified` / `Approximate Match` / `Unverified` statuses. - Accept or process address, UBO, or director inputs for matching. Any editing, updating, or additional data collection from the user, and any subsequent business logic applied to the returned data, should be handled outside the Prefill service, within your own platform. ### Invalid or unavailable tax IDs Two error scenarios are handled separately: - **Tax ID is invalid**: The API returns a 400 error with an `Invalid taxId` message. The request is not forwarded to the source of truth. - **Tax ID is valid but no data is returned**: The API returns an empty or partial response. Your platform should handle this case by allowing the user to fill in data manually, if applicable. ## Single Session Dashboard results Prefill results are available on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-prefill-coverage` - URL: https://developer.incode.com/general-reference/ekyb-prefill-coverage/ - Markdown: https://developer.incode.com/general-reference/ekyb-prefill-coverage.md # eKYB Prefill Coverage Incode eKYB Prefill returns verified business data from official registries and authoritative sources based on a submitted tax ID and business name. Prefill lowers end-user friction by pre-filling business details in the flow rather than requiring the end user to submit them. :::info eKYB Prefill is available for the countries listed below, in Flows only. Contact your Incode representative for expanded coverage. ::: ## Country coverage | Country Code | Country | Source | | ------------ | -------------------------- | ---------------- | | AU | [Australia](/general-reference/aus-kyb-prefill/) | `AU_KYB_PREFILL` | | AT | [Austria](/general-reference/austria/) | `AT_KYB_PREFILL` | | BE | [Belgium](/general-reference/belgium/) | `BE_KYB_PREFILL` | | FR | [France](/general-reference/france/) | `FR_KYB_PREFILL` | | DE | [Germany](/general-reference/germany) | `DE_KYB_PREFILL` | | GR | [Greece](/general-reference/greece/) | `GR_KYB_PREFILL` | | IN | [India](/general-reference/india/) | `IN_KYB_PREFILL` | | IE | [Ireland](/general-reference/ireland) | `IE_KYB_PREFILL` | | IT | [Italy](/general-reference/italy) | `IT_KYB_PREFILL` | | MX | [Mexico](/general-reference/ekyb-prefill-reference-mexico/) | `MX_KYB_PREFILL` | | NL | [Netherlands](/general-reference/netherlands) | `NL_KYB_PREFILL` | | PT | [Portugal](/general-reference/portugal) | `PT_KYB_PREFILL` | | ES | [Spain](/general-reference/spain) | `ES_KYB_PREFILL` | | GB | [UK](/general-reference/united-kingdom) | `GB_KYB_PREFILL` | | US | [United States](/general-reference/us-prefill) | `US_KYB_PREFILL` | Don't see the country you need? [Get in touch with our sales team](https://incode.com/contact/) to discuss expanded coverage. --- - Path: `general-reference/ekyb-prefill-reference-mexico` - URL: https://developer.incode.com/general-reference/ekyb-prefill-reference-mexico/ - Markdown: https://developer.incode.com/general-reference/ekyb-prefill-reference-mexico.md # Mexico eKYB Prefill in Mexico leverages Mexico's source of truth to automatically retrieve and populate business information based on a company's RFC, including the business name, entity type, registration status, incorporation date, and contact details, without requiring manual input from the user. ## Source | Country | Source | Description | | ------- | ---------------- | ------------------------------------------------------------------------------------- | | Mexico | `MX_KYB_PREFILL` | Returns matching Mexican business details from Mexico's source of truth for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --------- | --------- | ---------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | `source` | Mandatory | String. Must be `MX_KYB_PREFILL`. Identifies the Prefill source. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `MX`. | | `taxId` | Mandatory | String. RFC (Registro Federal de Contribuyentes). See [Tax ID formats](#tax-id-formats) for details. | ### Tax ID formats RFC (Registro Federal de Contribuyentes) is the Mexican federal tax identifier. Input must be 12 or 13 alphanumeric characters. Requests with an invalid format return a 400 error. | Entity Type | Format | | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Individual | 12 characters: 4 letters + 6 digits + 3 alphanumeric characters (for example: `AIGB850818QJ9`) | | Legal entity | 13 characters: 3 letters + 6 digits + 3 alphanumeric characters (for example: `CSE250529PSA`) | ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "MX_KYB_PREFILL", "country": "MX", "taxId": "ABCD123456789" } ``` ### Sample response The Prefill response returns business data retrieved directly from the source of truth. Fields are returned as-is from the source, without fuzzy matching or verification scoring. ```json { "kyb-prefill": [ { "tin": "ABCD123456789", "name": "Company Name ABC", "entityType": "Company/Legal Entity", "registrationStatus": "Active", "taxIdEffectiveDate": "2025-07-17", "incorporationDate": "2025-05-29", "email": "sampleemail@gmail.com" } ] } ``` When an RFC is not found, the response returns a 200 status code with a message indicating the RFC could not be located. Not all keys are returned in this case. iness name, entity type, registration status, incorporation date, and contact details, without requiring manual input from the user. ### Response fields | Key | Value | Description | | -------------------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | `tin` | RFC number | The tax ID submitted in the request, as returned and confirmed by the source of truth. | | `name` | Business name | The registered legal name of the business as returned from the source of truth. | | `entityType` | Entity type | The legal entity type of the business (for example, `Company/Legal Entity`, `Individual/Sole Proprietorship`). | | `registrationStatus` | `Active`, `Expired`, `Unknown`, `Not Found` | Current registration status of the business. See [Registration status values](#registration-status-values) for details. | | `taxIdEffectiveDate` | Date | The date from which the RFC became effective. | | `incorporationDate` | Date | The date the business was incorporated. | | `email` | Email address | The business contact email address registered with the source of truth, if available. | ### Registration status values | Status | Description | | --------- | ----------------------------------------------------------------- | | Active | The RFC is currently registered and active (Vigente). | | Expired | The RFC registration has lapsed (Expirado). | | Unknown | The registration status could not be determined. | | Not Found | The RFC is inactive or could not be found in the source of truth. | ### Error responses For standard HTTP response codes, see the API Error Response page. Mexico Prefill returns the following country-specific 400 errors. `taxId`** is missing, empty, or not 12 to 13 alphanumeric characters:** ```json { "timestamp": 1782851408892, "status": 400, "error": "taxId must be a valid Mexican RFC: 12 or 13 alphanumeric characters (3-4 letters, 6 digits, 3 alphanumeric)", "message": "taxId must be a valid Mexican RFC: 12 or 13 alphanumeric characters (3-4 letters, 6 digits, 3 alphanumeric)", "path": "/omni/externalVerification/ekyb-prefill" } ``` **Any mandatory field (**`plugins`**, **`source`**, **`country`**, or **`taxId`**) is missing:** ```json { "timestamp": 1782851468367, "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` **Wrong country code is provided (any value other than **`MX`**):** ```json { "timestamp": 1782851583695, "status": 400, "error": "Bad Request", "message": "IllegalArgumentException: No enum constant com.incodesmile.onboarding.integration.external.government.ekyb.domain.entity.model.EkybCountry.CO", "path": "/omni/externalVerification/ekyb-prefill" } ``` ## Single Session Dashboard results Prefill results are available on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-reference` - URL: https://developer.incode.com/general-reference/ekyb-reference/ - Markdown: https://developer.incode.com/general-reference/ekyb-reference.md # eKYB Reference This section provides technical reference for the eKYB module: the countries supported, the request and response schemas, and the semantics of each response field for both Verification and Prefill solutions. The [eKYB](/features-and-modules/ekyb/) module page covers what the module does at a conceptual level. This section covers the integration and API details for building against it. ## eKYB solutions eKYB offers two solutions, each documented in its own sub-section: - **eKYB Verification**: The end user submits business details, and the system verifies them against a source of truth. Returns match results for each submitted field along with enrichment details such as registration status and entity type. - **eKYB Prefill**: An enrichment solution that lowers end-user friction. The end user submits only a tax ID and business name; the system looks up the business and returns matching business details for pre-fill. Both solutions are configured on the same [eKYB Dashboard configuration](/dashboard-platform-administration/ekyb-dashboard/) page, on separate tabs. ## In this section ### eKYB Verification - [eKYB Verification Coverage](/general-reference/ekyb-verification-coverage/): The full list of supported countries with the data attributes verifiable per country. Country pages linked from Coverage document the source of truth, request parameters, response fields, and status values specific to each country. - [eKYB Verification API Reference](/general-reference/ekyb-verification-api-reference/): Shared response field definitions, status value normalization, and error responses that apply across all eKYB Verification sources. ### eKYB Prefill - [eKYB Prefill Coverage](/general-reference/ekyb-prefill-coverage/): The full list of supported countries for Prefill. Country pages linked from Coverage document the request parameters, response fields, and error responses specific to each country. - [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/): Shared endpoint, request and response semantics, and error responses that apply across all eKYB Prefill sources.
          --- - Path: `general-reference/ekyb-verification-api-reference` - URL: https://developer.incode.com/general-reference/ekyb-verification-api-reference/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-api-reference.md # eKYB Verification API Reference This page documents the request and response semantics shared across all eKYB sources. For source-specific request parameters, response fields, and status values, see the country page for the country you are verifying. The full list of country pages is on the eKYB Coverage page. ### API authentication All endpoints require authentication headers. See the [Incode API Documentation](/reference/introduction/) for details. ## Endpoint `POST /omni/externalVerification/ekyb` The endpoint performs an eKYB check for the business specified. It can be called with an empty body `{}`, in which case information is pulled from the module configuration and session details. When called with a populated body, the submitted values override any pre-existing configuration and session data. See the [OpenAPI reference](/reference/externalverificationekyb/) for the endpoint schema. ## Common request parameters Most eKYB sources accept a common set of request parameters. Country-specific documentation lists which parameters are required, optional, or unsupported for a given country. | Parameter | Description | | -------------- | ------------------------------------------------------------------------------------------------------------ | | `plugins` | Array. Must be `["ekyb"]`. | | `businessName` | Name of the business. | | `country` | Two-letter Alpha-2 country code identifying the country to verify against. | | `taxId` | Tax identifier for the business. Naming, format, and validation rules vary by country. | | `street` | Street name of the business. | | `houseNo` | Building or house number. | | `addressLine2` | Second line of the business address. | | `city` | City in the business address. | | `state` | State in the business address. | | `postalCode` | Postal code, formatted per country conventions. | | `uboNames` | Array of full legal names of Unique Beneficial Owners to check against records associated with the business. | | `directors` | Array of full legal names of directors to check against records associated with the business. | The `country` parameter limits business validation to the specified country. Only businesses established in the selected country are validated. ## Common response fields Most eKYB sources return a common set of response fields. Which fields appear depends on the country and, in some cases, the verification variant (for example, US Advanced vs US Advanced+). The country page for each country lists the specific fields returned and their status values. | Key | Description | | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | `name` | Match status for the submitted business name against the government source of truth. | | `tin` | Match status for the submitted tax ID against the government source of truth. May include `reasonCodes` indicating which tax ID type was verified. | | `address_verification` | Match status for the submitted address against the government source of truth. | | `cityMatch` | Match status for the submitted city. | | `postalCodeMatch` | Match status for the submitted postal code. | | `registrationStatus` | Registration status of the business in the government source of truth. Values vary by country; see country page for details. | | `entityType` | Legal entity type of the business, if available. | | `ubo_name_match` | Match status for each submitted UBO name. When multiple UBOs are submitted, one entry appears per name, distinguished by `uboName_input`. | | `directors_name_match` | Match status for each submitted director name. When multiple directors are submitted, one entry appears per name, distinguished by `directorsName_input`. | Some sources return additional country-specific fields. For example: - US Advanced+ returns `address_deliverability`, `address_property_type`, and `people`. - Brazil returns a `kybSource.uboNames` array with the full list of UBOs stored in the CNPJ database, correlated to `ubo_name_match` entries via `nameId_match`. Refer to the country page for the specific set of fields returned. ## Status value conventions Match status values follow a general pattern across sources, but the exact set of values varies by country and field. Common patterns include: | Value | Meaning | | ------------------- | -------------------------------------------------------------------------------------------- | | `Verified` | The submitted value matches the value in the source of truth. | | `Approximate Match` | The submitted value is a close match under Incode's fuzzy matching algorithm, but not exact. | | `Unverified` | The submitted value does not match, or the source of truth has no data for this field. | The tax ID (`tin`) field may use `Found` / `Not Found` status values on some sources rather than the match values above. See the country page for the exact status values returned per source. ### Approximate Match `Approximate Match` is generated through Incode's proprietary fuzzy matching algorithm. When returned, the algorithm has identified a close but not exact match between the submitted value and the value in the source of truth for a particular field. This value is returned when exact matches are not possible due to misspellings, typographical errors, or minor variations in input data. ## Error responses For standard HTTP response codes for API request success or failure, see the [API Error Response](/reference/introduction/#api-responses) page. Custom 400 error messages are returned when required fields are empty or null. The specific message varies by country and by which field is missing. Common patterns include: - `businessName, taxId, and country are minimum required fields` (most countries) - `taxId and country are minimum required fields` (some countries, including China) - `BadRequestException: Invalid taxId` (India) - `Country field is either not correct or available.` (India) Refer to the country page for country-specific error message language. --- - Path: `general-reference/ekyb-verification-coverage` - URL: https://developer.incode.com/general-reference/ekyb-verification-coverage/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-coverage.md # eKYB Verification Coverage Incode eKYB Verification provides instant access to verified company information from official sources around the world. Coverage draws on company registries, ministries, SEC filings, government databases, and UBO records in 150+ countries. Not all countries and data sources are currently live in production. Additional coverage can be enabled based on customer need and use case. | Country | Business Name | Reg. Status | Legal Entity | Tax ID | Address | UBOs / Directors | |---|---|---|---|---|---|---| | 🇦🇫 Afghanistan (AF) | Yes | No | No | No | Yes | Yes | | 🇦🇱 Albania (AL) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇩🇿 Algeria (DZ) | Yes | Yes | No | No | Yes | Yes | | 🇦🇴 Angola (AO) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇦🇮 Anguilla (AI) | Yes | Yes | Yes | No | Yes | Yes | | 🇦🇬 Antigua and Barbuda (AG) | Yes | No | No | No | Yes | No | | 🇦🇷 Argentina (AR) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇦🇲 Armenia (AM) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇦🇼 Aruba (AW) | Yes | Yes | No | No | Yes | No | | 🇦🇺 Australia (AU) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇦🇹 Austria (AT) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇦🇿 Azerbaijan (AZ) | Yes | No | No | Yes | Yes | Yes | | 🇧🇸 Bahamas (BS) | Yes | No | No | No | Yes | Yes | | 🇧🇭 Bahrain (BH) | Yes | Yes | Yes | No | Yes | Yes | | 🇧🇩 Bangladesh (BD) | Yes | No | Yes | No | Yes | Yes | | 🇧🇧 Barbados (BB) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇧🇾 Belarus (BY) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇧🇪 Belgium (BE) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇧🇿 Belize (BZ) | Yes | Yes | Yes | No | No | No | | 🇧🇯 Benin (BJ) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇧🇲 Bermuda (BM) | Yes | No | Yes | No | No | No | | 🇧🇹 Bhutan (BT) | Yes | Yes | No | No | Yes | Yes | | 🇧🇴 Bolivia (BO) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇧🇶 Bonaire (BQ) | Yes | Yes | Yes | No | No | No | | 🇧🇦 Bosnia and Herzegovina (BA) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇧🇼 Botswana (BW) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇧🇷 Brazil (BR) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇻🇬 British Virgin Islands (VG) | Yes | Yes | Yes | No | Yes | No | | 🇧🇳 Brunei (BN) | Yes | Yes | Yes | No | Yes | Yes | | 🇧🇬 Bulgaria (BG) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇧🇫 Burkina Faso (BF) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇧🇮 Burundi (BI) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇰🇭 Cambodia (KH) | Yes | Yes | No | Yes | Yes | Yes | | 🇨🇲 Cameroon (CM) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇨🇦 Canada (CA) | Yes | Yes | Yes | Yes | Yes | No | | 🇨🇻 Cape Verde (CV) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇰🇾 Cayman Islands (KY) | Yes | Yes | Yes | No | Yes | Yes | | 🇨🇫 Central African Republic (CF) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇹🇩 Chad (TD) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇨🇱 Chile (CL) | Yes | No | No | Yes | Yes | Yes | | 🇨🇳 China (CN) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇨🇴 Colombia (CO) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇰🇲 Comoros (KM) | Yes | Yes | No | No | No | No | | 🇨🇬 Congo (CG) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇨🇰 Cook Islands (CK) | Yes | Yes | Yes | No | No | Yes | | 🇨🇷 Costa Rica (CR) | Yes | No | No | Yes | Yes | Yes | | 🇭🇷 Croatia (HR) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇨🇺 Cuba (CU) | Yes | No | Yes | No | No | Yes | | 🇨🇼 Curacao (CW) | Yes | No | No | No | Yes | Yes | | 🇨🇾 Cyprus (CY) | Yes | Yes | Yes | No | Yes | Yes | | 🇨🇿 Czechia (CZ) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇩🇰 Denmark (DK) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇩🇯 Djibouti (DJ) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇩🇲 Dominica (DM) | Yes | No | Yes | No | Yes | Yes | | 🇩🇴 Dominican Republic (DO) | Yes | No | No | No | No | Yes | | 🇹🇱 East Timor (TL) | Yes | No | No | Yes | No | Yes | | 🇪🇨 Ecuador (EC) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇪🇬 Egypt (EG) | Yes | No | No | No | Yes | Yes | | 🇸🇻 El Salvador (SV) | Yes | No | No | No | Yes | Yes | | 🇬🇶 Equatorial Guinea (GQ) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇪🇷 Eritrea (ER) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇪🇪 Estonia (EE) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇪🇹 Ethiopia (ET) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇫🇰 Falkland Islands (FK) | Yes | No | No | No | No | No | | 🇫🇯 Fiji Islands (FJ) | Yes | Yes | Yes | No | Yes | Yes | | 🇫🇮 Finland (FI) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇫🇷 France (FR) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇬🇵 France Guadeloupe, French Guiana (GP) | Yes | Yes | No | Yes | Yes | Yes | | 🇬🇦 Gabon (GA) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇬🇲 Gambia (GM) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇬🇪 Georgia (GE) | Yes | Yes | Yes | No | Yes | Yes | | 🇩🇪 Germany (DE) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇬🇭 Ghana (GH) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇬🇷 Greece (GR) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇬🇩 Grenada (GD) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇬🇹 Guatemala (GT) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇬🇳 Guinea (GN) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇬🇼 Guinea-Bissau (GW) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇬🇾 Guyana (GY) | Yes | No | No | No | Yes | Yes | | 🇭🇹 Haiti (HT) | Yes | No | No | No | Yes | No | | 🇭🇳 Honduras (HN) | Yes | No | Yes | No | Yes | Yes | | 🇭🇰 Hong Kong (HK) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇭🇺 Hungary (HU) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇮🇸 Iceland (IS) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇮🇳 India (IN) | Yes | Yes | Yes | Yes | Yes | No | | 🇮🇩 Indonesia (ID) | Yes | Yes | Yes | No | Yes | No | | 🇮🇷 Iran (IR) | Yes | No | No | No | Yes | No | | 🇮🇶 Iraq (IQ) | Yes | Yes | No | No | Yes | Yes | | 🇮🇪 Ireland (IE) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇮🇱 Israel (IL) | Yes | Yes | Yes | No | Yes | Yes | | 🇮🇹 Italy (IT) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇨🇮 Ivory Coast (CI) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇯🇲 Jamaica (JM) | Yes | Yes | Yes | No | No | Yes | | 🇯🇵 Japan (JP) | Yes | Yes | Yes | Yes | Yes | No | | 🇯🇴 Jordan (YO) | Yes | Yes | Yes | No | Yes | Yes | | 🇰🇿 Kazakhstan (KZ) | Yes | No | Yes | Yes | Yes | Yes | | 🇰🇪 Kenya (KE) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇰🇮 Kiribati (KI) | Yes | No | Yes | No | Yes | Yes | | 🇽🇰 Kosovo (XK) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇰🇼 Kuwait (KW) | Yes | No | No | No | Yes | Yes | | 🇰🇬 Kyrgyzstan (KG) | Yes | Yes | Yes | No | Yes | Yes | | 🇱🇦 Laos (LA) | Yes | Yes | No | Yes | Yes | Yes | | 🇱🇻 Latvia (LV) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇱🇧 Lebanon (LB) | Yes | No | No | No | Yes | Yes | | 🇱🇸 Lesotho (LS) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇱🇷 Liberia (LR) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇱🇾 Libya (LY) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇱🇮 Liechtenstein (LI) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇱🇹 Lithuania (LT) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇱🇺 Luxembourg (LU) | Yes | Yes | Yes | Yes | Yes | No | | 🇲🇴 Macau S.A.R (MO) | Yes | Yes | No | No | Yes | Yes | | 🇲🇰 Macedonia (MK) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇲🇬 Madagascar (MG) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇲🇼 Malawi (MW) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇲🇾 Malaysia (MY) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇲🇱 Mali (ML) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇲🇹 Malta (MT) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇲🇭 Marshall Islands (MH) | Yes | Yes | Yes | No | Yes | Yes | | 🇲🇺 Mauritius (MU) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇾🇹 Mayotte (YT) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇲🇽 Mexico (MX) | Yes | No | No | No | P | No | | 🇫🇲 Micronesia (FM) | Yes | No | No | No | Yes | Yes | | 🇲🇩 Moldova (MD) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇲🇳 Mongolia (MN) | Yes | Yes | Yes | No | Yes | Yes | | 🇲🇪 Montenegro (ME) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇲🇸 Montserrat (MS) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇲🇦 Morocco (MA) | Yes | Yes | No | No | No | Yes | | 🇲🇿 Mozambique (MZ) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇲🇲 Myanmar (MM) | Yes | Yes | Yes | No | No | Yes | | 🇳🇦 Namibia (NA) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇳🇵 Nepal (NP) | Yes | Yes | Yes | No | Yes | Yes | | 🇳🇨 New Caledonia (NC) | Yes | Yes | Yes | No | No | No | | 🇳🇿 New Zealand (NZ) | Yes | Yes | Yes | No | Yes | Yes | | 🇳🇮 Nicaragua (NI) | Yes | Yes | No | No | No | No | | 🇳🇪 Niger (NE) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇳🇬 Nigeria (NG) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇳🇴 Norway (NO) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇴🇲 Oman (OM) | Yes | Yes | Yes | No | Yes | Yes | | 🇵🇰 Pakistan (PK) | Yes | Yes | No | No | No | Yes | | 🇵🇼 Palau (PW) | Yes | Yes | Yes | No | Yes | Yes | | 🇵🇸 Palestine (PS) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇵🇦 Panama (PA) | Yes | No | No | No | No | Yes | | 🇵🇬 Papua New Guinea (PG) | Yes | Yes | Yes | No | Yes | Yes | | 🇵🇾 Paraguay (PY) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇵🇪 Peru (PE) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇵🇭 Philippines (PH) | Yes | Yes | Yes | Yes | Yes | No | | 🇵🇱 Poland (PL) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇵🇹 Portugal (PT) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇵🇷 Puerto Rico (PR) | Yes | Yes | Yes | No | Yes | Yes | | 🇶🇦 Qatar (QA) | Yes | Yes | No | No | Yes | Yes | | 🇷🇪 Reunion (RE) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇷🇴 Romania (RO) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇷🇺 Russia (RU) | Yes | Yes | No | Yes | Yes | Yes | | 🇷🇼 Rwanda (RW) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇧🇱 Saint Barthelemy (BL) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇸🇭 Saint Helena (SH) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇰🇳 Saint Kitts & Nevis (KN) | Yes | No | No | No | Yes | Yes | | 🇱🇨 Saint Lucia (LC) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇲🇫 Saint Martin (MF) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇵🇲 Saint Pierre & Miquelon (PM) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇻🇨 Saint Vincent & the Grenadines (VC) | Yes | Yes | Yes | No | Yes | No | | 🇼🇸 Samoa (WS) | Yes | Yes | Yes | No | Yes | Yes | | 🇸🇹 Sao Tome and Principe (ST) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇸🇦 Saudi Arabia (SA) | Yes | Yes | Yes | No | Yes | Yes | | 🇸🇳 Senegal (SN) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇷🇸 Serbia (RS) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇸🇨 Seychelles (SC) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇸🇱 Sierra Leone (SL) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇸🇬 Singapore (SG) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇸🇽 Sint Maarten (SX) | Yes | No | No | No | Yes | Yes | | 🇸🇰 Slovakia (SK) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇸🇮 Slovenia (SI) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇸🇧 Solomon Islands (SB) | Yes | No | No | No | No | Yes | | 🇸🇴 Somalia (SO) | Yes | No | No | No | No | No | | 🇿🇦 South Africa (ZA) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇰🇷 South Korea (KR) | Yes | No | No | Yes | Yes | Yes | | 🇸🇸 South Sudan (SS) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇪🇸 Spain (ES) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇱🇰 Sri Lanka (LK) | Yes | No | No | No | Yes | Yes | | 🇸🇩 Sudan (SD) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇸🇷 Suriname (SR) | Yes | No | No | No | Yes | No | | 🇸🇿 Swaziland (SZ) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇸🇪 Sweden (SE) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇨🇭 Switzerland (CH) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇸🇾 Syria (SY) | Yes | No | No | No | Yes | Yes | | 🇹🇼 Taiwan (TW) | Yes | Yes | Yes | No | Yes | Yes | | 🇹🇯 Tajikistan (TJ) | Yes | Yes | Yes | No | Yes | Yes | | 🇹🇿 Tanzania (TZ) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇹🇭 Thailand (TH) | Yes | Yes | Yes | Yes | Yes | No | | 🇹🇬 Togo (TG) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇹🇴 Tonga (TO) | Yes | Yes | No | No | Yes | Yes | | 🇹🇹 Trinidad & Tobago (TT) | Yes | Yes | Yes | No | No | No | | 🇹🇳 Tunisia (TN) | Yes | Yes | No | No | Yes | Yes | | 🇹🇷 Turkey (TR) | Yes | No | No | Yes | Yes | Yes | | 🇹🇲 Turkmenistan (TM) | Yes | No | No | No | Yes | No | | 🇹🇨 Turks and Caicos Islands (TC) | Yes | No | No | No | No | No | | 🇺🇬 Uganda (UG) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇺🇦 Ukraine (UA) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇦🇪 United Arab Emirates (AE) | Yes | Yes | Yes | No | Yes | Yes | | 🇬🇧 United Kingdom (GB) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇺🇸 United States of America (US) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇺🇾 Uruguay (UY) | Yes | No | No | No | No | Yes | | 🇻🇮 US Virgin Islands (VI) | Yes | Yes | Yes | No | Yes | Yes | | 🇺🇿 Uzbekistan (UZ) | Yes | No | No | No | Yes | Yes | | 🇻🇺 Vanuatu (VU) | Yes | Yes | Yes | No | Yes | Yes | | 🇻🇪 Venezuela (VE) | Yes | No | No | Yes | No | No | | 🇻🇳 Vietnam (VN) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇪🇭 Western Sahara (EH) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇾🇪 Yemen (YE) | Yes | No | Yes | No | No | No | | 🇿🇲 Zambia (ZM) | Yes | Yes | Yes | Yes | Yes | Yes | | 🇿🇼 Zimbabwe (ZW) | Yes | Yes | Yes | Yes | Yes | Yes | ## Country-specific guidelines The following countries have dedicated documentation with source-specific integration and API details: - [Brazil](/general-reference/ekyb-verification-reference-brazil/) - [Bulgaria](/general-reference/ekyb-verification-reference-bulgaria/) - [Cameroon](/general-reference/ekyb-verification-reference-cameroon/) - [China](/general-reference/ekyb-verification-reference-china/) - [Denmark](/general-reference/ekyb-verification-reference-denmark/) - [France](/general-reference/ekyb-verification-reference-france/) - [Germany](/general-reference/ekyb-verification-reference-germany/) - [Hong Kong](/general-reference/ekyb-verification-reference-hong-kong/) - [India](/general-reference/ekyb-verification-reference-india/) - [Israel](/general-reference/ekyb-verification-reference-israel/) - [Italy](/general-reference/ekyb-verification-reference-italy/) - [Kenya](/general-reference/ekyb-verification-reference-kenya/) - [Malta](/general-reference/ekyb-verification-reference-malta/) - [Mexico](/general-reference/ekyb-verification-reference-mexico/) - [Netherlands](/general-reference/ekyb-verification-reference-netherlands/) - [Nigeria](/general-reference/ekyb-verification-reference-nigeria/) - [Spain](/general-reference/ekyb-verification-reference-spain/) - [United Kingdom](/general-reference/ekyb-verification-reference-united-kingdom/) - [United States](/general-reference/ekyb-verification-reference-united-states/) --- - Path: `general-reference/ekyb-verification-reference-brazil` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-brazil/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-brazil.md # Brazil Brazil eKYB validates the legitimacy of Brazilian businesses by checking their tax ID, business name, address, and UBOs against the Brazilian government CNPJ database. Directors are not currently supported for Brazil. ## Source | Country | Source | Description | | ------- | ---------------------------------- | ------------------------------------------------------------------------------------ | | Brazil | Brazilian government CNPJ database | Verifies submitted business details against records maintained in the CNPJ registry. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ------------------------------------------------------------------------------------------------------ | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `BR`. | | `taxId` | Mandatory | String. CNPJ (14 digits, usually written as `12.345.678/9012-34`). | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State in the business address. | | `postalCode` | Optional | String. 8-digit Brazilian postal code. | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the CNPJ. | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "RENATA DISTR. DE SUPLEMENTOS LTDA", "street": "Rua Curupaiti", "houseNo": "225", "city": "Rio de Janeiro", "state": "RJ", "postalCode": "20735320", "country": "BR", "taxId": "41111051548164", "uboNames": ["MICHEL RODRIGUES", "ERIC SANTOS", "MICHELLE MUNHOZ"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified" }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "Sociedade Empresária Limitada" } }, { "key": "ubo_name_match", "sub_label": "Verified", "uboName_input": "MICHEL RODRIGUES", "nameId_match": "2" }, { "key": "ubo_name_match", "sub_label": "Verified", "uboName_input": "ERIC SANTOS", "nameId_match": "1" }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "MICHELLE MUNHOZ", "nameId_match": "-1" } ], "kybSource": { "uboNames": [ { "id": "1", "uboName": "ERIC SANTOS" }, { "id": "2", "uboName": "MICHEL RODRIGUES" } ] } } ``` The `nameId_match` value on each `ubo_name_match` entry correlates to the `id` in the `kybSource.uboNames` array. A `nameId_match` of `-1` indicates no match to any UBO in the source of truth. ### Response fields | Key | Status | Description | | ---------------------- | ---------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the CNPJ. | | `tin` | `Verified`, `Unverified` | Submitted CNPJ against the government CNPJ database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the CNPJ. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the CNPJ. | | `postalCodeMatch` | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the CNPJ. | | `registrationStatus` | `Active`, `Suspended`, `Null`, `Unfit`, `Written off`, `Unknown` | Registration status of the business in the CNPJ database. See [Registration status values](#registration-status-values) for definitions. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | | `ubo_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the CNPJ. Distinguished by the `uboName_input` field on each entry. | | `kybSource.uboNames` | Array of UBO records | Full list of UBOs stored in the CNPJ database for the business. | ### Registration status values | Status | Description | | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Active | The CNPJ is active. | | Suspended | The company did not comply with tax obligations, presented data issues to the Federal Revenue Service, or is under investigation for possible fraud. | | Null | The CNPJ is invalid, typically due to registration problems in other instances such as a duplicate State Registration. | | Unfit | Tax irregularity or omission of company tax information caused the Federal Revenue Service to reclassify the CNPJ as Unfit until regularization is made. | | Written off | The Federal Revenue Service considers the company written off or cancelled. This can occur due to closure of the company's activities, serious tax irregularities, failure to submit mandatory declarations, or voluntary request for dismissal by the company itself. | | Unknown | Registration status is not available. | ### Address `unabletoverify` note Address-based fields on Brazil eKYB may return `unabletoverify` for `taxIdStateMatch`, `taxIdAddressMatch`, `taxIdCityMatch`, and `taxIdPostalCodeMatch`. This is because addresses are validated through the driver's license (CNH) Brazilian government source of truth. If the individual associated with the business does not have a CNH on file, address components cannot be validated. ### Reason codes The following reason codes may appear on Brazil eKYB responses: | Reason Code | Description | | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | | ASDL | Unable to verify address because CPF consulted does not have a CNH in the official government database. | | TSRF | Tax ID Status (situação CPF) is not regular. It is suspended or canceled due to pending regularization, being null, or the holder being deceased. | | TSR | Tax ID Status (situação CPF) is regular. | | TSRP | Tax ID Status is pending regularization. | | TNPIN | Tax ID check was not performed due to invalid nationality. | | TLGPD | Tax ID check was not performed due to LGPD: minor's data. | | ASCV | State and country validated. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-bulgaria` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-bulgaria/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-bulgaria.md # Bulgaria Bulgaria eKYB validates the legitimacy of Bulgarian businesses by checking their tax ID (UIC/EIK number), business name, address, UBOs, and directors against Bulgaria's government database. ## Source | Country | Source | Description | | -------- | ----------------------------- | ------------------------------------------------------------------------------------------ | | Bulgaria | Bulgarian government database | Verifies submitted business details against records maintained in the government database. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Verification API Reference](/general-reference/ekyb-verification-api-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `BG`. | | `taxId` | Mandatory | String. Bulgarian UIC/EIK number. Accepted formats: 9 digits (e.g. `123456789`), or `BG` + 9 digits (VAT format, e.g. `BG123456789`). The `BG` prefix is stripped automatically before processing. | | `businessName` | Optional | String. Registered name of the business. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State or region in the business address. | | `postalCode` | Optional | String. 4-digit Bulgarian postal code (e.g. `1000`). | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the UIC/EIK. | | `directors` | Optional | Array. Full legal names of directors to check against records associated with the UIC/EIK. | The `country` parameter limits business validation to the specified region. Only businesses established in the country specified in the eKYB request are validated. ### Sample request ```json { "plugins": ["ekyb"], "country": "BG", "taxId": "123456789", "businessName": "EXAMPLE BULGARIA OOD", "street": "VITOSHA BLVD", "houseNo": "10", "city": "SOFIA", "postalCode": "1000", "uboNames": ["MARIA GEORGIEVA"], "directors": ["IVAN PETROV IVANOV"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified" }, { "key": "address_verification", "sub_label": "Approximate Match" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "Private limited with Share Capital" } }, { "key": "ubo_name_match", "sub_label": "Verified", "uboName_input": "Maria Georgieva" }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "Sarah Smith" }, { "key": "directors_name_match", "sub_label": "Verified", "directorsName_input": "Ivan Petrov Ivanov" }, { "key": "directors_name_match", "sub_label": "Unverified", "directorsName_input": "Sarah Schrader" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the UIC/EIK. | | `tin` | `Verified`, `Unverified` | Submitted UIC/EIK number against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the UIC/EIK. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the UIC/EIK. | | `postalCodeMatch` | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the UIC/EIK. Always 4 digits for Bulgaria. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business in the government database. See [Registration status values](#registration-status-values) for definitions. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available (e.g. Private limited with Share Capital, Limited liability company with one shareholder only). If not available, displays `Unknown`. | | `ubo_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the UIC/EIK. Distinguished by the `uboName_input` field on each entry. | | `directors_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted director against directors associated with the UIC/EIK. Distinguished by the `directorsName_input` field on each entry. | ### Registration status values | Status | Description | | -------- | ----------------------------------------------------------------------------------- | | Active | The business registration is active. | | Inactive | The business registration is suspended, inactive, or the business no longer exists. | | Unknown | Registration status is not available. | ### Approximate Match `Approximate Match` is generated through Incode's proprietary fuzzy matching algorithm. It is returned when the submitted string is similar to, but not an exact match for, the value stored in the government database. This accounts for misspellings, typographical errors, and slight variations in input data. ### Error responses See the [eKYB Verification API Reference](/general-reference/ekyb-verification-api-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-cameroon` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-cameroon/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-cameroon.md # Cameroon Cameroon eKYB validates the legitimacy of Cameroonian businesses by checking their tax ID, business name, and address against Cameroonian government sources of truth. Cameroon eKYB is currently available only in the Incode demo environment, not in production. Contact Incode support for availability. UBOs and directors are not currently supported for Cameroon. ## Source | Country | Source | Description | | -------- | --------------------------------------- | ------------------------------------------------------------------------------------------ | | Cameroon | Cameroonian government sources of truth | Verifies submitted business details against records maintained in Cameroonian registries. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ---------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `CM`. | | `taxId` | Mandatory | String. NIF (Numéro d'Identification Fiscale). Typically alphanumeric. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "Equatorial Beverages Ltd.", "street": "Rue de la République, Bonanjo", "city": "Douala", "country": "CM", "taxId": "CM0000087219" } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified", "reasonCodes": ["REGNO"] }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "sub_label": "Société à Responsabilité Limitée (SARL)" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Found`, `Not Found` | Submitted tax ID against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business. `Inactive` includes suspended businesses and those no longer in operation. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-china` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-china/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-china.md # China China eKYB validates the legitimacy of Chinese businesses by checking their tax ID, business name, address, and UBOs against Chinese government sources of truth. China eKYB supports input in Chinese, English, and Pinyin. Directors are not currently supported for China. ## Source | Country | Source | Description | | ------- | ----------------------------------- | -------------------------------------------------------------------------------------- | | China | Chinese government sources of truth | Verifies submitted business details against records maintained in Chinese registries. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ---------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `CN`. | | `taxId` | Mandatory | String. Unified Social Credit Code, 18 characters. | | `addressLine2` | Optional | String. Full business address including house number, street, city, state, and postal code. | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the business. | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "SHANGHAI JINLONG TECHNOLOGY CO., LTD.", "addressLine2": "Pudong New Area, Zhangyang Road 88, Shanghai 200120", "country": "CN", "taxId": "91310000MA1K123456", "uboNames": ["Li Wei", "Zhang Mei"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified" }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "Limited Liability Company (Sole Proprietorship by a Natural Person)" } }, { "key": "ubo_name_match", "sub_label": "Verified", "uboName_input": "Li Wei" }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "Zhang Mei" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Verified`, `Unverified` | Submitted tax ID against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business. `Inactive` includes suspended businesses and those no longer in operation. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | | `ubo_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the business. Distinguished by the `uboName_input` field on each entry. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-denmark` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-denmark/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-denmark.md # Denmark Denmark eKYB validates the legitimacy of Danish businesses by checking their tax ID (CVR number), business name, address, UBOs, and directors against Denmark's government database. ## Source | Country | Source | Description | | ------- | -------------------------- | ------------------------------------------------------------------------------------------ | | Denmark | Danish government database | Verifies submitted business details against records maintained in the government database. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Verification API Reference](/general-reference/ekyb-verification-api-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `DK`. | | `taxId` | Mandatory | String. Danish CVR number. Accepted formats: 8 digits (e.g. `12345678`), or `DK` + 8 digits (VAT format, e.g. `DK12345678`). The `DK` prefix is stripped automatically before processing. | | `businessName` | Optional | String. Registered name of the business. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State or region in the business address. | | `postalCode` | Optional | String. 4-digit Danish postal code (e.g. `1050`). | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the CVR number. | | `directors` | Optional | Array. Full legal names of directors to check against records associated with the CVR number. | The `country` parameter limits business validation to the specified region. Only businesses established in the country specified in the eKYB request are validated. ### Sample request ```json { "plugins": ["ekyb"], "country": "DK", "taxId": "12345678", "businessName": "EXAMPLE DENMARK A/S", "street": "STRØGET", "houseNo": "10", "city": "COPENHAGEN", "postalCode": "1050", "uboNames": ["JOHN DOE", "SARAH SMITH"], "directors": ["LARS NIELSEN"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified" }, { "key": "address_verification", "sub_label": "Approximate Match" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "Public Limited Company (A/S)" } }, { "key": "ubo_name_match", "sub_label": "Verified", "uboName_input": "John Doe" }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "Sarah Smith" }, { "key": "directors_name_match", "sub_label": "Verified", "directorsName_input": "Andrew Martin" }, { "key": "directors_name_match", "sub_label": "Unverified", "directorsName_input": "Sarah Schrader" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the CVR number. | | `tin` | `Verified`, `Unverified` | Submitted CVR number against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the CVR number. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the CVR number. | | `postalCodeMatch` | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the CVR number. Always 4 digits for Denmark. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business in the government database. See [Registration status values](#registration-status-values) for definitions. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available (e.g. Public Limited Company (A/S), Limited company). If not available, displays `Unknown`. | | `ubo_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the CVR number. Distinguished by the `uboName_input` field on each entry. | | `directors_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted director against directors associated with the CVR number. Distinguished by the `directorsName_input` field on each entry. | ### Registration status values | Status | Description | | -------- | ----------------------------------------------------------------------------------- | | Active | The business registration is active. | | Inactive | The business registration is suspended, inactive, or the business no longer exists. | | Unknown | Registration status is not available. | ### Approximate Match `Approximate Match` is generated through Incode's proprietary fuzzy matching algorithm. It is returned when the submitted string is similar to, but not an exact match for, the value stored in the government database. This accounts for misspellings, typographical errors, and slight variations in input data. ### Error responses See the [eKYB Verification API Reference](/general-reference/ekyb-verification-api-reference/) for standard error responses. Custom 400 responses include `BadRequestException: Invalid taxId.` when `taxId` is missing or malformed. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-france` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-france/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-france.md # France France eKYB validates the legitimacy of French businesses by checking their tax ID, business name, address, UBOs, and directors against French government sources of truth. ## Source | Country | Source | Description | | ------- | ---------------------------------- | ------------------------------------------------------------------------------------- | | France | French government sources of truth | Verifies submitted business details against records maintained in French registries. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ---------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `FR`. | | `taxId` | Mandatory | String. Accepts SIREN, SIRET, RCS, RC (local numbers), or VAT Number. Format varies by type. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State in the business address. | | `postalCode` | Optional | String. French postal code. | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the business. | | `directors` | Optional | Array. Full legal names of directors to check against records associated with the business. | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "AUCHAN RETAIL INTERNATIONAL", "street": "RUE MAL DE LATTRE DE TASSIGNY", "city": "CROIX", "postalCode": "59170", "country": "FR", "taxId": "XXXXXXXXX", "uboNames": ["LLO", "Sarah Smith"], "directors": ["Andrew Martin", "Sarah Schrader"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified", "reasonCodes": ["REGNO"] }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "Limited Liability Granting Company" } }, { "key": "ubo_name_match", "sub_label": "Verified", "uboName_input": "LLO" }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "Sarah Smith" }, { "key": "directors_name_match", "sub_label": "Verified", "directorsName_input": "Andrew Martin" }, { "key": "directors_name_match", "sub_label": "Unverified", "directorsName_input": "Sarah Schrader" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Verified`, `Unverified` | Submitted tax ID against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the tax ID. | | `postalCodeMatch` | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business. `Inactive` includes suspended businesses and those no longer in operation. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | | `ubo_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the business. Distinguished by the `uboName_input` field on each entry. | | `directors_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted director against directors associated with the business. Distinguished by the `directorsName_input` field. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-germany` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-germany/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-germany.md # Germany Germany eKYB validates the legitimacy of German businesses by checking their tax ID, business name, address, UBOs, and directors against German government sources of truth. ## Source | Country | Source | Description | | ------- | ---------------------------------- | ------------------------------------------------------------------------------------- | | Germany | German government sources of truth | Verifies submitted business details against records maintained in German registries. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `DE`. | | `taxId` | Mandatory | String. Accepts VAT (`DE + 9 digits`), SafeNo (`DE + 8 digits`), or Reg No (HRB or HRA). See [Tax ID formats](#tax-id-formats) for details. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State in the business address. | | `postalCode` | Optional | String. 5-digit German postal code. | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the business. | | `directors` | Optional | Array. Full legal names of directors to check against records associated with the business. | ### Tax ID formats | Tax ID Type | Format | | ------------------- | ---------------------------------------------------------------------------------------------------------------- | | VAT | `DE` + 9 digits | | SafeNo | `DE` + 8 digits | | Reg No (HRB or HRA) | `HRB` + 3-6 digits, `HRB` + 6 digits + letter, `HRA` + 4-6 digits, or 4-6 digits (handled as `HRB` + 4-6 digits) | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "BERLIN TECH SOLUTIONS GMBH", "street": "Kurfürstendamm", "houseNo": "182", "addressLine2": "Charlottenburg-Wilmersdorf", "city": "Berlin", "state": "Berlin", "postalCode": "10707", "country": "DE", "taxId": "123456789", "uboNames": ["John Schmidt", "Emily Bauer"], "directors": ["David Meyer", "Anna Weber"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified", "reasonCodes": ["REGNO"] }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "General Partnership" } }, { "key": "ubo_name_match", "sub_label": "Verified", "uboName_input": "John Schmidt" }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "Emily Bauer" }, { "key": "directors_name_match", "sub_label": "Verified", "directorsName_input": "David Meyer" }, { "key": "directors_name_match", "sub_label": "Unverified", "directorsName_input": "Anna Weber" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Verified`, `Unverified` | Submitted tax ID against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the tax ID. | | `postalCodeMatch` | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business. `Inactive` includes suspended businesses and those no longer in operation. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | | `ubo_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the business. Distinguished by the `uboName_input` field on each entry. | | `directors_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted director against directors associated with the business. Distinguished by the `directorsName_input` field. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-hong-kong` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-hong-kong/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-hong-kong.md # Hong Kong Hong Kong eKYB validates the legitimacy of Hong Kong businesses by checking their tax ID (CR number), business name, address, UBOs, and directors against Hong Kong's government database. Incode supports input in Chinese, English, and Pinyin. ## Source | Country | Source | Description | | --------- | ----------------------------- | ------------------------------------------------------------------------------------------ | | Hong Kong | Hong Kong government database | Verifies submitted business details against records maintained in the government database. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Verification API Reference](/general-reference/ekyb-verification-api-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `HK`. | | `taxId` | Mandatory | String. Hong Kong CR number (8 digits, e.g. `12345678`). Extended formats such as `12345678-000-09-20-3`, `12345678-000-11-23-A`, and `1234567800007210` are accepted; only the first 8 digits are used. | | `businessName` | Mandatory | String. Name of the business. | | `addressLine2` | Optional | String. Full business address, including house number, street, city, state, and postal code. | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the CR number. | | `directors` | Optional | Array. Full legal names of directors to check against records associated with the CR number. | The `country` parameter limits business validation to the specified region. Only businesses established in the country specified in the eKYB request are validated. ### Sample request ```json { "plugins": ["ekyb"], "country": "HK", "taxId": "12345678", "businessName": "Dummy Company Limited", "addressLine2": "105-111 MAIN ROAD, WAN CHAI, Hong Kong, 999077", "uboNames": ["Lin Xi Wein"], "directors": ["Andrew Chang"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified" }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "Private company limited by shares" } }, { "key": "ubo_name_match", "sub_label": "Verified", "uboName_input": "Li Xi Wein", "ubo_ownership": "100.00%" }, { "key": "directors_name_match", "sub_label": "Unverified", "directorsName_input": "Andrei Blang" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the CR number. | | `tin` | `Verified`, `Unverified` | Submitted CR number against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the CR number. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business in the government database. See [Registration status values](#registration-status-values) for definitions. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available (e.g. Private company limited by shares). If not available, displays `Unknown`. | | `ubo_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the CR number. Distinguished by the `uboName_input` field on each entry. | | `ubo_ownership` | Percentage | Ownership percentage of the matched UBO, as recorded in the government database. Returned on `ubo_name_match` entries where a match is found. | | `directors_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted director against directors associated with the CR number. Distinguished by the `directorsName_input` field on each entry. | ### Registration status values | Status | Description | | -------- | ----------------------------------------------------------------------------------- | | Active | The business registration is active. | | Inactive | The business registration is suspended, inactive, or the business no longer exists. | | Unknown | Registration status is not available. | ### Approximate Match `Approximate Match` is generated through Incode's proprietary fuzzy matching algorithm. It is returned when the submitted string is similar to, but not an exact match for, the value stored in the government database. This accounts for misspellings, typographical errors, and slight variations in input data. ### Error responses See the [eKYB Verification API Reference](/general-reference/ekyb-verification-api-reference/) for standard error responses. Custom 400 responses include `taxId and country are minimum required fields.` when `taxId`, `country`, or `businessName` is missing or empty. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-india` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-india/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-india.md # India India eKYB validates the legitimacy of Indian businesses by checking their tax ID, business name, address, and directors against Indian government databases. UBOs are not currently supported for India. Only director verification is supported. ## Source | Country | Source | Description | | ------- | --------------------------- | -------------------------------------------------------------------------- | | India | Indian government databases | Verifies submitted business details against Indian government registries. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `IN`. | | `taxId` | Mandatory | String. Accepts CIN, LLPIN, or UDYAM. Input is not case-sensitive; the system automatically converts it to caps before processing. See [Tax ID formats](#tax-id-formats) for details. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State in the business address. | | `postalCode` | Optional | String. 6-digit Indian postal code. | | `directors` | Optional | Array. Full legal names of business directors to check against records associated with the business. | ### Tax ID formats | Tax ID Type | Format | Applicable To | | --------------------------------------------------------------- | -------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | | **CIN** (Corporate Identification Number) | 1 letter + 5 digits + 2 letters + 4 digits + 3 letters + 6 digits | Private Limited Companies, Public Limited Companies, One Person Companies (OPCs), Section 8 Companies | | **LLPIN** (Limited Liability Partnership Identification Number) | 3 letters + hyphen + 4 digits | Limited Liability Partnerships (LLPs) | | **UDYAM** (MSME Registration Number) | `UDYAM` + hyphen + 2 letters + hyphen + 2 digits + hyphen + 7 digits | MSMEs (Micro, Small, and Medium Enterprises), including sole proprietorships, partnerships, LLPs, and companies | ### Sample request ```json { "plugins": ["ekyb"], "country": "IN", "taxId": "U72900KA2024PTC123456", "businessName": "AARAV TECHNOLOGIES PRIVATE LIMITED", "street": "MG Road", "houseNo": "42", "city": "BENGALURU", "state": "KARNATAKA", "postalCode": "560001", "directors": ["RAJESH KUMAR"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified" }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "PRIVATE COMPANY LIMITED BY SHARES NON-GOVERNMENT COMPANY" } }, { "key": "directors_name_match", "sub_label": "Verified", "directorsName_input": "RAJESH KUMAR" }, { "key": "directors_name_match", "sub_label": "Unverified", "directorsName_input": "ROHAN GUPTA" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Verified`, `Unverified` | Submitted tax ID against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive` | Registration status of the business. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | | `directors_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted director against directors associated with the business. Distinguished by the `directorsName_input` field. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. India returns the following country-specific 400 errors: | Error Condition | Message | | -------------------------- | --------------------------------------------------- | | `taxId` missing or invalid | `BadRequestException: Invalid taxId.` | | `country` missing or empty | `Country field is either not correct or available.` | ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-israel` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-israel/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-israel.md # Israel Israel eKYB validates the legitimacy of Israeli businesses by checking their tax ID, business name, and address against Israeli government sources of truth. UBOs and directors are not currently supported for Israel. ## Source | Country | Source | Description | | ------- | ----------------------------------- | -------------------------------------------------------------------------------------- | | Israel | Israeli government sources of truth | Verifies submitted business details against records maintained in Israeli registries. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `IL`. | | `taxId` | Mandatory | String. Mispar Osek (מספר עסק), the 9-digit Israeli VAT registration number. The first digit indicates the entity type; the remaining digits are a unique identifier. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State in the business address. | | `postalCode` | Optional | String. Israeli postal code. | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "אי. אם. טי הפצה ולוגיסטיקה בי אנד בי בע״מ", "street": "חומה ומגדל", "houseNo": "22", "city": "תל אביב - יפו", "state": "ישראל", "country": "IL", "taxId": "XXXXXXXXX" } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified" }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "Israeli Private Company" } } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | ----------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Verified`, `Unverified` | Submitted tax ID against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive` | Registration status of the business. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-italy` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-italy/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-italy.md # Italy Italy eKYB validates the legitimacy of Italian businesses by checking their tax ID, business name, address, UBOs, and directors against Italian government sources of truth. ## Source | Country | Source | Description | | ------- | ----------------------------------- | -------------------------------------------------------------------------------------- | | Italy | Italian government sources of truth | Verifies submitted business details against records maintained in Italian registries. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | --------------------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `IT`. | | `taxId` | Mandatory | String. Accepts CCIAA/NREA, CS_COMPANY_ID, or Tax Code/VAT Number. See [Tax ID formats](#tax-id-formats) for details. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State in the business address. | | `postalCode` | Optional | String. 5-digit Italian postal code. | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the business. | | `directors` | Optional | Array. Full legal names of directors to check against records associated with the business. | ### Tax ID formats | Tax ID Type | Format | | ---------------- | ----------------------------------------------------------------------------- | | CCIAA/NREA | 2 letters + 6 or 7 digits (for example: `AA123456`, `AA-123456`, `AA1234567`) | | CS_COMPANY_ID | `IT` + 8 digits | | Tax Code/VAT No. | 11 digits | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "LUXOTTICA GROUP SPA", "street": "PLE LUIGI CADORNA", "houseNo": "3", "city": "MILAN", "postalCode": "20123", "country": "IT", "taxId": "XXXXXXXXX", "uboNames": ["Stella Smith", "Sarah Smith"], "directors": ["Andrew Martin", "Mike Martin"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified", "reasonCodes": ["VATNO"] }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "LIMITED LIABILITY COMPANY" } }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "Stella Smith" }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "Sarah Smith" }, { "key": "directors_name_match", "sub_label": "Unverified", "directorsName_input": "Andrew Martin" }, { "key": "directors_name_match", "sub_label": "Unverified", "directorsName_input": "Mike Martin" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Verified`, `Unverified` | Submitted tax ID against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the tax ID. | | `postalCodeMatch` | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business. `Inactive` includes suspended businesses and those no longer in operation. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | | `ubo_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the business. Distinguished by the `uboName_input` field on each entry. | | `directors_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted director against directors associated with the business. Distinguished by the `directorsName_input` field. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-kenya` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-kenya/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-kenya.md # Kenya Kenya eKYB validates the legitimacy of Kenyan businesses by checking their tax ID, business name, and address against Kenyan government sources of truth. Kenya eKYB is currently available only in the Incode demo environment, not in production. Contact Incode support for availability. UBOs and directors are not currently supported for Kenya. ## Source | Country | Source | Description | | ------- | ---------------------------------- | ------------------------------------------------------------------------------------- | | Kenya | Kenyan government sources of truth | Verifies submitted business details against records maintained in Kenyan registries. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ------------------------------------------------------ | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `KE`. | | `taxId` | Mandatory | String. Kenyan business tax ID. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "SOUTHAMPTON SPORTS CLUB KENYA LIMITED", "street": "Kemp House, Stadium Lane", "addressLine2": "Off Moi Avenue", "city": "Nairobi", "country": "KE", "taxId": "P051234567T" } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified", "reasonCodes": ["REGNO"] }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "sub_label": "Private Limited Company (Ltd)" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Found`, `Not Found` | Submitted tax ID against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business. `Inactive` includes suspended businesses and those no longer in operation. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-malta` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-malta/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-malta.md # Malta Malta eKYB validates the legitimacy of Maltese businesses by checking their registration number (MBR number), business name, address, UBOs, and directors against Malta's government database. ## Source | Country | Source | Description | | ------- | ------------------------- | ------------------------------------------------------------------------------------------ | | Malta | Malta government database | Verifies submitted business details against records maintained in the government database. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Verification API Reference](/general-reference/ekyb-verification-api-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `MT`. | | `taxId` | Mandatory | String. Maltese MBR registration number. Accepted formats: `C` followed by digits (e.g. `C12345`), or `MT` + 8 digits (VAT format, e.g. `MT12345678`). The `MT` prefix is stripped automatically before processing. | | `businessName` | Optional | String. Registered name of the business. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State or region in the business address. | | `postalCode` | Optional | String. Maltese postal code: 3 letters + 4 digits (e.g. `VLT1234`). | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the MBR number. | | `directors` | Optional | Array. Full legal names of directors to check against records associated with the MBR number. | The `country` parameter limits business validation to the specified region. Only businesses established in the country specified in the eKYB request are validated. ### Sample request ```json { "plugins": ["ekyb"], "country": "MT", "taxId": "C12345", "businessName": "EXAMPLE MALTA LIMITED", "street": "TRIQ IL-MERKANTI", "houseNo": "5", "city": "VALLETTA", "postalCode": "VLT1234", "uboNames": ["JOHN DOE", "SARAH SMITH"], "directors": ["JOHN BORG"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified" }, { "key": "address_verification", "sub_label": "Approximate Match" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "Private Limited Liability Company" } }, { "key": "ubo_name_match", "sub_label": "Verified", "uboName_input": "John Doe" }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "Sarah Smith" }, { "key": "directors_name_match", "sub_label": "Verified", "directorsName_input": "John Borg" }, { "key": "directors_name_match", "sub_label": "Unverified", "directorsName_input": "Sarah Schrader" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the MBR number. | | `tin` | `Verified`, `Unverified` | Submitted MBR registration number against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the MBR number. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the MBR number. | | `postalCodeMatch` | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the MBR number. Format: 3 letters + 4 digits (e.g. `VLT1234`). | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business in the government database. See [Registration status values](#registration-status-values) for definitions. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available (e.g. Private Limited Liability Company). If not available, displays `Unknown`. | | `ubo_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the MBR number. Distinguished by the `uboName_input` field on each entry. | | `directors_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted director against directors associated with the MBR number. Distinguished by the `directorsName_input` field on each entry. | ### Registration status values | Status | Description | | -------- | ----------------------------------------------------------------------------------- | | Active | The business registration is active. | | Inactive | The business registration is suspended, inactive, or the business no longer exists. | | Unknown | Registration status is not available. | ### Approximate Match `Approximate Match` is generated through Incode's proprietary fuzzy matching algorithm. It is returned when the submitted string is similar to, but not an exact match for, the value stored in the government database. This accounts for misspellings, typographical errors, and slight variations in input data. ### Error responses See the [eKYB Verification API Reference](/general-reference/ekyb-verification-api-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-mexico` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-mexico/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-mexico.md # Mexico Mexico eKYB Verification validates the legitimacy of Mexican businesses by checking their tax ID, business name, and address against Mexican government sources of truth. Mexico eKYB Verification is available in two modes: - **Standard**: Full verification of business name, address, and tax ID. - **Lite**: Reduced verification limited to business name, tax ID, and postal code. UBOs and directors are not currently supported for Mexico Verification in any mode. For enrichment via lookup rather than field-by-field verification, see Mexico Prefill. ## Source | Country | Source | Description | | ------- | ----------------------------------- | -------------------------------------------------------------------------------------- | | Mexico | Mexican government sources of truth | Verifies submitted business details against records maintained in Mexican registries. | ## Standard mode ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ---------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `MX`. | | `taxId` | Mandatory | String. RFC (Registro Federal de Contribuyentes). See [Tax ID formats](#tax-id-formats) for details. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State in the business address. | | `postalCode` | Optional | String. 5-digit Mexican postal code. | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "Aerolíneas del Sureste S.A. de C.V.", "street": "Avenida Patriotismo", "addressLine2": "Piso 5, Torre Ejecutiva", "city": "Ciudad de México", "state": "Ciudad de México", "postalCode": "03800", "country": "MX", "taxId": "ASU1003149Z1" } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified" }, { "key": "address_verification", "sub_label": "Approximate Match" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "Sole Proprietorship (Persona Física)" } } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Found`, `Not Found` | Submitted tax ID against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the tax ID. | | `postalCodeMatch` | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business. `Inactive` includes suspended businesses and those no longer in operation. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | ## Lite mode Lite mode performs only postal code verification, in addition to business name and tax ID checks. ### Request parameters | Parameter | Required | Description | | -------------- | --------- | --------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `MX`. | | `taxId` | Mandatory | String. RFC. See [Tax ID formats](#tax-id-formats) for details. | | `postalCode` | Mandatory | String. 5-digit Mexican postal code. | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "Aerolíneas del Sureste S.A. de C.V.", "postalCode": "03800", "country": "MX", "taxId": "ASU1003149Z1" } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "S.A. de C.V." } } ] } ``` ### Response fields | Key | Status | Description | | -------------------- | --------------------------------- | ----------------------------------------------------------------------------------------- | | `name` | `Verified`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Verified`, `Unverified` | Submitted tax ID against the government database. | | `postalCodeMatch` | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | ## Tax ID formats RFC (Registro Federal de Contribuyentes) is the Mexican federal tax identifier. | Entity Type | Format | | ----------- | ---------------------------------------------------------------- | | Individual | 13 characters: 4 letters + 6 numbers + 3 alphanumeric characters | | Business | 12 characters: 3 letters + 6 numbers + 3 alphanumeric characters | ### Error responses See the [eKYB Verification API Reference](/general-reference/ekyb-verification-api-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-netherlands` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-netherlands/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-netherlands.md # Netherlands Netherlands eKYB validates the legitimacy of Dutch businesses by checking their tax ID, business name, address, UBOs, and directors against Dutch government sources of truth. ## Source | Country | Source | Description | | ----------- | --------------------------------- | ------------------------------------------------------------------------------------ | | Netherlands | Dutch government sources of truth | Verifies submitted business details against records maintained in Dutch registries. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ---------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `NL`. | | `taxId` | Mandatory | String. Accepts VAT (`NL + 9 digits + B + 2 digits`) or KvK (8 digits). | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State in the business address. | | `postalCode` | Optional | String. Dutch postal code (4 digits, space, and 2 letters). | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the business. | | `directors` | Optional | Array. Full legal names of directors to check against records associated with the business. | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "Tulip Tech B.V.", "street": "Herengracht", "houseNo": "100", "city": "AMSTERDAM", "state": "NORD-HOLLAND", "postalCode": "1015BS", "country": "NL", "taxId": "12345678", "uboNames": ["Sanne de Vries"], "directors": ["Jeroen van Dijk"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified", "reasonCodes": ["REGNO"] }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "Private limited liability company" } }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "Daan Visser" }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "Sarah Smith" }, { "key": "directors_name_match", "sub_label": "Unverified", "directorsName_input": "Andrew Martin" }, { "key": "directors_name_match", "sub_label": "Verified", "directorsName_input": "Thijs Mulder" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Verified`, `Not Verified` | Submitted tax ID against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the tax ID. | | `postalCodeMatch` | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business. `Inactive` includes suspended businesses and those no longer in operation. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | | `ubo_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the business. Distinguished by the `uboName_input` field on each entry. | | `directors_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted director against directors associated with the business. Distinguished by the `directorsName_input` field. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-nigeria` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-nigeria/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-nigeria.md # Nigeria Nigeria eKYB validates the legitimacy of Nigerian businesses by checking their tax ID, business name, address, and UBOs against Nigerian government sources of truth. Nigeria eKYB is currently available only in the Incode demo environment, not in production. Contact Incode support for availability. Directors are not currently supported for Nigeria. ## Source | Country | Source | Description | | ------- | ------------------------------------ | --------------------------------------------------------------------------------------- | | Nigeria | Nigerian government sources of truth | Verifies submitted business details against records maintained in Nigerian registries. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ---------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `NG`. | | `taxId` | Mandatory | String. TIN (Tax Identification Number). | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State in the business address. | | `postalCode` | Optional | String. 6-digit Nigerian postal code. | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the business. | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "SkyBridge Aviation Services Ltd.", "street": "West Terminal Boulevard, Suite 310", "addressLine2": "3rd Floor Port Harcourt International Airport", "city": "Port Harcourt", "state": "Rivers", "postalCode": "500102", "country": "NG", "taxId": "NG-X-NG0000098712", "uboNames": ["Oluwaseun Okonkwo", "Marian Ekong"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified", "reasonCodes": ["REGNO"] }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "state", "sub_label": "Verified" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "sub_label": "Private Company Limited by Shares (Ltd)" }, { "key": "ubo_name_match", "sub_label": "Verified", "uboName_input": "Oluwaseun Okonkwo" }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "Marian Ekong" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Found`, `Not Found` | Submitted tax ID against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the tax ID. | | `state` | `Verified`, `Approximate Match`, `Unverified` | Submitted state against the state associated with the tax ID. | | `postalCodeMatch` | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business. `Inactive` includes suspended businesses and those no longer in operation. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | | `ubo_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the business. Distinguished by the `uboName_input` field on each entry. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-spain` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-spain/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-spain.md # Spain Spain eKYB validates the legitimacy of Spanish businesses by checking their tax ID, business name, address, UBOs, and directors against Spanish government sources of truth. ## Source | Country | Source | Description | | ------- | ----------------------------------- | -------------------------------------------------------------------------------------- | | Spain | Spanish government sources of truth | Verifies submitted business details against records maintained in Spanish registries. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ---------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `ES`. | | `taxId` | Mandatory | String. Accepts VAT Number or Registration Number. See [Tax ID formats](#tax-id-formats) for details. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State in the business address. | | `postalCode` | Optional | String. 5-digit Spanish postal code. | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the business. | | `directors` | Optional | Array. Full legal names of directors to check against records associated with the business. | ### Tax ID formats | Entity Type | Format | | ------------------- | -------------------------- | | Regular company | Letter + 8 digits | | Foreign Sole Trader | Letter + 7 digits + Letter | | Sole Trader | 8 digits + Letter | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "REAL MADRID CLUB DE FUTBOL", "street": "Avenida de Concha Espina", "houseNo": "1", "city": "MADRID", "postalCode": "28036", "country": "ES", "taxId": "XXXXXXXXX", "uboNames": ["Sarah Smith"], "directors": ["Florentino Perez"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Found", "reasonCodes": ["REGNO"] }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "Private limited with Share Capital" } }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "Sarah Smith" }, { "key": "directors_name_match", "sub_label": "Verified", "directorsName_input": "Florentino Perez" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Found`, `Not Found` | Submitted tax ID against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the tax ID. | | `postalCodeMatch` | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business. `Inactive` includes suspended businesses and those no longer in operation. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | | `ubo_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the business. Distinguished by the `uboName_input` field on each entry. | | `directors_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted director against directors associated with the business. Distinguished by the `directorsName_input` field. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-united-kingdom` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-united-kingdom/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-united-kingdom.md # United Kingdom United Kingdom eKYB validates the legitimacy of British businesses by checking their tax ID, business name, address, UBOs, and directors against UK government sources of truth. ## Source | Country | Source | Description | | -------------- | ------------------------------ | --------------------------------------------------------------------------------- | | United Kingdom | UK government sources of truth | Verifies submitted business details against records maintained in UK registries. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ---------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `GB`. | | `taxId` | Mandatory | String. Accepts Registration Number or VAT Number. See [Tax ID formats](#tax-id-formats) for details. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address. | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State in the business address. | | `postalCode` | Optional | String. UK postal code (5-7 alphanumeric characters). | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the business. | | `directors` | Optional | Array. Full legal names of directors to check against records associated with the business. | ### Tax ID formats | Tax ID Type | Format | | ------------------- | ------------------------------------------------------------- | | Registration Number | 8 digits (or 7 digits, in which case a leading zero is added) | | VAT Number | `GB` + 9 digits | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "SOUTHAMPTON FOOTBALL CLUB LIMITED", "street": "S STADIUM ST MARY Kemp House", "addressLine2": "BRITANNIA ROAD", "city": "SOUTHAMPTON", "postalCode": "SO14 0AA", "country": "GB", "taxId": "XXXXXXXXX", "uboNames": ["ST MARY'S FOOTBALL GROUP LTD", "Sarah Smith"], "directors": ["Andrew Martin", "Sarah Schrader"] } ``` ### Sample response ```json { "kyb": [ { "key": "name", "sub_label": "Verified" }, { "key": "tin", "sub_label": "Verified", "reasonCodes": ["REGNO"] }, { "key": "address_verification", "sub_label": "Verified" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "Private limited with Share Capital" } }, { "key": "ubo_name_match", "sub_label": "Verified", "uboName_input": "ST MARY'S FOOTBALL GROUP LTD" }, { "key": "ubo_name_match", "sub_label": "Unverified", "uboName_input": "Sarah Smith" }, { "key": "directors_name_match", "sub_label": "Verified", "directorsName_input": "Andrew Martin" }, { "key": "directors_name_match", "sub_label": "Unverified", "directorsName_input": "Sarah Schrader" } ] } ``` ### Response fields | Key | Status | Description | | ---------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | `name` | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | `Verified`, `Unverified` | Submitted tax ID against the government database. | | `address_verification` | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `cityMatch` | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the tax ID. | | `postalCodeMatch` | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the tax ID. | | `registrationStatus` | `Active`, `Inactive`, `Unknown` | Registration status of the business. `Inactive` includes suspended businesses and those no longer in operation. | | `entityType` | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | | `ubo_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the business. Distinguished by the `uboName_input` field on each entry. | | `directors_name_match` | `Verified`, `Approximate Match`, `Unverified` | Submitted director against directors associated with the business. Distinguished by the `directorsName_input` field. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyb-verification-reference-united-states` - URL: https://developer.incode.com/general-reference/ekyb-verification-reference-united-states/ - Markdown: https://developer.incode.com/general-reference/ekyb-verification-reference-united-states.md # United States United States eKYB validates the legitimacy of US businesses by checking their tax ID, business name, address, and UBOs against US government sources of truth. US eKYB is offered in two variants: - **Advanced**: Core verification including business name, tax ID, address, city, postal code, registration status, and UBO name match. - **Advanced+**: Everything in Advanced, plus address deliverability, address property type, entity type, and the full list of individuals associated with the business. Both variants use the same endpoint, request parameters, and match fields. Advanced+ returns additional response fields not present in Advanced. ## Sources | Country | Source | Description | | ------------- | --------- | ------------------------------------------------------------------------------------------------------------------- | | United States | Advanced | Verifies business details against IRS records and state Secretary of State filings. | | United States | Advanced+ | Same source as Advanced, plus additional verification including USPS address deliverability and full people lookup. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB API Reference](/general-reference/ekyb-reference/). ### Request parameters Request parameters are identical for Advanced and Advanced+. | Parameter | Required | Description | | -------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | | `plugins` | Mandatory | Array. Must be `["ekyb"]`. | | `businessName` | Mandatory | String. Name of the business. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `US`. | | `taxId` | Mandatory | String. Accepts a 9-digit EIN issued by the IRS or a state-issued business registration number. See [Tax ID formats](#tax-id-formats) for details. | | `street` | Optional | String. Street name of the business. | | `houseNo` | Optional | String. Building or house number. | | `addressLine2` | Optional | String. Second line of the business address (for example, apartment or unit number). | | `city` | Optional | String. City in the business address. | | `state` | Optional | String. State in the business address. | | `postalCode` | Optional | String. 5-digit US postal code. | | `uboNames` | Optional | Array. Full legal names of Unique Beneficial Owners to check against records associated with the business. | At least one field from `street`, `houseNo`, `addressLine2`, `city`, `state`, or `postalCode` must be provided. ### Tax ID formats | Tax ID Type | Format | | ------------------------- | ------------------------------------ | | EIN | 9 digits, issued by the IRS. | | State Registration Number | No standard format; varies by state. | ### Sample request ```json { "plugins": ["ekyb"], "businessName": "Delta International Inc.", "street": "SW 72nd Ave", "houseNo": "4856", "city": "MIAMI", "state": "FL", "postalCode": "33155", "country": "US", "taxId": "XXXXXXXXX", "uboNames": ["Jose A Santos"] } ``` ### Sample response — Advanced ```json { "kyb": [ { "key": "name", "status": "success", "sub_label": "Verified", "message": "Match identified to the submitted Business Name" }, { "key": "tin", "status": "success", "sub_label": "Verified", "message": "The IRS has a record for the submitted TIN and Business Name combination" }, { "key": "address_verification", "status": "success", "sub_label": "Verified", "message": "Match identified to the submitted Office Address" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "ubo_name_match", "status": "success", "sub_label": "Verified" } ] } ``` ### Sample response — Advanced+ ```json { "kyb": [ { "key": "name", "status": "success", "sub_label": "Verified", "message": "Match identified to the submitted Business Name" }, { "key": "tin", "status": "success", "sub_label": "Verified", "message": "The IRS has a record for the submitted TIN and Business Name combination" }, { "key": "address_verification", "status": "success", "sub_label": "Verified", "message": "Match identified to the submitted Office Address" }, { "key": "address_deliverability", "status": "success", "sub_label": "Deliverable", "message": "The USPS is able to deliver mail to the submitted Office Address" }, { "key": "address_property_type", "status": "success", "sub_label": "Commercial", "message": "Submitted Office Address is a Commercial property" }, { "key": "postalCodeMatch", "sub_label": "Verified" }, { "key": "cityMatch", "sub_label": "Verified" }, { "key": "registrationStatus", "sub_label": "Active" }, { "key": "entityType", "entityType": { "entityType": "Private limited with Share Capital" } }, { "key": "ubo_name_match", "status": "success", "sub_label": "Verified" }, { "key": "people", "people": [ { "name": "PANDO, ADA B.", "titles": [{ "title": "DIRECTOR" }] }, { "name": "PANDO, SARAH A.", "titles": [{ "title": "DIRECTOR" }] }, { "name": "MARTIN, JOHN", "titles": [ { "title": "DIRECTOR" }, { "title": "REGISTERED AGENT" } ] }, { "name": "SANTOS, JOSE A", "titles": [ { "title": "CEO" }, { "title": "PRESIDENT" }, { "title": "REGISTERED AGENT" }, { "title": "VICE PRESIDENT" } ] } ] } ] } ``` ### Response fields The Available column indicates which variants return each field. | Key | Available | Status | Description | | ------------------------ | ------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `name` | Advanced, Advanced+ | `Verified`, `Approximate Match`, `Unverified` | Submitted business name against the business name associated with the tax ID. | | `tin` | Advanced, Advanced+ | `Verified`, `Unverified` | Submitted tax ID against the government database. See [Tax ID verification messages](#tax-id-verification-messages) for the specific messages returned per Tax ID type and outcome. | | `address_verification` | Advanced, Advanced+ | `Verified`, `Approximate Match`, `Unverified` | Submitted address against the address associated with the tax ID. | | `address_deliverability` | Advanced+ | `Deliverable`, `Not Deliverable` | USPS deliverability status of the submitted address. | | `address_property_type` | Advanced+ | `Commercial`, `Residential` | Property type of the submitted address. | | `cityMatch` | Advanced, Advanced+ | `Verified`, `Approximate Match`, `Unverified` | Submitted city against the city associated with the tax ID. | | `postalCodeMatch` | Advanced, Advanced+ | `Verified`, `Unverified` | Submitted postal code against the postal code associated with the tax ID. | | `registrationStatus` | Advanced, Advanced+ | `Active`, `Inactive`, `Unknown` | Registration status of the business across states with SOS filings. `Active` if active in some or all states; `Inactive` if suspended or inactive in all; `Unknown` if not available. | | `entityType` | Advanced+ | Legal entity type of the business | The legal entity type of the company, if available. If not available, displays `Unknown`. | | `ubo_name_match` | Advanced, Advanced+ | `Verified`, `Approximate Match`, `Unverified` | Submitted UBO against UBOs associated with the business. Distinguished by the `uboName_input` field on each entry. | | `people` | Advanced+ | Array of individuals and their titles | Full list of individuals associated with the business entity, with associated titles (for example, DIRECTOR, REGISTERED AGENT, CEO, PRESIDENT, VICE PRESIDENT). | The `sub_label` field is the primary indicator of match outcome. Response entries that also include `status` and `message` fields provide additional context useful for risk-based decisioning. ### Tax ID verification messages The `tin` response field returns a `message` describing the specific verification outcome. Messages differ based on Tax ID type and match outcome. | Tax ID Type | Condition | Message | | ------------------- | -------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | | EIN | Tax ID is found in IRS and valid | The IRS has a record for the submitted TIN and Business Name combination. | | EIN | Tax ID is found in IRS but not associated with the submitted Business Name | We believe the submitted TIN is associated with a different business name. | | EIN | Tax ID is not found in IRS | The IRS does not have a record for the submitted TIN and Business Name combination. | | State-issued Tax ID | Tax ID and Business Name are associated with each other | The Tax ID provided is associated with the Business Name. | | State-issued Tax ID | Tax ID and Business Name are not associated with each other | We could not determine a record for the submitted TIN and Business Name combination. | | State-issued Tax ID | Neither Tax ID nor Business Name could be found | We could not find a business with the provided name or tax ID. | ### Error responses See the [eKYB API Reference](/general-reference/ekyb-reference/) for standard error responses. ## Single Session Dashboard results View eKYB results on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ekyc-api-reference` - URL: https://developer.incode.com/general-reference/ekyc-api-reference/ - Markdown: https://developer.incode.com/general-reference/ekyc-api-reference.md # eKYC API Reference The External Verification (eKYC) endpoint (`POST /omni/externalVerification/ekyc`) verifies an individual's identity against country-specific data sources and returns a set of match and risk-level fields describing the result. This page explains the response semantics for that endpoint: how to interpret match fields, status values, risk levels, metadata fields, reason codes, error responses, and Risk Add-ons. For the request contract (headers, request body schema, sample requests), see the [External Verification (eKYC)](/reference/externalverificationekyc/) API reference. For per-source response schemas, mandatory fields, and overallLevel calculations, see the country pages in this section. For the Brazil-only Income Verification endpoint (`POST /omni/externalVerification/income`), see the [Brazil](/general-reference/ekyc-reference-brazil/) country page. ## Response field categories Response fields returned by the eKYC endpoint fall into three categories: - **Match fields** compare a submitted value (name, address, date of birth, and so on) against the value found in the source of truth. Match field names follow one of several patterns depending on how the source anchors verification (see the following section). - **Risk level fields** return aggregate risk assessments for the submitted values (`overallLevel`, `phoneLevel`, `taxIdLevel`, `addressRiskLevel`, `emailLevel`). - **Metadata fields** describe attributes of the source-of-truth data itself, rather than match statuses (for example, `phoneCarrier`, `phoneLineType`, `panStatus`, `deliverability`). Not all fields appear in every response. The fields returned depend on the source used for the verification. ## Match field naming conventions Different sources anchor verification differently, and the match field names reflect the anchor. Understanding the anchor makes response schemas easier to read. | Anchor | Match field pattern | Examples of sources | | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- | | Source of truth register | `firstNameMatch`, `dobMatch`, `idNumMatch`, `phoneMatch`, and so on. Each submitted field is matched against its counterpart in the register. | Argentina, Canada, Chile, Greece, Guatemala, Spain, Sweden, United Kingdom (Voter Register), US Credit Bureau 3 | | Phone number | `phoneNameMatch`, `phoneAddressMatch`, `phoneDobMatch`, `phoneCityMatch`, and so on. Each submitted field is matched against the record associated with the submitted phone number. | US Telco 1, US Telco 2, US Telco 4, US Telco 5 | | Tax ID | `taxIdMatch`, `taxIdNameMatch`, `taxIdDobMatch`, `taxIdAddressMatch`, and so on. Each submitted field is matched against the record associated with the submitted tax ID. | US Credit Bureau 1, Brazil Government (BR GOVT 1) | | Address | `nameMatch`, `streetMatch`, `cityMatch`, `stateMatch`, `zipcodeMatch`, `addressMatch`. Match fields focus on the address itself; the address also carries USPS deliverability and validity signals. | US Address 1 | | Document | Document-specific patterns: `dlNumberMatch`, `dlNameMatch`, `dlDobMatch` (driver's license); `panNumberMatch`, `panNameMatch`, `panStatus` (PAN card). | US Drivers License, India PAN | See the country pages for the full response schema of each source. ## Status values Match fields return a status indicating the quality of the match. Common status values: | Status | Meaning | | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- | | `exact` | The submitted value exactly matches the value in the source of truth. | | `fuzzy` | The submitted value approximately matches the value in the source of truth (per a proprietary algorithm). | | `approximatematch` | Alternative label for a fuzzy match, used by some sources (Brazil Government, Guatemala). | | `nomatch` | The submitted value does not match the value in the source of truth. | | `nodata` | No corresponding value was found in the source of truth to compare against. | | `unknown` | The source of truth does not have this information available for comparison. | | `unabletoverify` | The specific attribute could not be validated. Used by Brazil Government for address components when the individual has no driver's license record. | See the country pages for source-specific status values and their meanings. ## Risk level fields Risk level fields return aggregate risk assessments. The specific set of risk level fields returned varies by source. | Field | Statuses | Description | | ------------------ | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ | | `overallLevel` | `low`, `medium`, `high`, `very_high` | The overall risk level for the verification. Calculation varies by source; see the country pages for source-specific calculation logic. | | `taxIdLevel` | `low`, `medium`, `high`, `very_high` | Risk level associated with the submitted tax ID. Returned by tax-ID-anchored sources. | | `phoneLevel` | `low`, `medium`, `high`, `very_high` | Risk level associated with the submitted phone number. Returned by phone-anchored sources and by sources that include phone risk scoring. | | `addressRiskLevel` | `low`, `medium`, `high`, `very_high` | Risk level associated with the submitted address, independent of address matching. Based on USPS deliverability and address validity data. | | `emailLevel` | `low`, `medium`, `high`, `very_high` | Risk level associated with the submitted email address. Based on validity, deliverability, breach history, and behavioral signals. | | `emailDomainLevel` | `low`, `high` | Risk level associated with the submitted email's domain. | `overallLevel` is customizable per customer requirements. The calculations documented on each country page reflect Incode's default thresholds; contact your Incode representative to adjust thresholds for your use case. ## Metadata fields Some sources return metadata about the source-of-truth data itself, rather than match statuses. Common examples: | Field | Type | Description | | ---------------- | ------- | ------------------------------------------------------------------------------------------------------------------------ | | `phoneCarrier` | String | The phone carrier associated with the submitted phone number (for example, `T-Mobile USA`, `Verizon`). | | `phoneLineType` | String | The type of phone line (for example, `Mobile`, `Landline`, `FixedVOIP`, `NonFixedVOIP`). | | `lastPorted` | Date | Date the phone number was last ported, in `yyyy-mm-dd` format. Only returned if the number has been ported. | | `activityScore` | Integer | Activity score (0-1000) representing the quality of a phone number. Higher scores indicate better activity. | | `panStatus` | String | Status of the PAN card (`Active`, `Inactive`). India PAN only. | | `panHolderType` | String | The type of entity associated with the PAN number (for example, `Individual`, `Business`). India PAN only. | | `deliverability` | String | USPS deliverability status of an address. US Address 1 only. | | `addressValid` | Boolean | Whether the submitted address exists as a real location in postal, mapping, or delivery data sources. US Address 1 only. | See the country pages for the full set of metadata fields returned by each source. ## Reason codes Some sources return reason codes alongside match fields and risk level fields. Reason codes provide additional context for a match result or risk assessment (for example, indicating that an address matched but is a PO Box, or that a phone number is associated with a high-risk line type). Reason codes are returned in a `reasonCodes` array on the relevant field. For the full list of reason codes and their meanings, see [eKYC Reason Codes](/general-reference/ekyc-reason-codes/). ## Error responses The eKYC endpoint returns conventional HTTP response codes. Common error scenarios: - **400 Bad Request:** Missing mandatory fields for the selected source. The response body identifies which field is missing. See each source's request parameters on the country pages for source-specific mandatory fields. - **400 Bad Request:** Phone number not in international E.164 format (for example, `+14081234567`). Applies to any source that accepts `phone` as a parameter. - **400 Bad Request:** Invalid `country` value for the selected source. The `country` parameter must match the expected country code for the source (for example, `US`, `BR`, `GB`, or `GL` for Risk Add-ons). For the full list of HTTP response codes and general API error handling, see [API responses](/reference/introduction/#api-responses). ## Risk Add-ons Risk Add-ons are supplementary checks that evaluate the trust and potential risk of a phone number or email address. They are invoked through the standard eKYC endpoint with `country: "GL"` and a source-specific identifier. Risk Add-ons can be run alongside a country-specific eKYC check or configured as standalone checks under the Global country with the _Risk Add-ons Only_ source (see the [eKYC Dashboard configuration page](/dashboard-platform-administration/ekyc-dashboard/) for details). ### Phone Check **Source:** `PHONE_RISK_1` Evaluates a phone number and returns validity, activity, carrier information, and a risk score based on signals such as line type, VOIP or prepaid status, breach exposure, and spam reports. **Response fields:** | Field | Statuses / Type | Description | | ----------------- | ------------------------------------ | ------------------------------------------------------------------------------------------------------------- | | `phoneValid` | `true`, `false` | Whether the phone number is properly formatted and valid for the country's carrier ranges. | | `phoneActive` | `true`, `false`, `unknown` | Whether the phone number is a live, usable, currently active phone number. | | `phoneVOIP` | `true`, `false`, `unknown` | Whether the phone number is a Voice Over IP (VOIP) or digital phone number. | | `phonePrepaid` | `true`, `false`, `unknown` | Whether the phone number is associated with a prepaid service plan. | | `phoneRisky` | `true`, `false`, `unknown` | Whether the phone number is associated with fraudulent activity, scams, robocalls, fake accounts, or similar. | | `phoneLineType` | String | The type of line associated with the phone number. | | `phoneCarrier` | String | The carrier associated with the phone number. | | `phoneLeaked` | `true`, `false` | Whether the phone number has recently been exposed in an online database breach. | | `phoneSpammer` | `true`, `false` | Whether the phone number has recently been reported for spam or harassing calls or texts. | | `phoneFraudScore` | `low`, `medium`, `high` | Fraud score based on a proprietary scale: less than 75 is low, 75-85 is medium, greater than 85 is high. | | `overallLevel` | `low`, `medium`, `high`, `very_high` | Aggregate risk assessment. See below for calculation logic. | **overallLevel calculation:** - `very_high` if `phoneValid == false` OR `phoneActive == false` OR `phoneRisky == true` OR `phoneFraudScore == high` - `high` if (`phoneValid == false` OR `phoneActive == false`) AND (`phoneRisky == true` OR `phoneFraudScore == high`) - `medium` if `phoneValid == true` AND `phoneActive == true` AND (`phoneRisky == true` OR `phoneFraudScore == medium`) - `low` otherwise ### Advanced Phone Check **Source:** `PHONE_RISK_2` Extends Phone Check with additional intelligence signals: porting history, first-seen date in the data partner's network, associated social media platforms, breach history including first and last breach dates, and a digital footprint score. Returns a confidence level alongside the overall risk level. **Response fields:** | Field | Statuses / Type | Description | | ------------------------ | ------------------------------------ | ----------------------------------------------------------------------------------------------------- | | `phoneValid` | `true`, `false` | Whether the phone number is valid. | | `phoneActive` | `true`, `false` | Whether the phone number is a live, usable phone number that is currently active. | | `phonePorted` | `true`, `false` | Whether the phone number has been ported. | | `currentCarrier` | String | Current carrier or service provider. | | `previousCarrier` | String | Previous carrier or service provider. | | `lastPorted` | Date | Date the number was last ported in `yyyy-mm-dd` format. Only present if the number has been ported. | | `phoneLineType` | String | Type of line (for example, mobile, landline). | | `isDisposable` | `true`, `false` | Whether the phone number is a disposable type. | | `activityScore` | Integer | Activity score (0-1000) representing the quality of the phone number. | | `activityDescription` | String | Describes the amount of network activity available. | | `totalBreaches` | String | Number of breaches the phone number was found in. | | `firstBreachDate` | Date | Date the number was first found in a data breach. | | `lastBreachDate` | Date | Date the number was most recently found in a data breach. | | `multipleBreachExposure` | `true`, `false` | Whether the phone number was found in multiple breaches. | | `connectedPlatforms` | String | Comma-separated list of social media platforms where an account is associated with this phone number. | | `digitalPresenceScore` | Integer | Digital footprint score (0-1000). | | `footprintScore` | Integer | Digital footprint score (0-1000). Higher scores indicate better activity and confidence. | | `phoneName` | String | Name of the person associated with this phone number. | | `firstSeen` | Date | Date when this phone number was first seen in the data partner's network. | | `checkStatus` | String | Outcome of the check for the provided phone number. | | `confidenceLevel` | `low`, `medium`, `high`, `very_high` | Confidence level in the verification result. | | `overallLevel` | `low`, `medium`, `high`, `very_high` | Aggregate risk level for the phone number. | ### Email Check **Source:** `EMAIL_RISK_1` Evaluates an email address for validity, deliverability, and fraud risk. Includes signals for breach exposure, email address age, domain age, and legitimate user activity. **Response fields:** | Field | Statuses / Type | Description | | --------------------- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | | `emailValid` | `true`, `false` | Whether the email address appears valid. | | `emailDeliverability` | `low`, `medium`, `high` | Likelihood that emails will be delivered to the recipient's mailbox. | | `emailLeaked` | `true`, `false` | Whether the email address was associated with a recent third-party database leak. | | `emailFirstSeen` | String | Estimated email address age, based on when the address was first discovered. | | `domainFirstSeen` | String | When the email domain was registered. | | `emailUserActivity` | `high`, `medium`, `low`, `none` | Frequency of legitimate purchases, account registrations, and other legitimate online behavior for this address. | | `emailFraudScore` | `low`, `medium`, `high` | Fraud score: less than 75 is low, 75-85 is medium, greater than 85 is high. | | `overallLevel` | `low`, `medium`, `high`, `very_high` | Aggregate risk assessment. See below for calculation logic. | **overallLevel calculation:** - `very_high` if `emailValid == false` OR `emailDeliverability == low` OR `emailFraudScore == high` - `high` if `emailValid == false` AND (`emailDeliverability == low` OR `emailFraudScore == high`) - `medium` if `emailValid == true` AND (`emailDeliverability == medium` OR `emailFraudScore == medium`) - `low` otherwise
          --- - Path: `general-reference/ekyc-coverage` - URL: https://developer.incode.com/general-reference/ekyc-coverage/ - Markdown: https://developer.incode.com/general-reference/ekyc-coverage.md Incode provides reliable eKYC verification worldwide, leveraging a wide range of trusted data sources to ensure secure and compliant identity checks. eKYC verifies a customer's identity without requiring physical documents by confirming that the identification data provided matches the relevant authoritative source of truth in the customer's country. Not all countries and data sources listed below are currently live in production. Additional coverage can be enabled based on customer demand and specific use case requirements. Contact your Incode representative for details. The set of sources visible in your Dashboard's eKYC configuration panel is a subset of this coverage table. For sources currently available in your Dashboard and the API-level detail for each, see the country pages in this section. | Country Code | Country | Type of Data | Fields supported (Mandatory inputs in **bold**) | | ------------ | -------------------- | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | | AF | Afghanistan | Official Voter Register | **Name, Address, Gender, National ID (Voter ID)** | | AL | Albania | Official Voter Register | **Name, Address, Gender, National ID (Voter ID)** | | AD | Andorra | Utility - Phone Register | **Name,** Address, Date of Birth, Gender, Phone | | AR | Argentina | National ID, Credit Bureau | **Name**, Address, Date of Birth, National ID (DNI) | | AR | Argentina | Citizens - AFIP (Administración Federal de Ingresos Públicos) | **Name, Date of Birth, National ID (DNI)** | | AR | Argentina | Credit Bureau | **Name, Address, Date of Birth, Gender, Phone, National ID** | | AR | Argentina | National ID | **Name, Address, Date of Birth, Gender, National ID** | | AR | Argentina | Government | **Name**, **Address**, Date of Birth, Gender | | AR | Argentina | Official Resident Register | **Name**, **Address**, Date of Birth, Gender | | AR | Argentina | Credit Bureau | **Name**, Address, Date of Birth, Phone, National ID (DNI) | | AR | Argentina | Official Civil Register | **Name**, Address, Date of Birth, Gender, National ID (DNI) | | AM | Armenia | Official Voter Register | **Name, Address, Date of Birth, Gender, National ID (Voter ID)** | | AM | Armenia | Official Resident Register | **Name, Address, Date of Birth** | | AU | Australia | Official National ID - Drivers License, Passport, Citizenship | **Name, Date of Birth, National ID (Drivers license)** | | AU | Australia | Credit Bureau | **Name, Address, Date of Birth** | | AU | Australia | Residential, Phone, Consumer, Payroll | **Name, Address, Date of Birth, Phone** | | AU | Australia | Death Check | **Name, Date of Birth** | | AU | Australia | Electoral Roll | **Name, Address, Date of Birth** | | AU | Australia | Document Verification Service (DVS) Identity Documents | **Name, Date of Birth, National ID (Document number)** | | AU | Australia | Utility - Phone Register | **Name**, Address, Gender, Phone | | AU | Australia | Official Voter Register | **Name, Address, Gender, Phone** | | AU | Australia | Official Resident Register | **Name, Address, Date of Birth, Gender, Phone** | | AU | Australia | Official National ID - VISA | **Name, Date of Birth, Gender, National ID (Passport)** | | AU | Australia | Official National Phone Register | **Name, Address, Date of Birth, Gender, Phone** | | AU | Australia | Consumer | **Name, Address, Date of Birth, Phone** | | AU | Australia | Telco & MNO | **Name, Address, Date of Birth, Phone** | | AU | Australia | VEVO - Department of Home Affairs Visa database | **Date of Birth, National ID (Document number)** | | AT | Austria | Credit Bureau | **Name, Address, Date of Birth** | | AT | Austria | Official Civil Register + Consumer Credit + Telco | **Name, Address, Date of Birth, Gender, Phone** | | AT | Austria | Consumer, Population Register & Telco | **Name, Address, Date of Birth, Phone** | | AT | Austria | Credit Bureau | **Name, Address, Date of Birth, Gender, Phone** | | BD | Bangladesh | Government | **Name**, Date of Birth, **National ID** | | BE | Belgium | Residential, Utility | **Name, Address, Date of Birth, Phone, Email** | | BE | Belgium | Official Citizenship Register | **Name, Address, Gender, Phone** | | BE | Belgium | Telco & MNO | **Name, Address, Date of Birth, Phone** | | BE | Belgium | Official Civil Register + Consumer Credit + Telco | **Name, Address, Date of Birth, Phone** | | BE | Belgium | Consumer, Population Register & Telco | **Name, Address, Date of Birth, Phone** | | BE | Belgium | Utility - Phone Register | **Name, Address, Gender, Phone** | | BE | Belgium | Consumer | **Name**, Address, Date of Birth, Phone | | BE | Belgium | Population Register | **Name**, **Address**, Date of Birth, Gender, Phone | | BJ | Benin | Official Voter Register | **Name, Address, Gender, National ID (Voter ID)** | | BM | Bermuda | Utility - Phone Register | **Name**, Address, Gender, Phone | | BO | Bolivia | Official Civil Register | **Name, Date of Birth, National ID** | | BR | Brazil | National ID - Receita Federal | **Name, Address, Date of Birth, National ID (CPF)** | | BR | Brazil | Telco | **Name, Address, Date of Birth, Phone** | | BR | Brazil | National ID | **Name, Address, Date of Birth, National ID (Tax ID)** | | BR | Brazil | Official Tax Register and Mobile Phone Register | **Name**, **Address**, Date of Birth, Gender, Phone, National ID (CPF) | | BR | Brazil | Official CPF | **Name**, **National ID (CPF)** | | BR | Brazil | Official Tax Register | **Name**, Address, Date of Birth, Gender, **National ID (CPF)** | | BR | Brazil | Telco & MNO | **Name**, Address, Date of Birth, **Phone** | | BR | Brazil | Official Civil Register and Tax Register | **Name**, Address, Date of Birth, Gender, Phone, **National ID (CPF)** | | BG | Bulgaria | Official Voter Register | **Name, Address, Gender, National ID (Voter ID)** | | BI | Burundi | Official Voter Register | **Name, Address, Gender, National ID (Voter ID)** | | KH | Cambodia | Official National ID | **Name**, Address, **Date of Birth**, Gender, **National ID (Voter ID)** | | KH | Cambodia | National ID | **Name, Date of Birth, National ID (Voter ID)** | | CM | Cameroon | Official Voter Register | **Name, Address, Date of Birth, National ID (Voter ID)** | | CM | Cameroon | Official Voter Register | **Name**, Address, Date of Birth, Gender, National ID | | CA | Canada | Credit Bureau, Residential | **Name, Address, Date of Birth, Phone** | | CA | Canada | Utility - Phone Register | **Name**, Address, Phone, Gender | | CA | Canada | Official Resident Register | **Name**, **Address**, Phone | | CA | Canada | Telco & MNO | Name, Address, Date Of Birth, **Phone** | | KY | Cayman Islands | Official Voter Register | **Name**, Address, Gender | | CL | Chile | National ID | **Name, Date of Birth, National ID (RUN)** | | CL | Chile | Utility - Phone Register | **Name**, Address, Phone, Gender | | CL | Chile | Official Civil Register | **Name, National ID (RUT)** | | CL | Chile | Official Civil Register | **Name**, Date of Birth, National ID (RUT) | | CL | Chile | Official Civil Register | **Name**, Address, Date of Birth, Gender, **National ID** | | CN | China | Official Voter Register | **Name**, **Address**, National ID, Phone | | CN | China | Official Bank Card | **Name, Date of Birth, National ID** | | CN | China | Official National Phone Register | **Name, Date of Birth, Phone, National ID** | | CN | China | Official National ID | **Name, Date of Birth, National ID** | | CN | China | Official Data Service (Bank card, National ID, Phone, Passport) | **Name, Date of Birth, Phone, National ID (Passport)** | | CO | Colombia | National ID Register (Registraduria) | **Name, Date of Birth, National ID (NUIP)** | | CO | Colombia | Official National ID | **Name, Date of Birth, National ID (Cédula de Ciudadanía, Cédula de Extranjería, NIT, Passport)** | | CO | Colombia | Official Civil Register | **Name, Address, Date of Birth, National ID (Cédula de Ciudadanía / PPT + Issue Date)** | | CO | Colombia | Official Civil Register | **Name, National ID (Cédula de Ciudadanía / PPT)** | | CO | Colombia | Official National ID | **Name, National ID (Cédula de Ciudadanía, Cédula de Extranjería, Tarjeta de Identidad, NIT, Passport)** | | CR | Costa Rica | Official Voter Register | **Name, Address, Gender** | | CR | Costa Rica | Official Civil Register | **Name, National ID (Cédula de Identidad)** | | HR | Croatia | Utility - Phone Register | **Name**, Address, Gender, Phone | | CU | Cuba | Official Voter Register | **Name**, Address, Gender | | CZ | Czech Republic | Residential - Property ownership registers | **Name, Address, Date of Birth** | | CZ | Czech Republic | Utility - Phone Register | **Name**, Address, Gender, Phone | | CZ | Czech Republic | Official Civil Register and Credit Bureau | **Name**, **Address**, Date of Birth, Gender, Phone | | DK | Denmark | Civil Registration, Consumer | **Name, Address, Date of Birth, Phone, National ID (CPR)** | | DK | Denmark | Consumer & Population Register | **Name**, Address, Date of Birth, Phone | | DK | Denmark | Consumer, Population Register & Telco | **Name**, Address, Date of Birth, Gender, Phone | | DK | Denmark | Official Civil Register + Consumer Credit + Telco | **Name**, Address, Date of Birth, **Phone** | | DK | Denmark | Official Tax Register | **Name**, Address, Date of Birth, Gender, National ID | | DK | Denmark | Official Civil Register | **Name**, Address, Phone | | DO | Dominican Republic | Official Civil Register | **Name, National ID (CIE Number)** | | DO | Dominican Republic | Consumer, Population Register & Telco | **Name**, Address, Date of Birth, Phone, National ID | | EC | Ecuador | Official Civil Register | **Name, National ID** | | EC | Ecuador | Official Civil Register | **Name, National ID (Cédula de Ciudadanía)** | | EC | Ecuador | Official Civil Register | **Name, National ID (Cédula de identidad)** | | EE | Estonia | Utility - Phone Register | **Name**, Address, Gender, Phone | | EE | Estonia | Official Voter Register | **Name**, Address, Gender | | FO | Faroe Islands | Utility - Phone Register | **Name**, Address, Gender, Phone | | FI | Finland | National ID, Consumer | **Name, Address, Date of Birth, National ID (PIN)** | | FI | Finland | Utility - Phone Register | **Name**, Address, Gender, Phone | | FI | Finland | Consumer, Population Register & Telco | **Name**, Address, Date of Birth, Phone | | FI | Finland | Official Civil Register | **Name**, Address, Phone | | FR | France | Residential, Phone | **Name, Address, Date of Birth, Phone** | | FR | France | Residential, Utility, Consumer | **Name, Address, Date of Birth, Phone** | | FR | France | Utility - Phone Register | **Name**, Address, Gender, Phone | | FR | France | Official Civil Register and Consumer Credit | **Name**, Address, Date of Birth, Phone, Gender | | FR | France | Population Register | **Name**, **Address**, Date of Birth, Gender, Phone | | FR | France | Consumer Data - Phone Register | **Name**, Address, Date of Birth, Gender, Phone | | FR | France | Consumer | **Name**, Address, Date of Birth, Gender, Phone | | FR | France | Consumer, Population Register & Telco | **Name**, Address, Date of Birth, Gender, Phone | | FR | France | Telco & MNO | **Name**, Address, Date of Birth, **Phone** | | GE | Georgia | Official Resident Register | **Name, Address, Gender** | | GE | Georgia | Official Voter Register | **Name, Address, Date of Birth, Gender, Phone** | | GE | Georgia | Official Department of Motor Vehicle | **Name, Address, Gender, National ID (Drivers license)** | | DE | Germany | Credit Bureau, Residential | **Name, Address, Date of Birth** | | DE | Germany | Credit Bureau, Residential, Phone, Utility | **Name, Address, Date of Birth, Phone** | | DE | Germany | Utility - Phone Register | **Name**, Address, Gender, Phone | | DE | Germany | Consumer, Population Register & Telco | **Name**, Address, Gender, Phone, Date of Birth | | DE | Germany | Official Civil Register and Consumer Credit | **Name**, Address, Date of Birth, Gender, Phone | | DE | Germany | Utility - Phone Register and Mobile Phone Register | **Name**, Address, Gender, Phone | | DE | Germany | Official Civil Register and Consumer Credit | **Name**, Address, Date of Birth | | DE | Germany | Credit Bureau | **Name**, **Address**, Date of Birth, Gender | | GI | Gibraltar | Utility - Phone Register | **Name**, Address, Gender, Phone | | GR | Greece | Official Voter Register and Consumer Credit | **Name, Address, Date of Birth, Gender, Phone, National ID** | | GR | Greece | Credit Bureau, Consumer | **Name, Address, Date of Birth, Phone, National ID (AFM)** | | GR | Greece | Official Voter Register | **Name**, Address, Date of Birth | | GR | Greece | Utility - Phone Register | **Name**, Address, Gender, Phone | | GP | Guadeloupe | Utility - Phone Register | **Name**, Address, Gender, Phone | | GT | Guatemala | Gov validation | **Name, Address, Gender, Phone** | | HK | Hong Kong | Official Resident Register | **Name, Address, Gender** | | HK | Hong Kong | Gov agency - property ownership data | **Name, Address** | | HK | Hong Kong | Land Register | **Name**, **Address**, Gender | | HU | Hungary | Utility - Phone Register | **Name**, Address, Gender, Phone | | IS | Iceland | Utility - Phone Register | **Name**, Address, Phone | | IN | India | PAN, Aadhaar | **Name, Date of Birth, National ID (PAN or Aadhar)** | | IN | India | Voter Register (EPIC) | **Name, Date of Birth, Voter ID (EPIC)** | | IN | India | Passport Seva Kendra | **Name, Date of Birth, National ID (Passport)** | | IN | India | DMV (RoadTransport Offices of the States of India) | **Name, Date of Birth, Address, National ID (Drivers license)** | | IN | India | Official Voter Register | **Name**, **Address**, National ID (Identity card) | | IN | India | Official National ID - Aadhar | Address, Gender, **National ID (Aadhar card)** | | IN | India | Official Department of Motor Vehicle | **Name**, Address, **Date of Birth**, **Gender**, **National ID (Drivers license)** | | IN | India | Official National ID - Pan Card | **Name**, Gender, **National ID (PAN card)** | | IN | India | Telco & MNO | **Name**, Address, Date of Birth, Gender, **Phone**, National ID | | ID | Indonesia | Resident Identity Card | **Name, Address, Date of Birth, Phone, National ID (NIK)** | | ID | Indonesia | Telco | **Name, Date of Birth, Phone** | | ID | Indonesia | Official National ID | **Name**, Date Of Birth, Gender, **National ID** | | ID | Indonesia | Consumer & Official Census | **Name**, Address, Date of Birth, Gender | | ID | Indonesia | Official National ID | **Name**, Address, Date of Birth, **National ID** | | ID | Indonesia | Telco & MNO | **Name,** Address, Date of Birth, Gender, **Phone** | | IR | Iran | Official Voter Register | **Name, Address, National ID (Voter ID)** | | IE | Ireland | Credit Bureau | **Name, Address, Date of Birth** | | IE | Ireland | Residential, Voter Register | **Name, Address, Date of Birth, National ID (PPSN)** | | IE | Ireland | Official Voter Register | **Name, Address, National ID (Voter ID)** | | IE | Ireland | Official Voter Register | **Name**, Address, Gender, National ID (Voter ID) | | IE | Ireland | Utility - Phone Register | **Name**, Address, Gender, Phone | | IE | Ireland | Official Resident Register | **Name**, Address, Date of Birth, Gender | | IE | Ireland | Credit Bureau | **Name**, **Address**, Date of Birth, Gender, Phone | | IE | Ireland | Public Register, Consumer List, Telco | **Name**, **Address**, Date of Birth, Gender, Phone | | IL | Israel | Official Resident Register | **Name, Address, Gender, Phone, National ID (Voter ID)** | | IL | Israel | Official Resident Register | **Name**, Address, **Phone**, National ID (Voter ID) | | IT | Italy | Official Civil Register + Consumer Credit + Telco | **Name, Address, Date of Birth, Phone** | | IT | Italy | Credit Bureau | **Name, Address, Date of Birth, National ID (Codice fiscale)** | | IT | Italy | Credit Bureau, Residential | **Name, Address, Date of Birth, Phone** | | IT | Italy | Official Civil Register and Utility - Phone Register | **Name**, Address, Date of Birth, **Phone** | | IT | Italy | Population Register | **Name**, Address, Date of Birth, Phone | | IT | Italy | Utility - Phone Register | **Name**, Address, Gender, Phone | | IT | Italy | Consumer, Population Register & Telco | **Name**, Address, Date of Birth, Gender, Phone | | IT | Italy | Consumer | **Name**, Address, Date of Birth, Gender, Phone | | IT | Italy | Official Resident Register & Utility Register | **Name**, Address, Date of Birth, Gender | | IT | Italy | Credit Bureau | **Name**, **Address**, Gender, Phone, **National ID (Tax ID)** | | IT | Italy | Telco & MNO | **Name**, Address, Date of Birth, Gender, **Phone** | | JE | Jersey Islands | Utility - Phone Register | **Name**, Address, Gender, Phone | | KE | Kenya | National ID | **Name, Date of Birth, National ID (NIN)** | | KE | Kenya | Official Voter Register | **Name**, Address, Gender, National ID (Voter ID) | | KE | Kenya | Official National ID | **Name**, **Date of Birth**, Gender, **National ID** | | KG | Kyrgyzstan | Official Voter Register | **Name, Address, National ID (Voter ID)** | | KG | Kyrgyzstan | Official Voter Register | **Name**, Address, Gender, National ID (Voter ID) | | LV | Latvia | Official Voter Register | **Name, Address, Gender, National ID (Voter ID)** | | LY | Libya | Official Voter Register | **Name, Address, Gender, National ID (Voter ID)** | | LI | Liechtenstein | Utility - Phone Register | **Name**, Address, Phone | | LT | Lithuania | Official Voter Register | **Name, Address, Gender, National ID (Voter ID)** | | LT | Lithuania | Official Voter Register | **Name**, Address, Phone, National ID (Voter ID) | | LU | Luxembourg | Utility - Phone Register | **Name**, Address, Gender, Phone | | LU | Luxembourg | Consumer, Population Register & Telco | **Name**, Address, Date of Birth, Gender, Phone | | MY | Malaysia | National ID | **Name, Address, Date of Birth, Phone, National ID (NRIC)** | | MY | Malaysia | Credit Bureau | **Name, Address, Date of Birth, National ID (NRIC)** | | MY | Malaysia | Credit Bureau | **Name**, Address, **Date of Birth**, Gender, **National ID** | | MY | Malaysia | Official Resident Register | **Name**, Address, **Date of Birth**, Gender, **National ID** | | MY | Malaysia | Mobile Phone Register | **Name**, Address, Date of Birth, Gender, Phone, National ID (Identity card) | | MY | Malaysia | Official Voter Register | **Name**, **Address**, Date of Birth, Gender, National ID (Identity card) | | MY | Malaysia | Credit Bureau | **Name**, Date of Birth, Gender, **National ID** | | MT | Malta | Official Voter Register | **Name, Address, Gender, National ID (Voter ID)** | | MT | Malta | Utility - Phone Register | **Name**, Address, Gender, Phone | | MT | Malta | Official Voter Register | **Name**, Address, Gender, National ID (Voter ID) | | MQ | Martinique | Utility - Phone Register | **Name**, Address, Gender, Phone | | MX | Mexico | Official Civil Register | **Name, Date of Birth, National ID (CURP)** | | MX | Mexico | Official Civil Register | **Name, Date of Birth, National ID (RFC)** | | MX | Mexico | RENAPO | **Name, Date of Birth, National ID (CURP)** | | MX | Mexico | INE (Instituto Nacional Electoral) | **Name, Date of Birth, National ID (CURP)** | | MX | Mexico | Telco | **Name, Address, Phone** | | MX | Mexico | National Population Registry | **Name**, **Address**, **Date of Birth**, Gender, **National ID (CURP / Voter ID)** | | MD | Moldova | Official Voter Register | **Name**, Address, Gender | | MA | Morocco | Telco | **Name, Address, Phone** | | MA | Morocco | Mobile Phone Register | **Name**, **Address**, Date of Birth, Phone | | NA | Namibia | Official Voter Register | **Name, Address, Date of Birth, Gender, National ID (Voter ID / Tax ID)** | | NP | Nepal | Official Voter Register | **Name, Address, Gender, National ID (Voter ID)** | | NP | Nepal | Official Voter Register | **Name**, Address, Gender, National ID (Voter ID) | | NL | Netherlands | Official Civil Register + Consumer Credit + Telco | **Name, Address, Date of Birth, Gender, Phone** | | NL | Netherlands | Residential | **Name, Address, Date of Birth, Phone, Email** | | NL | Netherlands | Utility - Phone Register | **Name**, Address, Gender, Phone | | NL | Netherlands | Consumer, Population Register & Telco | **Name**, Address, Date of Birth, Gender, Phone | | NL | Netherlands | Population Register | **Name**, **Address**, Date of Birth, Gender, Phone | | NL | Netherlands | Telco & MNO | **Name**, Address, Date of Birth, Gender, **Phone** | | NZ | New Zealand | Credit Bureau | **Name, Address, Date of Birth, Gender** | | NZ | New Zealand | Consumer, Population Register & Telco | **Name, Address, Date of Birth, Phone** | | NZ | New Zealand | Residential, Consumer, Companies Office | **Name, Address, Date of Birth** | | NZ | New Zealand | Credit Bureau | **Name, Address, Date of Birth** | | NZ | New Zealand | DIA Birth Certificate | **Name, Date of Birth** | | NZ | New Zealand | DIA Passport | **Name, Date of Birth, National ID (Passport)** | | NZ | New Zealand | NZTA verification service | **Name, Date of Birth, National ID (Drivers license)** | | NZ | New Zealand | New Zealand Birth, Deaths, Marriages Register | **Name, Address** | | NZ | New Zealand | Official Resident Register | **Name**, Address, Phone | | NZ | New Zealand | Official Resident Register | **Name**, **Address**, Date of Birth, Gender, Phone | | NZ | New Zealand | Official DIA Citizenship Register | **Name, Date of Birth** | | NZ | New Zealand | Official National ID - DIA Passport | **Name, Date of Birth, National ID (Passport)** | | NZ | New Zealand | Official NZTA Drivers License | **Name, Date of Birth, National ID (Drivers license)** | | NZ | New Zealand | Consumer | **Name**, Address, Date of Birth, Gender, Phone | | NZ | New Zealand | NZTA and DIA | **Name**, Address, **Date of Birth**, **National ID (Drivers license / Passport)** | | NG | Nigeria | National ID | **Name, Date of Birth, National ID (NIN)** | | NG | Nigeria | Nigerian Banking Industry database | **Name, Date of Birth, National ID (BVN)** | | NG | Nigeria | National ID Register | **Name, Address, Date of Birth, Phone, National ID** | | NG | Nigeria | Driver's License Register | **Name, Date of Birth, National ID (Drivers license)** | | NO | Norway | Residential, Consumer | **Name, Address, Date of Birth, National ID (NIN)** | | NO | Norway | Utility - Phone Register | **Name**, Address, Gender, Phone | | NO | Norway | Mobile Phone Register | **Name**, **Address**, Gender, Phone | | NO | Norway | Consumer & Population Register | **Name**, Address, Date of Birth, Gender, Phone | | NO | Norway | Consumer, Population Register & Telco | **Name**, Address, Date of Birth, Gender, Phone | | NO | Norway | Official Postal Register & Utility - Phone Register | **Name**, Address, Date of Birth, Gender, Phone | | PS | Palestine | Official Voter Register | **Name**, Address, Gender | | PA | Panama | Official Civil Register | **Name**, Date of Birth, **National ID (Cédula de Ciudadanía)** | | PE | Peru | Tax Registration (SUNAT), National ID | **Name, Date of Birth, National ID (DNI)** | | PE | Peru | Residential | **Name, Address, Phone** | | PE | Peru | Official Voter Register | **Name**, **Address**, Date of Birth, National ID (DNI) | | PE | Peru | Official Civil Register | **Name**, Address, Date of Birth, **National ID (DNI)** | | PE | Peru | Official Civil Register | **Name**, Date of Birth, Gender, National ID (DNI) | | PE | Peru | Official Tax Register | **Name**, Gender, **National ID (Tax ID)** | | PH | Philippines | Official Voter Register | **Name**, Address, **Date of Birth**, Gender | | PH | Philippines | Credit Bureau and Official National ID | **Name**, Address, **Date of Birth**, Gender, National ID | | PH | Philippines | Official Resident Register | **Name**, Address, **Date of Birth** | | PH | Philippines | Residential, Credit Bureau | **Name, Address, Date of Birth, National ID (SSN, TIN or GSIS)** | | PL | Poland | Official Voter Register | **Name, Address, Gender, National ID (Voter ID)** | | PL | Poland | Credit Bureau, Consumer | **Name, Address, Date of Birth, Phone, Email** | | PL | Poland | Utility - Phone Register | **Name**, Address, Phone | | PL | Poland | Consumer | **Name**, Address, Date of Birth, Gender, Phone | | PL | Poland | Credit Bureau | **Name**, **Address**, Date of Birth, Phone | | PL | Poland | Credit Bureau | **Name**, **Address**, Date of Birth, Gender | | PT | Portugal | Residential | **Name, Address, Date of Birth** | | PT | Portugal | Utility - Phone Register | **Name**, Address, Phone | | PT | Portugal | Official Voter Register | **Name**, Address, Gender | | PT | Portugal | Consumer, Population Register & Telco | **Name**, Address, Date of Birth, Gender, Phone | | PT | Portugal | Official Civil Register + Consumer Credit + Telco | **Name**, Address, Date of Birth, Gender, **Phone** | | PT | Portugal | Consumer | **Name**, **Address**, Date of Birth, Gender, Phone | | PR | Puerto Rico | Population Register | **Name**, Address, Date of Birth, Gender, Phone | | RE | Réunion | Utility - Phone Register | **Name**, Address, Phone | | RO | Romania | Official National ID | **Name**, **Address**, Date of Birth, Gender, Phone | | RU | Russia | Official Resident Register | **Name, Address, Date of Birth, Gender, Phone, National ID (Tax ID)** | | RU | Russia | Official Department of Motor Vehicle | **Name, Address, Date of Birth, National ID (Drivers license)** | | RU | Russia | Consumer | **Name**, **Address**, Date of Birth, Phone | | WS | Samoa | Utility - Phone Register | **Name**, Address, Gender, Phone | | SG | Singapore | Utility, Credit Bureau | **Name, Address, Date of Birth, Phone, National ID (NRIC)** | | SG | Singapore | Utility - Phone Register | **Name**, **Address**, Date of Birth, Phone | | SG | Singapore | Official Resident Register | **Name**, **Address**, Date of Birth, Gender | | SG | Singapore | Credit Bureau | **Name, Address, Date of Birth, National ID** | | SG | Singapore | Credit Bureau | **Name**, Address, **Date of Birth**, Gender, **National ID** | | SK | Slovakia | Residential | **Name, Address, Date of Birth** | | SK | Slovakia | Official Resident Register | **Name, Address** | | SK | Slovakia | Official Civil Register and Credit Bureau | **Name**, **Address**, Date of Birth, Phone | | SI | Slovenia | Utility - Phone Register | **Name**, Address, Phone | | SO | Somalia | Official Voter Register | **Name, Address, National ID (Voter ID)** | | ZA | South Africa | National ID | **Name, Date of Birth, National ID (ID number)** | | KR | South Korea | National ID | **Name, Date of Birth, National ID (ID number)** | | ES | Spain | Residential, Utility | **Name, Address, Date of Birth, Phone** | | ES | Spain | National ID | **Name, Address, Date of Birth** | | ES | Spain | Official Census and Utility Services - Telephone Register | **Name, Address, Date of Birth, Phone, National ID** | | ES | Spain | Utility - Phone Register | Name, Address, Gender, Phone | | ES | Spain | Consumer | **Name**, Address, Date of Birth, Gender, Phone | | ES | Spain | Official Civil Register + Consumer Credit + Telco | **Name**, Address, Date of Birth, **Gender**, **Phone** | | ES | Spain | Consumer, Population Register & Telco | **Name,** Address, Date of Birth, Gender, Phone | | ES | Spain | Telco & MNO | **Name**, Address, Date of Birth, **Gender**, **Phone** | | SD | Sudan | Official Voter Register | **Name, Address, National ID (Voter ID)** | | SD | Sudan | Official Voter Register | **Name**, Address, Gender, **National ID (Voter ID)** | | SE | Sweden | National ID, Phone | **Name, Address, Date of Birth, Phone, National ID (PIN)** | | SE | Sweden | Official Civil Register | **Name, Address, Date of Birth, Gender, Phone, National ID** | | SE | Sweden | Utility - Phone Register | **Name**, Address, Gender, Phone | | SE | Sweden | Consumer & Population Register | **Name**, Address, Date of Birth, Gender, Phone | | SE | Sweden | Consumer, Population Register & Telco | **Name**, Address, Date of Birth, Gender, Phone | | SE | Sweden | Official Tax Register | **Name**, **Address**, Date of Birth, Gender | | CH | Switzerland | Credit Bureau, Consumer | **Name, Address, Date of Birth, Phone, Email** | | CH | Switzerland | Utility - Phone Register | **Name, Address** | | CH | Switzerland | Credit and Official Postal Register | **Name**, Address, Date of Birth, Gender, Phone | | CH | Switzerland | Credit Bureau | **Name**, Address, **Date of Birth**, Gender, Phone | | CH | Switzerland | Telco & MNO | **Name**, Address, Gender, **Phone** | | SY | Syria | Official Voter Register | **Name**, Address, Gender | | TW | Taiwan | Ministry of Interior | **Name, Government ID (ID + Issue Date)** | | TJ | Tajikistan | Official Voter Register | **Name, Address, National ID (Voter ID)** | | TJ | Tajikistan | Official Voter Register | **Name**, Address, Gender, National ID (Voter ID) | | TH | Thailand | National ID | **Name, Address, Date of Birth, National ID** | | TH | Thailand | Consumer | **Name**, Address, Date of Birth, Gender, Phone | | TH | Thailand | Official Civil Register | **Name**, Address, **Date of Birth**, Gender, **National ID** | | TT | Trinidad and Tobago | Official Voter Register | **Name**, Address, Gender | | TR | Turkey | Official Voter Register | **Name, Address, Date of Birth, Gender, Phone, National ID (Voter ID)** | | TR | Turkey | Official Voter Register | **Name**, Address, Date of Birth, Gender, National ID (Voter ID) | | TR | Turkey | Official Resident Register | **Name**, Address, Date of Birth, Gender, National ID (Voter ID) | | TR | Turkey | Official Voter Register | **Name**, **Address**, Date of Birth, Gender, Phone, National ID (Voter ID) | | TR | Turkey | Consumer & Electoral Register | **Name**, Address, Date of Birth, Gender, Phone | | TR | Turkey | Official Voter Register and Consumer Credit | **Name**, Address, Date of Birth, Gender, National ID | | UG | Uganda | Official Voter Register | **Name, Address, Gender, National ID (Voter ID)** | | UA | Ukraine | Official Voter Register | **Name, Address, Date of Birth** | | UA | Ukraine | Official Resident Register | **Name, Address, Date of Birth, Gender, Phone, National ID (Tax ID)** | | UA | Ukraine | Official Voter Register | **Name, Address, Date of Birth, Gender, Phone** | | AE | United Arab Emirates | Utility - Phone Register | **Name**, Address, **Date of Birth**, Phone | | GB | United Kingdom | Official Civil and Voter Register and Credit | **Name, Address, Date of Birth** | | GB | United Kingdom | Official Voter Register | **Name**, Address, Gender | | GB | United Kingdom | Utility - Phone Register | **Name, Address, Phone** | | GB | United Kingdom | Official Voter Register | **Name, Address, Date of Birth, Gender, Phone** | | GB | United Kingdom | Consumer, Population Register & Telco | **Name**, Address, Date of Birth, Gender, Phone | | GB | United Kingdom | Official Census | Name, Address, Date of Birth, Gender | | GB | United Kingdom | Residential, Citizens, Credit Bureau | **Name, Address, Date of Birth, Phone** | | GB | United Kingdom | Official Resident Register | **Name, Address, Gender, Phone** | | GB | United Kingdom | Telco & MNO | **Name, Address, Date of Birth, Gender, Phone** | | GB | United Kingdom | Credit Bureau | **Name, Address, Date of Birth, Gender** | | US | United States | Telco | **Name**, Address, **Phone**, Date of Birth | | US | United States | Telco | **Name**, Address, **Phone**, Date of Birth, National ID (Last 4 SSN, DL State, DL Number), Email | | US | United States | Credit Bureau | **Name**, **Address**, Date of Birth, Phone, **National ID (Full SSN)**, Email | | US | United States | Credit + US Identity Graph | **Name**, Address, Date of Birth, Gender, Phone, National ID | | US | United States | Official Civil Register and Consumer Credit | **Name**, **Address**, Date of Birth, Phone | | US | United States | Official Social Security | **Name**, **Address**, Date of Birth, Phone, National ID (SSN) | | UY | Uruguay | Official Civil Register | **Name, Address, Date of Birth, National ID (Cédula de identidad)** | | UZ | Uzbekistan | Official Department of Motor Vehicle | **Name, Gender, National ID (Drivers License)** | | VE | Venezuela | Official Voter Register | **Name, Date of Birth, National ID** | | VE | Venezuela | Official Civil Register | **Name, Gender, National ID** | | VE | Venezuela | Official Census | **Name, Address, Date of Birth, Gender, National ID** | | VN | Vietnam | Official Resident Register | **Name, Address, Date of Birth, Gender** | | VN | Vietnam | Official Resident Register | **Name, Address, Date of Birth, Gender** | | YE | Yemen | Mobile Phone Register | **Name, Address, Gender, Phone** | | ZW | Zimbabwe | Official Voter Register | **Name, Address, Date of Birth, National ID (Voter ID)** | If you don't see the country or data source you need, or want more details about our coverage, contact your Incode representative to learn more about our expanding network. --- - Path: `general-reference/ekyc-reason-codes` - URL: https://developer.incode.com/general-reference/ekyc-reason-codes/ - Markdown: https://developer.incode.com/general-reference/ekyc-reason-codes.md # eKYC Reason Codes Electronic Know Your Customer (eKYC) reason codes provide additional context for match results and risk assessments returned by the eKYC API. Reason codes indicate why a specific risk level was returned, or add nuance to a match result. For example, a reason code may indicate that an address matched but is a PO Box, or that a phone number is associated with a high-risk carrier. Reason codes are returned in the `reasonCodes` array on the relevant response field (`overallLevel`, `taxIdLevel`, `phoneLevel`, `addressRiskLevel`, `emailLevel`, `emailDomainLevel`). For examples of how reason codes appear in API responses, see the sample responses on the country pages under [eKYC Coverage](/general-reference/ekyc-coverage/). For the response field concepts, see [eKYC API Reference](/general-reference/ekyc-api-reference/). The tables below list all reason codes by category (Phone, Email, Tax ID, Address), including their status. **Live** codes are actively returned by the API. **Deprecated** codes are no longer returned but may still appear in historical data. **New** codes were added in the most recent update (December 2025). ## Phone Reason Codes | Reason Code | Description | Status | | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | | P2OSOV | Two identities have OS or OV reason codes. | New: Added December 2025 | | P3OSOV | Three identities have OS or OV reason codes. | New: Added December 2025 | | P4OSOV | Four identities have OS or OV reason codes. | New: Added December 2025 | | P5OSOV | Five or more identities have OS or OV reason codes. | New: Added December 2025 | | PA15 | There was activity on this number in the last 15 days. | Deprecated | | PA24 | There was activity on this number in the last 24 hours. | Deprecated | | PA2M | There was activity on this number in the last two months. | Deprecated | | PA3M | There was activity on this number in the last three months. | Deprecated | | PABA | The address provided in the request is a business address. | Live | | PABM | The address provided resulted in a better match than the normalized address. | Live | | PACF | The address provided in the request matches the address of a U.S. correctional facility. | Live | | PADU | The address provided in the request is a dual address: for example, 123 Main St PO Box 99. | Live | | PAE | Some empty address fields were completed through address normalization for the address match check. | Live | | PAHR | The address provided in the request is for a building that contains sub-units, such as apartments. | Live | | PAIN | The address provided in the request is inactive. For example, new developments may have addresses but are inactive until someone moves in; or, after a natural disaster, addresses in the affected area are marked as inactive for a time. | Live | | PALT | The address provided is in low tenure. | Live | | PAM | There was activity on this number in the last month. | Deprecated | | PAMA | The address provided in the request is tied to multiple active addresses. The address may be missing a suite or apartment number. | Live | | PAML | The address provided in the request is a military address. | Live | | PANN | There is no name and address information associated with the phone number provided. | Live | | PANV | The address provided could not be verified. | Live | | PAPM | The address provided is associated with a Private Mailbox operator: for example, a UPS store. | Live | | PAPO | The address provided is a PO Box. | Live | | PAUD | The address provided in the request is an undeliverable address. | Live | | PAV | The address provided is vacant—unoccupied in the past 90 days. | Live | | PAVN | The address provided in the request is valid and has been normalized prior to calculating the match score. | Live | | PAW | There was activity on this number in the last seven days. | Deprecated | | PBL | The number is associated with a business line. | New: Added December 2025 | | PBOT | The behavior pattern that suggests this number is being used by a bot. | Deprecated | | PCA | There are common addresses appearing across multiple seemingly unrelated identities associated with the phone number. This can indicate a higher risk of fraudulent activity. | New: Added December 2025 | | PCC | The behavior pattern that suggests this number is being used by a call center. | Deprecated | | PCSV90 | Continuous successful regular volume of verification traffic on this number over the past 90 days. | New: Added December 2025 | | PCU | The carrier call was unsuccessful. | New: Added December 2025 | | PCV90 | Continuous successful regular volume of verification traffic from a range this number belongs to over the past 90 days. | New: Added December 2025 | | PD1 | The phone number was found to be a web-scraped number showing as active. | New: Added December 2025 | | PD2 | The phone number was recently deactivated. | New: Added December 2025 | | PDI | The phone record data has a death indicator; the person associated with this record has been identified as deceased. | Live | | PDL | No driver's license data is available to match to the submitted driver's license parameters. | Live | | PDLA | No driver's license data is available to match to the submitted driver's license parameters. | Deprecated | | PDR | The device date returned was not obtained in real-time; there may be a more recent device change. | New: Added December 2025 | | PDS | T-Mobile customers only: the mobile number has been identified as Do Not Sell by the carrier, and live data was not used for the Trust Score. | New: Added December 2025 | | PDV | High device change velocity is associated with the phone. | New: Added December 2025 | | PE24 | Expected activity for this number over the last 24 hours. | Live | | PE90 | Expected activity for this number over the past 90 days. | Live | | PECD | Expected call duration for this number over the past 90 days. | Deprecated | | PELT | Expected activity on this number over a tenure greater than or equal to 90 days (long-term). | Deprecated | | PES | Expected success for this number over the past 90 days. | Deprecated | | PES90 | Extremely significant activity for a risky range that this number belongs to over the past 90 days. | Deprecated | | PFF | Call forwarding was not enabled on the phone. | New: Added December 2025 | | PFIS | Few incoming calls were successful for this number. | Deprecated | | PFN | A family name was found and used in the name matching calculation. | Live | | PFO | Call forwarding was enabled on the phone. | New: Added December 2025 | | PFOI | Few outgoing calls were successful and very few incoming calls were successful for this number. | Deprecated | | PFOS | Few outgoing calls were successful for this number. | Deprecated | | PFRD | This number has been flagged as a source of fraud. The score always recommends blocking this number. | Live | | PFXL | This is a fixed line number. | New: Added December 2025 | | PH90 | Higher than expected activity on this number within one or more 24-hour periods within the last 90 days. Spikes within one hour are also considered. | Deprecated | | PHAI | Activity towards this number is coming from a higher-than-expected quantity of unique phone numbers. | Deprecated | | PHAO | Activity from this number is going to a higher-than-expected quantity of unique phone numbers. | Deprecated | | PHLT | Higher than expected activity on this number over a tenure greater than or equal to 90 days (long-term). | Deprecated | | PHRL | The provided phone number is associated with a high-risk line type (Non-Fixed VoIP or Prepaid MVNO)—available for most carriers with consent. | Live | | PHSLT | Higher than expected activity on this number within one or more 24-hour periods within the tenure (either short or long-term). Spikes within one hour are also considered. | Deprecated | | PHV | High velocity of change events associated with the phone. | New: Added December 2025 | | PILE | The number of identities associated with the phone number has exceeded the phone data provider's suggested limit. This can indicate a higher risk of fraudulent activity. | Live | | PINV | The number is invalid. | Live | | PKA | Ownership tenure is between eight and 14 days. | New: Added December 2025 | | PKB | Ownership tenure is between 15 and 21 days. | New: Added December 2025 | | PKC | Ownership tenure is between 22 and 30 days. | New: Added December 2025 | | PKD | Ownership tenure is between 31 and 45 days. | New: Added December 2025 | | PKE | Ownership tenure is between 46 and 60 days. | New: Added December 2025 | | PKF | Ownership tenure is between 61 and 90 days. | New: Added December 2025 | | PKG | Ownership tenure is between 91 and 120 days. | New: Added December 2025 | | PKH | Ownership tenure is between 121 and 150 days. | New: Added December 2025 | | PKI | Ownership tenure is between 151 and 180 days. | New: Added December 2025 | | PKJ | Ownership tenure is between 181 and 365 days. | New: Added December 2025 | | PKK | Ownership tenure is between 366 and 730 days. | New: Added December 2025 | | PKL | Ownership tenure is between 731 and 1095 days. | New: Added December 2025 | | PKM | Ownership tenure is between 1096 and 1460 days. | New: Added December 2025 | | PKN | Ownership tenure is between 1461 and 1825 days. | New: Added December 2025 | | PKO | Ownership tenure is greater than 1826 days. | New: Added December 2025 | | PLEA | Much less than expected activity or none at all for this number over the past 90 days. Cannot classify. | Live | | PLLT | Lower than expected activity on this number over a tenure greater than or equal to one week (long-term). | Deprecated | | PLP | Device Change \< 90 days OR SIM Change \< 90 days OR Mobile Number Change \< 90 days | New: Added December 2025 | | PLS | Device Change \< 90 days OR SIM Change \< 90 days | Live | | PLST | Lower than expected activity on this number over a tenure less than one week (short-term). Cannot classify. | Deprecated | | PLT | Device Change \< 90 days old | New: Added December 2025 | | PMA24 | More than expected activity for this number over the last 24 hours. | Live | | PMA90 | More than expected activity for this number over the past 90 days. | Live | | PMAE | More activity than expected is going from this number towards unassigned phone numbers. Both the volume of activity and the quantity of unique unassigned numbers are considered. | Deprecated | | PMAIC | More activity than expected is coming to this number from numbers of risky countries. Both the risk level of the country and the amount of traffic between the number and that country are considered. | Deprecated | | PMAOC | More activity than expected is going from this number towards numbers of risky countries. Both the risk level of the country and the amount of traffic between the number and that country are considered. | Deprecated | | PMAOP | More activity than expected is going from this number towards premium numbers. Both the quantity of premium numbers and the amount of traffic to those numbers are considered. | Deprecated | | PMAOT | More activity than expected is coming from this number towards toll-free numbers. Both the quantity of toll-free numbers and the amount of traffic from those numbers are considered. | Deprecated | | PML | The phone number provided has been matched with the identity information—such as name and address—for more than 90 days (long tenure). | Live | | PMNA | The provided mobile phone number is not active. This is available for most carriers with consent. | Live | | PMO | The phone number provided has been matched with the identity information—such as name and address—and the ownership or association to this phone number was not recent; however, there is no known, newer ownership or association found. The ownership is considered older. | Live | | PMS | More success than expected for this number over the past 90 days. Impact depends on activity level. For higher-than-expected activity, this is a risk signal. For expected or lower-than-expected activity this is a trust signal. | Deprecated | | PMST | The phone number provided has been matched with the identity information—such as name and address—for between eight and 90 days (short tenure). | Live | | PMU | The phone number provided has been matched with the identity information—such as name and address—for an unknown amount of time (unknown tenure). | Live | | PMVS | The phone number provided has been matched with the identity information—such as name and address—for less than seven days (very short tenure). | Live | | PN3M | No activity on this number in the last three months. | Deprecated | | PNC | The first and last name provided in the request are combined in one field. | Live | | PNMB | The phone number provided is not a mobile line type. | Live | | PNN | A nickname was found and used in the name matching calculation: for example, Bill matches with William. | Live | | PNNS | There is no network status information associated with the phone number provided. | Live | | PNO | The phone number provided has been matched with the identity information—such as name and address—and a newer ownership or association has recently been connected to the phone number. | Live | | PNPB | The phone number provided is a non-personal business line. | Live | | PNRR | This number was recently reported as removed from distribution. Finding activity from it is unexpected for a legitimate user. The service takes into account the number of reports of removal before making this determination. | Deprecated | | PNS | The first and last name provided were swapped compared to the phone number records. | Live | | PNU | The phone number provided has been updated. | Live | | POD | The ownership match for the provided phone number was found prior to a disconnect date. | Live | | PPC3 | The postal code provided matches the first three digits of the address on record for this phone number. | Live | | PPC5 | The postal code provided matches the first five digits of the address on record for this phone number. | Live | | PPC6 | The postal code provided matches the first six digits of the address on record for this phone number. This applies to Canadian phone numbers only. | Live | | PPC9 | The postal code provided matches the first nine digits of the address on record for this phone number. | Live | | PPER | Phone type is personal. | New: Added December 2025 | | PPGR | This number is associated with a pager. | Live | | PPN | This is a premium number. | Live | | PPPH | This number is associated with a payphone. | Live | | PPRE | This is a prepaid number. | New: Added December 2025 | | PPRT | The provided phone number is currently in a ported state. | Live | | PPV | A successful person search verification was run for the provided phone number. | Live | | PRC | This number is associated with a risky carrier. | Live | | PRCO | The country code of this number is for a risky country: a country that originates a disproportionate share of fraud attacks. | Live | | PRM | The provided phone number identity matching was only based on raw user data. | Live | | PRN | The phone number is at lower risk for fraud because it is listed as a mobile line on the Override Services Registry (OSR). | New: Added December 2025 | | PROM | Telecom companies use this number for special technical purposes, such as roaming. | Live | | PRP | This number has a risky prefix. | Live | | PRR | The phone number is at higher risk for fraud because it is listed as a non-mobile line on the Override Services Registry (OSR). | New: Added December 2025 | | PRSA | This number has risky static attributes, such as VoIP phone type or being on a blocklist. | Live | | PRSK | This number has another phone type that is risky and not covered by any of the other number\_type reason codes. | Live | | PRSV | TeleSign or BICS reserved this number for their apps' customers to use: for example, to send verification messages; however, it appears that it is being used for a different purpose. | Live | | PSA | The phone number is classified as a sub-account line. | New: Added December 2025 | | PSCD | Call duration for this number has been shorter or longer than expected over the past 90 days. | Deprecated | | PSDBM | The matched identity has an SSN issued prior to either the submitted date of birth or the selected identity's date of birth (if no date of birth was submitted). This can indicate a higher risk of counterfeit identity. | Live | | PSFE | You have flagged this number as safe. The score always recommends allowing this number. | Live | | PSG24 | Significant activity for a risky range that this number belongs to over the last 24 hours. | Live | | PSG90 | Significant activity for a risky range that this number belongs to over the past 90 days. | Live | | PSM90 | Some activity for a risky range that this number belongs to over the past 90 days. | Live | | PSMDB | The matched identity has multiple date of birth records. This can indicate a higher risk of counterfeit identity. | Live | | PSMRN | The matched identity has a high number of relatives with the same or similar name. This can indicate a higher risk of counterfeit identity. | Live | | PSMSN | The matched identity has multiple unique SSNs. This can indicate a higher risk of counterfeit identity. | Live | | PSR | The SIM date returned was not obtained in real time; there may be a more recent SIM change. | New: Added December 2025 | | PSTF | Significant activity on this number to or from risky services over the past 90 days. | Live | | PTFN | This is a toll-free number. | Live | | PTL | This number is invalid because it is too long, even after the application of cleansing rules. | Live | | PTO | The phone record data retrieval timed out. | Live | | PUC | There was insufficient data to calculate the risk score. | New: Added December 2025 | | PUSV90 | Significant volume of unsuccessfully verified traffic from a range this number belongs to over the past 90 days. | New: Added December 2025 | | PUV90 | Significant volume of unsuccessfully verified traffic from this number over the past 90 days. | New: Added December 2025 | | PVLA | Very little activity, or none at all, for a risky range that this number belongs to over the past 90 days. Also returned if the number does not belong to a risky range. | Live | | PVLS | Much less success than expected or no success at all for this number over the past 90 days. | Deprecated | | PVMN | This is a voicemail number. | Live | | PVOIP | This is a VoIP number. | Live | | PVRC | This number is associated with a very risky carrier. | Live | | PVS24 | Very significant activity for a risky range that this number belongs to over the last 24 hours. | Live | | PVS90 | Very significant activity for a risky range that this number belongs to over the past 90 days. | Live | | PVST | Very little activity, or none at all, was ever observed on this number. Very short tenure. Cannot classify. | Deprecated | | PVSTF | Very significant activity on this number to or from risky services over the past 90 days. | Live | | TNSA | This number was seen in phone risk scoring traffic in the last month. | Live | | TPSMT | This phone was seen multiple times in last 90 days with different last names. | Live | | TSBF | Sparse regular volume of phone risk scoring traffic on this number over the past 90 days. | Live | | TSBG | Continuous, regular volume of verification traffic on this number over the past 90 days. | New: Added December 2025 | | TSBH | Very high volume of phone risk scoring traffic on this number over the past 90 days. | Live | | TSBI | Very high volume of phone risk scoring traffic on this number over the past 24 hours. | Live | | TSBJ | Very low volume of verification traffic, or none at all, was ever observed on this number. | New: Added December 2025 | | TSBK | Low volume of verification traffic on this phone number over the past 90 days. | New: Added December 2025 | | TSBN | Low volume of phone risk scoring traffic on this phone number over the past 24 hours. Very low volume of phone risk scoring traffic, or none at all, over the past 90 days. | Live | | TSBO | Less than expected activity for this number. | Live | | TSCG | Extremely significant activity for a risky range that this number belongs to over the past 90 days. | Live | | TSCH | Extremely significant activity for a risky range that this number belongs to over the last 24 hours. | Live | | TSDC | The behavior pattern that suggests this number is being used by a bot. | Live | | TSDD | Verification traffic on risky services on this number over the past 90 days. | New: Added December 2025 | | TSDE | Phone risk scoring traffic on risky services on this number over the past 24 hours. | Live | | TSDF | High volume of phone risk scoring traffic on risky services on this number over the past 90 days. | Live | | TSDG | High volume of verification traffic on risky services on this number over the past 24 hours. | New: Added December 2025 | | TSDH | Verification traffic on risky services on the range this number belongs to over the past 90 days. | New: Added December 2025 | | TSDI | Verification traffic on risky services on the range this number belongs to over the past 24 hours. | New: Added December 2025 | | TSDJ | High volume of verification traffic on risky services on the range this number belongs to over the past 90 days. | New: Added December 2025 | | TSDK | High volume of phone risk scoring traffic on risky services on the range this number belongs to over the past 24 hours. | Live | | TSDL | Very high volume of phone risk scoring traffic on risky services on this number over the past 90 days. | Live | | TSDM | Very high volume of phone risk scoring traffic on risky services on this number over the past 24 hours. | Live | | TSDN | Very high volume of phone risk scoring traffic on risky services on the range this number belongs to over the past 90 days. | Live | | TSDO | Very high volume of phone risk scoring traffic on risky services on the range this number belongs to over the past 24 hours. | Live | | TSDP | Extremely high volume of phone risk scoring traffic in a very short period (less than one hour) on the range this number belongs to. | Live | | TSKU | This number is too short to be a valid phone number. | Live | | TSMA | This number was seen in phone risk scoring traffic in the last day. | Live | | TSMB | This number was seen in phone risk scoring traffic in the last seven days. | Live | | TSMC | This number was seen in phone risk scoring traffic in the last 15 days. | Live | | TSNB | This number was seen in phone risk scoring traffic in the last two months. | Live | | TSNC | This number was seen in phone risk scoring traffic in the last three months. | Live | | TSOA | This number was not seen in phone risk scoring traffic in the last three months. | Live | | TXHR | This number is in a high-risk category based on past behavior. | Live | | TXMTW | This number is in the most trustworthy category based on past behavior. | Live | | TXNA | There is not enough activity or attributes to classify the transaction as either risky or trustworthy. | Live | | TXR | This number is in a risky category based on past behavior. | Live | | TXTW | This number is in a trustworthy category based on past behavior. | Live | | TXVHR | This number is in the highest-risk category based on past behavior. | Live | ## Email Reason Codes | Reason Code | Description | Status | | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | | EA1Y | The email address was first seen at least a year ago. | Live | | EA2Y | The email address was created within the last two years. | Live | | EA4M | The email address was created within the last four months. | Live | | EA4Y | The email address was created more than four years ago. | Live | | EA6M | The email address was created within the last six months. | Live | | EAC1F | The email address was confirmed as suspected fraud once across the email data provider's customer network. | Live | | EACMF | The email address was confirmed as suspected fraud multiple times across the email data provider's customer network. | Live | | EADP | Disposable email domain. | Live | | EAF1 | The email address was confirmed as fraudulent to the email data provider by one of their customers. | Live | | EAF2 | The email address was confirmed as fraudulent to the email data provider by two of their customers. | Live | | EAF3 | The email address was confirmed as fraudulent to the email data provider by three or more of their customers. | Live | | EAF4Y | The email address was first seen at least four years ago. | Live | | EAFC | The email address was confirmed as fraudulent by you or by the email data provider. | Live | | EAG1 | The email address was confirmed as good to the email data provider by one of their customers. | Live | | EAG2 | The email address was confirmed as good to the email data provider by two of their customers. | Live | | EAG3 | The email address was confirmed as good to the email data provider by three of their customers. | Live | | EAG4 | The email address was confirmed as good to the email data provider by four of their customers. | Live | | EAG5 | The email address was confirmed as good to the email data provider by five of their customers. | Live | | EAG6 | The email address was confirmed as good to the email data provider by six or more of their customers. | Live | | EAHF | The email address has high probability of being associated to fraud due to multiple risk factors based on the email data provider's proprietary algorithm: for example, validity, age, and fraud history. | Live | | EALLI | The email address is linked to a low-risk LinkedIn account, based on the account's number of connections and posting activity. | Live | | EALSM | The email address is linked to a low-risk social media account (for example, Facebook, Yahoo, or Pandora), based on the account's number of connections and posting activity. | Live | | EALTW | The email address is linked to a low-risk Twitter account, based on the account's number of connections and posting activity. | Live | | EAM | The email address was created within the last month. | Live | | EAMC | Multiple email addresses with similar handle patterns were recently queried at the email data provider for the company the email owner is tied to. | Live | | EAMF | The email address mailbox is full: the owner has exceeded the allowed capacity of email service. | Live | | EAMI | Multiple email addresses with similar handle patterns were recently queried at the email data provider for the transaction industry it has been previously tied to: for example, banking/finance or gaming. | Live | | EAMP | The email address mailbox existed in the past and is no longer available. | Live | | EANA | The email address mailbox is no longer active. | Live | | EANE | The email address does not exist. | Live | | EANI | Not enough information was found for the provided email address to determine a risk assessment. | Deprecated | | EANP | No email address was provided for risk assessment. | Live | | EAPF | The email address syntax follows patterns that have been associated with fraud. | Live | | EAQ3 | The email address has been queried in a short amount of time to the email data provider by three of their customers. | Live | | EAQ4 | The email address has been queried in a short amount of time to the email data provider by four of their customers. | Live | | EAQM | The email address has been queried in a short amount of time to the email data provider by more than four of their customers. | Live | | EASI | The email address syntax is not valid. | Live | | EAVQ | Different variations of the email address that point to the same inbox were recently queried. | Live | | EAW | The email address was created within the last week. | Live | | EAY | The email address was created within the last year. | Live | | ED4M | The email domain was created within the last four months. | Live | | EDCH | The email domain is tied to a category type—such as banking and webmail—with high fraud rates. | Live | | EDCO | The email domain country is considered to be risky. | Live | | EDDN | The email domain does not exist in the email data provider's registry. This domain might still have valid DNS record. | Live | | EDHA | The email domain is considered to be high risk based on the email data provider's proprietary algorithm—for example, validity, age, or fraud history—for the company the email owner is tied to. | Live | | EDHC | The email domain is considered to be high risk based on the email data provider's proprietary algorithm—for example, validity, age, or fraud history—for the category type of the company the email is tied to. | Live | | EDHI | The email domain is considered to be high risk based on the email data provider's proprietary algorithm—for example, validity, age, or fraud history—for the transaction industry it has been previously tied to, such as banking, finance, or gaming. | Live | | EDHN | The email domain is considered to be high risk across the data provider's network based on their proprietary algorithm: for example, validity, age, or fraud history. | Live | | EDI | The email domain is invalid. | Live | | EDL | The email domain is considered to be low risk based on the email data provider's proprietary algorithm: for example, validity, age, or fraud history. | Live | | EDLC | The email domain is considered to be low risk based on the email data provider's proprietary algorithm for the category type of the company the email is tied to. | Live | | EDM | The email domain is considered to be medium risk based on the email data provider's proprietary algorithm: for example, validity, age, or fraud history. | Live | | EDNP | The email address handle contains numeric patterns. | Live | | EDPR | The email domain is considered to be risky based on the email data provider's proprietary algorithm: for example, validity, age, or fraud history. | Live | | EDVH | The email domain is considered to be very high risk based on the email data provider's proprietary algorithm: for example, validity, age, or fraud history. | Live | | EDVHC | The email domain is considered to be very high risk based on the email data provider's proprietary algorithm—for example, validity, age, or fraud history—for the company the email owner is tied to. | Live | | EDVHI | The email domain is considered to be very high risk based on the email data provider's proprietary algorithm—for example, validity, age, or fraud history—for the transaction industry it has been previously tied to, such as banking, finance, or gaming. | Live | | EE24 | Expected level of activity for this email address over the last 24-hours. | Live | | EE90 | Expected level of activity for this email address over the past 90 days. | Live | | EELH | The email address may have been created recently. Limited historical data was found. | New: Added December 2025 | | EEPEII | Error from email enrichment provider. This includes error due to invalid input. Some risk assessment features might be limited due to error. | Live | | EFRD | The email has been flagged as a source of fraud. | New: Added December 2025 | | EMA24 | More than expected activity for this email address over the last 24-hours. | Live | | EMA90 | More than expected activity for this email address over the past 90 days. | Live | | ESFE | The email has been flagged as safe. | New: Added December 2025 | | ESG24 | Significant activity for this email address to or from risky services over the last 24 hours. | Live | | ESG90 | Significant activity on this email address to or from risky services over the last 90 days. | Live | | EVS24 | Very significant activity for this email address to or from risky services over the last 24 hours. | Live | | EVS90 | Very significant activity on this email address to or from risky services over the last 90 days. | Live | | EVV24 | Very high volume of verification traffic on this email address over the past 24 hours. | New: Added December 2025 | | EVV90 | Very high volume of verification traffic on this email address over the past 90 days. | New: Added December 2025 | | TSLI | Very high volume of phone risk scoring traffic on this email address over the past 24 hours. | Deprecated | | TSLJ | Very high volume of phone risk scoring traffic on this email address over the past 90 days. | Deprecated | | TSLK | The behavior pattern suggests this email address is being used by a software program. | Live | | TSLN | This email address is invalid and could not have been used by a legitimate user. | Live | | TSLO | This email address may have originated from a service providing temporary email addresses. These temporary addresses can be used to conceal the identity of the user. | Live | ## Tax ID Reason Codes | Reason Code | Description | Status | | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | | ASPI | Some parts of the address (such as the street and ZIP code) are valid. | New: Added December 2025 | | TANM | The SSN used is more closely associated with another consumer. | New: Added December 2025 | | TANO | Current address not on file. | Live | | TARF | Address reported with past fraud. | New: Added December 2025 | | TDDA | Different date of birth (age) than past application linked to the current applicant. | Live | | TFAD1 | FACTA active duty alert. Active for one year. | Deprecated | | TFADF | FACTA active duty alert with fraud victim. Active for one year. | Deprecated | | TFADI | FACTA active duty alert with fraud victim: initial alert. Active for 90 days. | Deprecated | | TFEM | The age of the consumer is younger than the issue date of the SSN. | New: Added December 2025 | | TFMCI | Five or more credit inquiries in the last 14 days. | New: Added December 2025 | | TFVE | FACTA fraud victim extended alert. Active for seven years. | Deprecated | | TFVI | FACTA fraud victim initial alert. Active for 90 days. | Deprecated | | TH3AA | High-risk Third Party Score based on the TaxID data provider's categorization of attributes of addresses that the consumer is tied to. | Deprecated | | TH3AH | High-risk Third Party Score based on the TaxID data provider's categorization of whether the supplied SSN aligns with the consumer's address history. | Deprecated | | TH3AI | High-risk Third Party Score based on the TaxID data provider's categorization of whether the supplied SSN might belong to another person not yet credit active. | Deprecated | | TH3AO | High-risk Third Party Score based on the TaxID data provider's categorization of whether the consumer appears to have a better SSN. | Deprecated | | TH3AS | High-risk Third Party Score based on the TaxID data provider's categorization of whether the consumer is tied to addresses linked to counterfeit fraud. | Deprecated | | TH3BO | High-risk Third Party Score based on the TaxID data provider's categorization of whether there is a better owner for the SSN. | Deprecated | | TH3CH | High-risk Third Party Score based on the TaxID data provider's categorization of the depth of the consumer's history with this information. | Deprecated | | TH3DB | High-risk Third Party Score based on the TaxID data provider's categorization of whether the supplied SSN aligns with the consumer's date of birth. | Deprecated | | TH3DI | High-risk Third Party Score based on the TaxID data provider's categorization of whether any of the supplied information corresponds to a deceased individual. | Deprecated | | TH3ED | High-risk Third Party Score based on the TaxID data provider's categorization of whether the email domain or structure of the handle are suspicious. | Deprecated | | TH3FG | High-risk Third Party Score based on the TaxID data provider's categorization of whether the SSN is tied to a clump of SSNs empirically used for fraud. | Deprecated | | TH3FR | High-risk Third Party Score based on the TaxID data provider's categorization of whether the consumer is tied to fraud code records. | Deprecated | | TH3IT | High-risk Third Party Score based on the TaxID data provider's categorization of whether the consumer is tied to an ITIN. | Deprecated | | TH3MR | High-risk Third Party Score based on the TaxID data provider's categorization of how well the supplied information matches Manifest records. | Deprecated | | TH3NN | High-risk Third Party Score based on the TaxID data provider's categorization of whether the supplied name or SSN is nonsense. | Deprecated | | TH3OM | High-risk Third Party Score based on the TaxID data provider's categorization of whether other applicants match aspects of this application's information. | Deprecated | | TH3PB | High-risk Third Party Score based on the TaxID data provider's categorization of whether aspects of the supplied PII correspond to bankruptcies. | Deprecated | | TH3PH | High-risk Third Party Score based on the TaxID data provider's categorization of whether the phone aligns with the consumer's history. | Deprecated | | TH3PR | High-risk Third Party Score based on the TaxID data provider's categorization of whether the supplied phone number corresponds to a risky carrier or line type. | Deprecated | | TH3RI | High-risk Third Party Score based on the TaxID data provider's categorization of whether the supplied SSN is a randomly issued SSN. | Deprecated | | TH3SA | High-risk Third Party Score based on the TaxID data provider's categorization of whether the SSN might belong to an associate. | Deprecated | | TH3SF | High-risk Third Party Score based on the TaxID data provider's categorization of whether the consumer is tied to security freezes. | Deprecated | | TH3SM | High-risk Third Party Score based on the TaxID data provider's categorization of how well the start time of the consumer's history aligns with the expected start time. | Deprecated | | THAAA | High-risk Abuse Score based on the TaxID data provider's categorization of attributes of addresses that the consumer is tied to. | Deprecated | | THAAH | High-risk Abuse Score based on the TaxID data provider's validation of the consumer's address history. | Deprecated | | THAAI | High-risk Abuse Score based on the TaxID data provider's categorization of the provided SSN belonging to another person not yet credit active. | Deprecated | | THAAO | High-risk Abuse Score based on the TaxID data provider's categorization of the consumer appearing to have a better SSN. | Deprecated | | THAAS | High-risk Abuse Score based on the TaxID data provider's categorization of the consumer being tied to addresses linked to counterfeit fraud. | Deprecated | | THABO | High-risk Abuse Score based on the TaxID data provider's categorization of there being a better owner for the SSN. | Deprecated | | THACH | High-risk Abuse Score based on the TaxID data provider's categorization of the depth of the consumer's history with this information. | Deprecated | | THADB | High-risk Abuse Score based on the TaxID data provider's validation of the consumer's date of birth. | Deprecated | | THADI | High-risk Abuse Score based on the TaxID data provider's categorization of the supplied information corresponding to a deceased individual. | Deprecated | | THAED | High-risk Abuse Score based on the TaxID data provider's categorization of whether the email domain or structure of the handle are suspicious. | Deprecated | | THAFG | High-risk Abuse Score based on the TaxID data provider's categorization of the SSN being tied to a clump of SSNs empirically used for fraud. | Deprecated | | THAFR | High-risk Abuse Score based on the TaxID data provider's categorization of the consumer being tied to fraud code records. | Deprecated | | THAIT | High-risk Abuse Score based on the TaxID data provider's categorization of the consumer being tied to an ITIN. | Deprecated | | THAMR | High-risk Abuse Score based on the TaxID data provider's categorization of how well the supplied information matches Manifest records. | Deprecated | | THANN | The SSN provided is not a valid number as reported by the SSA. | Live | | THAOM | High-risk Abuse Score based on the TaxID data provider's categorization of whether other applications match aspects of this application's information. | Deprecated | | THAPB | High-risk Abuse Score based on the TaxID data provider's categorization of whether aspects of the supplied PII correspond to bankruptcies. | Deprecated | | THAPH | High-risk Abuse Score based on the TaxID data provider's validation of the consumer's phone history. | Deprecated | | THAPR | High-risk Abuse Score based on the TaxID data provider's categorization of whether the supplied phone number corresponds to a risky carrier or line type. | Deprecated | | THARI | High-risk Abuse Score based on the TaxID data provider's categorization of the provided SSN being a randomly issued SSN. | Deprecated | | THASA | High-risk Abuse Score based on the TaxID data provider's categorization of whether the SSN might belong to an associate. | Deprecated | | THASF | High-risk Abuse Score based on the TaxID data provider's categorization of whether the consumer is tied to security freezes. | Deprecated | | THASM | High-risk Abuse Score based on the TaxID data provider's categorization of the consumer's history start time aligning with the expected record start time. | Deprecated | | THPAA | High-risk First Party Score based on the TaxID data provider's categorization of attributes of addresses that the consumer is tied to. | Deprecated | | THPAH | High-risk First Party Score based on the TaxID data provider's categorization of whether the supplied SSN aligns with the consumer's address history. | Deprecated | | THPAI | High-risk First Party Score based on the TaxID data provider's categorization of whether the supplied SSN might belong to another person not yet credit active. | Deprecated | | THPAO | High-risk First Party Score based on the TaxID data provider's categorization of whether the consumer appears to have a better SSN. | Deprecated | | THPAS | High-risk First Party Score based on the TaxID data provider's categorization of whether the consumer is tied to addresses linked to counterfeit fraud. | Deprecated | | THPBO | High-risk First Party Score based on the TaxID data provider's categorization of whether there is a better owner for the SSN. | Deprecated | | THPCH | High-risk First Party Score based on the TaxID data provider's categorization of the depth of the consumer's history with this information. | Deprecated | | THPDB | High-risk First Party Score based on the TaxID data provider's categorization of whether the supplied TaxID aligns with the consumer's date of birth. | Deprecated | | THPDI | High-risk First Party Score based on the TaxID data provider's categorization of whether any of the supplied information corresponds to a deceased individual. | Deprecated | | THPED | High-risk First Party Score based on the TaxID data provider's categorization of whether the email domain or structure of the handle are suspicious. | Deprecated | | THPFG | High-risk First Party Score based on the TaxID data provider's categorization of whether the SSN is tied to a clump of SSNs empirically used for fraud. | Deprecated | | THPFR | High-risk First Party Score based on the TaxID data provider's categorization of whether the consumer is tied to fraud code records. | Deprecated | | THPIT | High-risk First Party Score based on the TaxID data provider's categorization of whether the consumer is tied to an ITIN. | Deprecated | | THPMR | High-risk First Party Score based on the TaxID data provider's categorization of how well the supplied information matches Manifest records. | Deprecated | | THPNN | High-risk First Party Score based on the TaxID data provider's categorization of whether the supplied name or SSN is nonsense. | Deprecated | | THPOM | High-risk First Party Score based on the TaxID data provider's categorization of whether other applicants match aspects of this application's information. | Deprecated | | THPPB | High-risk First Party Score based on the TaxID data provider's categorization of whether aspects of the supplied PII correspond to bankruptcies. | Deprecated | | THPPH | High-risk First Party Score based on the TaxID data provider's categorization of whether the phone aligns with the consumer's history. | Deprecated | | THPPR | High-risk First Party Score based on the TaxID data provider's categorization of whether the supplied phone number corresponds to a risky carrier or line type. | Deprecated | | THPRI | High-risk First Party Score based on the TaxID data provider's categorization of whether the supplied SSN is a randomly issued SSN. | Deprecated | | THPSA | High-risk First Party Score based on the TaxID data provider's categorization of whether the SSN might belong to an associate. | Deprecated | | THPSF | High-risk First Party Score based on the TaxID data provider's categorization of whether the consumer is tied to security freezes. | Deprecated | | THPSM | High-risk First Party Score based on the TaxID data provider's categorization of how well the start time of the consumer's history aligns with the expected start time. | Deprecated | | THTAH | High-risk ID Theft Score based on the TaxID data provider's categorization of how consistent the address is with the consumer's history. | Deprecated | | THTAV | High-risk ID Theft Score based on the TaxID data provider's categorization of whether the address has a high velocity of applications. | Deprecated | | THTBE | High-risk ID Theft Score based on the TaxID data provider's categorization of whether the applicant appears to be the best owner of the email. | Deprecated | | THTBP | High-risk ID Theft Score based on the TaxID data provider's categorization of whether the applicant appears to be the best owner of the phone. | Deprecated | | THTDI | High-risk ID Theft Score based on the TaxID data provider's categorization of whether any of the supplied information corresponds to a deceased individual. | Deprecated | | THTED | High-risk ID Theft Score based on the TaxID data provider's categorization of whether the email domain or structure of the handle are suspicious. | Deprecated | | THTES | High-risk ID Theft Score based on the TaxID data provider's categorization of whether the email has had suspicious application activity. | Deprecated | | THTFG | High-risk ID Theft Score based on the TaxID data provider's categorization of whether the SSN is tied to a clump of SSNs empirically used for fraud. | Deprecated | | THTFR | High-risk ID Theft Score based on the TaxID data provider's categorization of whether the consumer is tied to fraud code records. | Deprecated | | THTGP | High-risk ID Theft Score based on the TaxID data provider's categorization of whether there is unusual geographic activity associated with the phone number. | Deprecated | | THTHE | High-risk ID Theft Score based on the TaxID data provider's categorization of the length of history of the email. | Deprecated | | THTIA | High-risk ID Theft Score based on whether application information is tied to an associate. | Deprecated | | THTIH | High-risk ID Theft Score based on the TaxID data provider's categorization of whether the IP address aligns with the applicant's physical address history. | Deprecated | | THTIP | High-risk ID Theft Score based on whether the IP address has had suspicious application activity. | Deprecated | | THTMX | High-risk ID Theft Score based on the TaxID data provider's categorization of whether the application information contains a mix of information from different consumers. | Deprecated | | THTNN | High-risk ID Theft Score based on the TaxID data provider's categorization of whether the supplied name or SSN is nonsense. | Deprecated | | THTOM | High-risk ID Theft Score based on the TaxID data provider's categorization of whether other applicants match aspects of this application's information. | Deprecated | | THTPR | High-risk ID Theft Score based on the TaxID data provider's categorization of whether the supplied phone number corresponds to a risky carrier or line type. | Deprecated | | THTRP | High-risk ID Theft Score based on the TaxID data provider's categorization of the number of recent applications associated with the phone. | Deprecated | | THTSG | High-risk ID Theft Score based on the TaxID data provider's categorization of whether the applicant has a suspicious gap in history. | Deprecated | | THTVP | High-risk ID Theft Score based on the TaxID data provider's categorization of whether the application's IP address is from a risky VPN. | Deprecated | | TIAWB | Address reported as associated with a business. | Live | | TIAWF | Address reported as associated with a business with higher potential fraud activity. | Live | | TIENK | No search keys generated for IEN. | New: Added December 2025 | | TIENM | No match to any IEN repository records. | New: Added December 2025 | | TINO | Input SSN does not match on-file SSN. | Live | | TITIN | TaxID is an ITIN. | New: Added December 2025 | | TL3AA | Low-risk Third Party Score based on the TaxID data provider's categorization of attributes of addresses that the consumer is tied to. | Deprecated | | TL3AH | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the supplied SSN aligns with the consumer's address history. | Deprecated | | TL3AI | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the supplied SSN might belong to another person not yet credit active. | Deprecated | | TL3AO | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the consumer appears to have a better SSN. | Deprecated | | TL3AS | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the consumer is tied to addresses linked to counterfeit fraud. | Deprecated | | TL3BO | Low-risk Third Party Score based on the TaxID data provider's categorization of whether there is a better owner for the SSN. | Deprecated | | TL3CH | Low-risk Third Party Score based on the TaxID data provider's categorization of the depth of the consumer's history with this information. | Deprecated | | TL3DB | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the supplied SSN aligns with the consumer's date of birth. | Deprecated | | TL3DI | Low-risk Third Party Score based on the TaxID data provider's categorization of whether any of the supplied information corresponds to a deceased individual. | Deprecated | | TL3ED | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the email domain or structure of the handle are suspicious. | Deprecated | | TL3FG | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the SSN is tied to a clump of SSNs empirically used for fraud. | Deprecated | | TL3FR | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the consumer is tied to fraud code records. | Deprecated | | TL3IT | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the consumer is tied to an ITIN. | Deprecated | | TL3MR | Low-risk Third Party Score based on the TaxID data provider's categorization of how well the supplied information matches Manifest records. | Deprecated | | TL3NN | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the supplied name or SSN is nonsense. | Deprecated | | TL3OM | Low-risk Third Party Score based on the TaxID data provider's categorization of whether other applicants match aspects of this application's information. | Deprecated | | TL3PB | Low-risk Third Party Score based on the TaxID data provider's categorization of whether aspects of the supplied PII correspond to bankruptcies. | Deprecated | | TL3PH | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the phone aligns with the consumer's history. | Deprecated | | TL3PR | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the supplied phone number corresponds to a risky carrier or line type. | Deprecated | | TL3RI | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the supplied SSN is a randomly issued SSN. | Deprecated | | TL3SA | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the SSN might belong to an associate. | Deprecated | | TL3SF | Low-risk Third Party Score based on the TaxID data provider's categorization of whether the consumer is tied to security freezes. | Deprecated | | TL3SM | Low-risk Third Party Score based on the TaxID data provider's categorization of how well the start time of the consumer's history aligns with the expected start time. | Deprecated | | TLAAA | Low-risk Abuse Score based on the TaxID data provider's categorization of attributes of addresses that the consumer is tied to. | Deprecated | | TLAAH | Low-risk Abuse Score based on the TaxID data provider's validation of the consumer's address history. | Deprecated | | TLAAI | Low-risk Abuse Score based on the TaxID data provider's categorization of the provided SSN belonging to another person not yet credit active. | Deprecated | | TLAAO | Low-risk Abuse Score based on the TaxID data provider's categorization of the consumer appearing to have a better SSN. | Deprecated | | TLAAS | Low-risk Abuse Score based on the TaxID data provider's categorization of the consumer being tied to addresses linked to counterfeit fraud. | Deprecated | | TLABO | Low-risk Abuse Score based on the TaxID data provider's categorization of there being a better owner for the SSN. | Deprecated | | TLACH | Low-risk Abuse Score based on the TaxID data provider's categorization of the depth of the consumer's history with this information. | Deprecated | | TLADB | Low-risk Abuse Score based on the TaxID data provider's validation of the consumer's date of birth. | Deprecated | | TLADI | Low-risk Abuse Score based on the TaxID data provider's categorization of the supplied information corresponding to a deceased individual. | Deprecated | | TLAED | Low-risk Abuse Score based on the TaxID data provider's categorization of whether the email domain or structure of the handle are suspicious. | Deprecated | | TLAFG | Low-risk Abuse Score based on the TaxID data provider's categorization of the SSN being tied to a clump of SSNs empirically used for fraud. | Deprecated | | TLAFR | Low-risk Abuse Score based on the TaxID data provider's categorization of the consumer being tied to fraud code records. | Deprecated | | TLAIT | Low-risk Abuse Score based on the TaxID data provider's categorization of the consumer being tied to an ITIN. | Deprecated | | TLAMR | Low-risk Abuse Score based on the TaxID data provider's categorization of how well the supplied information matches Manifest records. | Deprecated | | TLANN | Low-risk Abuse Score based on the TaxID data provider's categorization of the provided name or SSN as nonsense. | Deprecated | | TLAOM | Low-risk Abuse Score based on the TaxID data provider's categorization of whether other applications match aspects of this application's information. | Deprecated | | TLAPB | Low-risk Abuse Score based on the TaxID data provider's categorization of whether aspects of the supplied PII correspond to bankruptcies. | Deprecated | | TLAPH | Low-risk Abuse Score based on the TaxID data provider's validation of the consumer's phone history. | Deprecated | | TLAPR | Low-risk Abuse Score based on the TaxID data provider's categorization of whether the supplied phone number corresponds to a risky carrier or line type. | Deprecated | | TLARI | Low-risk Abuse Score based on the TaxID data provider's categorization of the provided SSN being a randomly issued SSN. | Deprecated | | TLASA | Low-risk Abuse Score based on the TaxID data provider's categorization of whether the SSN might belong to an associate. | Deprecated | | TLASF | Low-risk Abuse Score based on the TaxID data provider's categorization of whether the consumer is tied to security freezes. | Deprecated | | TLASM | Low-risk Abuse Score based on the TaxID data provider's categorization of the consumer's history start time aligning with the expected record start time. | Deprecated | | TLGPD | Tax ID check was not performed due to LGPD: minor's data. | Live | | TLPAA | Low-risk First Party Score based on the TaxID data provider's categorization of attributes of addresses that the consumer is tied to. | Deprecated | | TLPAH | Low-risk First Party Score based on the TaxID data provider's categorization of whether the supplied SSN aligns with the consumer's address history. | Deprecated | | TLPAI | Low-risk First Party Score based on the TaxID data provider's categorization of whether the supplied SSN might belong to another person not yet credit active. | Deprecated | | TLPAO | Low-risk First Party Score based on the TaxID data provider's categorization of whether the consumer appears to have a better SSN. | Deprecated | | TLPAS | Low-risk First Party Score based on the TaxID data provider's categorization of whether the consumer is tied to addresses linked to counterfeit fraud. | Deprecated | | TLPBO | Low-risk First Party Score based on the TaxID data provider's categorization of whether there is a better owner for the SSN. | Deprecated | | TLPCH | Low-risk First Party Score based on the TaxID data provider's categorization of the depth of the consumer's history with this information. | Deprecated | | TLPDB | Low-risk First Party Score based on the TaxID data provider's categorization of whether the supplied TaxID aligns with the consumer's date of birth. | Deprecated | | TLPDI | Low-risk First Party Score based on the TaxID data provider's categorization of whether any of the supplied information corresponds to a deceased individual. | Deprecated | | TLPED | Low-risk First Party Score based on the TaxID data provider's categorization of whether the email domain or structure of the handle are suspicious. | Deprecated | | TLPFG | Low-risk First Party Score based on the TaxID data provider's categorization of whether the SSN is tied to a clump of SSNs empirically used for fraud. | Deprecated | | TLPFR | Low-risk First Party Score based on the TaxID data provider's categorization of whether the consumer is tied to fraud code records. | Deprecated | | TLPIT | Low-risk First Party Score based on the TaxID data provider's categorization of whether the consumer is tied to an ITIN. | Deprecated | | TLPMR | Low-risk First Party Score based on the TaxID data provider's categorization of how well the supplied information matches Manifest records. | Deprecated | | TLPNN | Low-risk First Party Score based on the TaxID data provider's categorization of whether the supplied name or SSN is nonsense. | Deprecated | | TLPOM | Low-risk First Party Score based on the TaxID data provider's categorization of whether other applicants match aspects of this application's information. | Deprecated | | TLPPB | Low-risk First Party Score based on the TaxID data provider's categorization of whether aspects of the supplied PII correspond to bankruptcies. | Deprecated | | TLPPH | Low-risk First Party Score based on the TaxID data provider's categorization of whether the phone aligns with the consumer's history. | Deprecated | | TLPPR | Low-risk First Party Score based on the TaxID data provider's categorization of whether the supplied phone number corresponds to a risky carrier or line type. | Deprecated | | TLPRI | Low-risk First Party Score based on the TaxID data provider's categorization of whether the supplied SSN is a randomly issued SSN. | Deprecated | | TLPSA | Low-risk First Party Score based on the TaxID data provider's categorization of whether the SSN might belong to an associate. | Deprecated | | TLPSF | Low-risk First Party Score based on the TaxID data provider's categorization of whether the consumer is tied to security freezes. | Deprecated | | TLPSM | Low-risk First Party Score based on the TaxID data provider's categorization of how well the start time of the consumer's history aligns with the expected start time. | Deprecated | | TLTAH | Low-risk ID Theft Score based on the TaxID data provider's categorization of how consistent the address is with the consumer's history. | Deprecated | | TLTAV | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether the address has a high velocity of applications. | Deprecated | | TLTBE | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether the applicant appears to be the best owner of the email. | Deprecated | | TLTBP | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether the applicant appears to be the best owner of the phone. | Deprecated | | TLTDI | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether any of the supplied information corresponds to a deceased individual. | Deprecated | | TLTED | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether the email domain or structure of the handle are suspicious. | Deprecated | | TLTES | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether the email has had suspicious application activity. | Deprecated | | TLTFG | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether the SSN is tied to a clump of SSNs empirically used for fraud. | Deprecated | | TLTFR | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether the consumer is tied to fraud code records. | Deprecated | | TLTGP | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether there is unusual geographic activity associated with the phone number. | Deprecated | | TLTHE | Low-risk ID Theft Score based on the TaxID data provider's categorization of the length of history of the email. | Deprecated | | TLTIA | Low-risk ID Theft Score based on whether application information is tied to an associate. | Deprecated | | TLTIH | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether the IP address aligns with the applicant's physical address history. | Deprecated | | TLTIP | Low-risk ID Theft Score based on whether the IP address has had suspicious application activity. | Deprecated | | TLTMX | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether the application information contains a mix of information from different consumers. | Deprecated | | TLTNN | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether the supplied name or SSN is nonsense. | Deprecated | | TLTOM | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether other applicants match aspects of this application's information. | Deprecated | | TLTPR | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether the supplied phone number corresponds to a risky carrier or line type. | Deprecated | | TLTSG | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether the applicant has a suspicious gap in history. | Deprecated | | TLTVP | Low-risk ID Theft Score based on the TaxID data provider's categorization of whether the application's IP address is from a risky VPN. | Deprecated | | TMAI | Multiple address inconsistencies in the last seven days and SSN seen with different phones in the last 90 days. | Live | | TMFSI | Multiple Fraud Shield indicators triggered or unverifiable SSN. | Live | | TNAPD | Greater than 50% of tradelines in the last 90 days have the same name and address but a different phone, and occurred in the last seven days. | Live | | TNASM | Name and address seen multiple times in the last 90 days with a different SSN. | Live | | TNPID | Tax ID check was not performed due to invalid date of birth. | Deprecated | | TNPIE | Tax ID check was not performed due to invalid email. | Deprecated | | TNPIP | Tax ID check was not performed due to invalid phone. | Deprecated | | TNPIR | Tax ID check was not performed due to invalid request. | Deprecated | | TNPIS | Tax ID check was not performed due to invalid SSN. | Deprecated | | TNPIZ | Tax ID check was not performed due to invalid ZIP code. | Deprecated | | TNPMS | Tax ID check was not performed due to missing SSN. | Deprecated | | TNSA | This number was seen in phone risk scoring traffic in the last month. | Deprecated | | TOAB | On-file address reported as associated with a business. | Live | | TOAF | On-file address reported as associated with a business with higher potential fraud activity. | Live | | TOARF | On-file address reported with past fraud. | New: Added December 2025 | | TPAI | All trades are bankcard trades with phone-address inconsistencies in non-credit data verification. | Live | | TPDNV | One or more PII data elements not verified. | Live | | TPFUT | More than four unique tradelines with the same phone number in the last 90 days. | New: Added December 2025 | | TSAC | Current address conflict. | Live | | TSAF | Address first reported. | Live | | TSDV | SSN issue date cannot be verified. | Live | | TSNA | Input SSN exact match to at least one other, but input name and address not connected. | Live | | TSNV | New credit profile with unverifiable SSN, or address matches to a different name in non-credit data. | Live | | TSOD | Best on-file SSN issue date cannot be verified. | Live | | TSOP | Best on-file SSN recorded as deceased. | Live | | TSPNA | Same SSN, phone, or name and address seen more than three times in the last seven days. | Live | | TSPNM | SSN seen with a different phone more than 15 times in the last 90 days, or input phone does not match on-file phone at least twice in the last 90 days. | Live | | TSPR | The Tax ID provided is pending regularization. | Live | | TSR | Tax ID status is regular. | Live | | TSRD | Subject reported deceased. | Live | | TSRF | Tax ID status is not regular. It is suspended or canceled. | Live | | TSRP | Tax ID status is pending regularization. | Live | | TSSF | Subject has placed a security freeze on their SSN file. | Live | | TSTUT | More than three unique trades with the same SSN in the last 28 days. | Live | | TTIQ | More than two inquiries with the same name and address in the last 28 days. | Live | | TTMIQ | Too many inquiries in the last 90 days where name and address don't match the best on-file, and no change of address. | New: Added December 2025 | ## Address Reason Codes | Reason Code | Description | Status | | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------ | | A4070SS | Tracking data indicates that between 40% and 70% of mailpieces sent to this address were delivered successfully. | Live | | A40SS | Tracking data indicates that fewer than 40% of mailpieces sent to this address were delivered successfully, and recent mailings weren't successful. | Live | | A70SS | Tracking data indicates that over 70% of mailpieces sent to this address were delivered successfully, and recent mailings were also successful. | Live | | AASE | Verified. The input data is acceptable, but errors were introduced in an attempt to standardize user input. | Live | | ACMRA | The address matched to a CMRA and private mailbox information is not present. | New: Added December 2025 | | ACP | The address matched to a CMRA and private mailbox information is present. | New: Added December 2025 | | ACV | Country validated. | Live | | AD | The address is deliverable. | New: Added December 2025 | | ADC | Verified. The input data is correct. | Live | | ADCMS | Verified. The input data is correct. All input data was able to match in databases after some or all elements were standardized. | Live | | ADCUD | Verified. The input data is correct, although some input data is unverifiable due to incomplete data. | Live | | ADGD | The address is a deliverable General Delivery address. General Delivery is a USPS service that allows individuals without permanent addresses to receive mail. | New: Added December 2025 | | ADU | The address is a deliverable unique address. A unique ZIP code is assigned to a single organization—such as a government agency—that receives a large volume of mail. | New: Added December 2025 | | AFAEI | Fixed. The input data is acceptable, but errors were introduced in an attempt to standardize user input. | Live | | AFM | Fixed. The input data is matched and fixed: for example, "Brighon - UK" is corrected to "Brighton - UK". | Live | | AFMNCC | Fixed. The input data is matched and fixed, but some elements such as sub-building number and house number cannot be checked. | Live | | AFMSCC | Fixed. The input data is matched, but some elements such as street cannot be checked. | Live | | AHNI | Invalid house or building number. | Live | | AHR | Historical resident matched. | Live | | AIA | Invalid address. | Live | | AIAU | The address is an Informed Address. The recipient and the street address are replaced with a special code provided by the USPS. | New: Added December 2025 | | AII | Invalid input. | Live | | AIN | PO Box, Rural Route, or Highway Contract box number is invalid. | New: Added December 2025 | | AIR | The address is deliverable to the building's default address, but the secondary unit provided may not exist. There is a chance the mail will not reach the intended recipient. | Live | | AMA | The address is a deliverable military address. | New: Added December 2025 | | AMCC | Missing country code. | Live | | AMI | Missing input. | Live | | AMICC | Missing info. The input data cannot be corrected completely. | Live | | AMICCMM | Missing info. The input data cannot be corrected completely, and multiple matches were found in databases. | Live | | AMICCSE | Missing info. The input data cannot be corrected completely, and only some elements were found. | Live | | AMN | PO Box, Rural Route, or Highway Contract box number is missing. | New: Added December 2025 | | ANA | No tracking data exists for this address, or deliverability was unable to find a corresponding level of mail success. | Live | | AND | The address is not deliverable according to the USPS. | Live | | ANF | Not found. | Live | | APA | Partial address. | Live | | APAI | Both parsed and postal address parameters provided; postal address parameters ignored. | Live | | APCC | Input postal code was corrected. | Live | | APCR | The address matched to a Phantom Carrier Route (carrier route of R777), which corresponds to physical addresses that are not eligible for delivery. | New: Added December 2025 | | API | The primary number is invalid. | New: Added December 2025 | | APM | The primary number is missing. | New: Added December 2025 | | APNV | Street, postcode, city, and country validated. Premise not validated. | Live | | APO | The address is identified as a PO Box street address. | New: Added December 2025 | | ARNF | Resident not found at address. | Live | | ASC | Input state corrected. | Live | | ASCV | State and country validated. | Live | | ASDL | Unable to verify address because the CPF consulted does not have a CNH in the official government database. | Live | | ASU | The address is deliverable, but the secondary unit information is unnecessary. | Live | | ASUD | The primary number was confirmed, but the secondary number is unconfirmed and required to be deliverable. | New: Added December 2025 | | ATA | The address is deliverable by dropping a trailing alphabet from the primary number. | New: Added December 2025 | | AUICCM | Unverified. The input data cannot be corrected or matched. | Live | | AWS | The address is deliverable to the building's default address, but is missing secondary unit information. There is a chance the mail will not reach the intended recipient. | Live |
          --- - Path: `general-reference/ekyc-reference` - URL: https://developer.incode.com/general-reference/ekyc-reference/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference.md # eKYC Reference This section provides API-level reference material for Incode's eKYC (electronic Know Your Customer) product. Use these pages to understand response semantics, look up per-country source details, interpret reason codes, and retrieve eKYC data for a completed onboarding session. For an overview of how to configure eKYC in your Dashboard, see [eKYC Dashboard configuration](/dashboard-platform-administration/ekyc-dashboard/) and [eKYC field requirements by source](/dashboard-platform-administration/ekyc-field-requirements-by-source/). ## What's in this section - [**eKYC API Reference**](/general-reference/ekyc-api-reference/) explains the response semantics for the External Verification (eKYC) endpoint: how to interpret match fields, status values, risk levels, metadata fields, reason codes, and Risk Add-ons. Start here if you are new to integrating with the eKYC API. - [**Fetch eKYC Data**](/general-reference/fetch-ekyc-input/) documents the endpoint for retrieving the original form input and risk data for a completed onboarding session. - [**eKYC Reason Codes**](/general-reference/ekyc-reason-codes/) provides the full list of reason codes returned by the eKYC API, organized by category (Phone, Email, Tax ID, Address). - [**eKYC Coverage**](/general-reference/ekyc-coverage/) lists all countries and data sources Incode supports for eKYC verification, including field requirements for each source. Individual country pages nested under Coverage provide API-level detail for the sources currently available in the Dashboard, including request parameters, response schemas, and `overallLevel` calculations. ## How the pieces fit together A typical eKYC integration flow uses these pages together: 1. Choose a country and source from **eKYC Coverage** based on your customer base and use case. 2. Review the country page for that source to understand its request parameters, response schema, and risk-level calculations. 3. Refer to **eKYC API Reference** for shared response concepts (match field patterns, status values, risk levels) that apply across sources. 4. Retrieve original form input and risk data for any session using **Fetch eKYC Data**. 5. Interpret returned reason codes using **eKYC Reason Codes**.
          --- - Path: `general-reference/ekyc-reference-argentina` - URL: https://developer.incode.com/general-reference/ekyc-reference-argentina/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-argentina.md # Argentina Argentina eKYC verification matches submitted individual data against Argentine sources of truth. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics that apply across all sources. ## Available sources | Source | API source string | Description | | ----------------------------------- | ----------------------------------- | -------------------------------------------------------------------- | | Argentina - Official Civil Register | `AR_1` | Verifies submitted data against Argentina's Official Civil Register. | | Argentina - Credit Bureau 1 | `AR_CREDIT_BUR_1` | Verifies submitted data against Argentine credit bureau records. | ## Argentina - Official Civil Register ### Request parameters | Parameter | Required | Description | | ------------- | --------- | --------------------------------------------------------------- | | `source` | Mandatory | Must be `AR_1`. | | `country` | Mandatory | Must be `AR`. | | `idNumber` | Mandatory | Argentine national ID number. Eight digits. | | `idNumber1` | Optional | Argentine tax ID number (DNI). Eleven digits, numeric only. | | `firstName` | Mandatory | First name of the individual. | | `middleName` | Optional | Middle name of the individual. | | `surName` | Mandatory | Last name of the individual. | | `street` | Optional | Street name and house number. | | `floor` | Optional | Floor number in the building. | | `apartment` | Optional | Apartment number. | | `city` | Optional | City of the individual's address (for example, `Buenos Aires`). | | `state` | Optional | State or province. | | `postalCode` | Optional | Postal code. | | `dateOfBirth` | Optional | Format: `yyyy-mm-dd`. | | `gender` | Optional | Accepted values are `m` or `f`. | ### Response fields Argentina - Official Civil Register anchors verification on the source-of-truth register. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common match field definitions and status values. | Field | Statuses | Description | | -------------------- | ------------------------------------- | ----------------------------------------------------------------------------------------- | | `firstNameMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches first name submitted against the value in the source of truth. | | `middleNameMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches middle name submitted against the value in the source of truth. | | `lastNameMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches last name submitted against the value in the source of truth. | | `fullNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches full name submitted against the value in the source of truth. | | `dobMatch` | `exact`, `nomatch`, `nodata` | Matches date of birth submitted against the value in the source of truth. | | `streetMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches street name and street number submitted against the value in the source of truth. | | `houseNoMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches floor and apartment submitted against the value in the source of truth. | | `streetAddressMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches street and house number submitted against the value in the source of truth. | | `cityMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches city submitted against the value in the source of truth. | | `stateMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches state submitted against the value in the source of truth. | | `postalCodeMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches postal code submitted against the value in the source of truth. | | `fullAddressMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches full address submitted against the value in the source of truth. | | `idNumMatch` | `exact`, `nomatch`, `nodata` | Matches national ID number submitted against the value in the source of truth. | | `idNum1Match` | `exact`, `nomatch`, `nodata` | Matches tax ID number (DNI) submitted against the value in the source of truth. | | `genderMatch` | `exact`, `nomatch`, `nodata` | Matches gender submitted against the value in the source of truth. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on the risk associated with the submitted full name and ID numbers: - `low` when `fullNameMatch` is `exact` AND (`idNumMatch` OR `idNum1Match`) is `exact`. - `high` when `fullNameMatch` is `nomatch` AND (`idNumMatch` OR `idNum1Match`) is `nomatch`. - `medium` for all other combinations. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ### Sample response ```json { "kyc": [ { "key": "firstNameMatch", "status": "exact" }, { "key": "middleNameMatch", "status": "exact" }, { "key": "lastNameMatch", "status": "fuzzy" }, { "key": "fullNameMatch", "status": "fuzzy" }, { "key": "dobMatch", "status": "exact" }, { "key": "streetMatch", "status": "exact" }, { "key": "cityMatch", "status": "exact" }, { "key": "stateMatch", "status": "exact" }, { "key": "postalCodeMatch", "status": "exact" }, { "key": "fullAddressMatch", "status": "fuzzy" }, { "key": "idNumMatch", "status": "exact" }, { "key": "idNum1Match", "status": "exact" }, { "key": "genderMatch", "status": "exact" }, { "key": "overallLevel", "status": "low" } ] } ``` ## Argentina - Credit Bureau 1 ### Request parameters | Parameter | Required | Description | | ------------- | --------- | --------------------------------------------------------------- | | `source` | Mandatory | Must be `AR_CREDIT_BUR_1`. | | `country` | Mandatory | Must be `AR`. | | `firstName` | Mandatory | First name of the individual. Must not contain digits. | | `surName` | Mandatory | Last name of the individual. Must not contain digits. | | `dateOfBirth` | Mandatory | Format: `yyyy-mm-dd`. | | `middleName` | Optional | Middle name of the individual. Must not contain digits. | | `street` | Optional | Street name and house number combined into a single field. | | `city` | Optional | City of the individual's address. | | `state` | Optional | State or province. | | `postalCode` | Optional | Argentine postal code. Accepted formats: 8-character CPA (1 letter + 4 digits + 3 letters, e.g. `C1425ABC`) or legacy 4-digit (e.g. `1425`). | | `gender` | Optional | Accepted values are `m` or `f`. | | `phone` | Optional | Phone number. Digits only. | | `idNumber` | Optional | DNI (Documento Nacional de Identidad). Exactly 8 digits. | | `idNumber1` | Optional | CUIT (Clave Única de Identificación Tributaria) or CUIL (Código Único de Identificación Laboral). Exactly 11 digits. | ### Response fields Argentina - Credit Bureau 1 anchors verification on the source-of-truth register. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common match field definitions and status values. | Field | Statuses | Description | | ------------------ | ------------------------------------- | ------------------------------------------------------------------------------------------ | | `firstNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches first name submitted against the value in the source of truth. | | `middleNameMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches middle name submitted against the value in the source of truth. | | `lastNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches last name submitted against the value in the source of truth. | | `fullNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches full name submitted against the value in the source of truth. | | `dobMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches date of birth submitted against the value in the source of truth. | | `streetMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches street address submitted against the value in the source of truth. Street and house number are combined into a single field. | | `cityMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches city submitted against the value in the source of truth. | | `stateMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches state or province submitted against the value in the source of truth. | | `postalCodeMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches postal code submitted against the value in the source of truth. | | `fullAddressMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches full address submitted against the value in the source of truth. | | `genderMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches gender submitted against the value in the source of truth. | | `phoneMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches phone submitted against the value in the source of truth. | | `idNumMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches DNI number submitted against the value in the source of truth. | | `idNum1Match` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches CUIT or CUIL submitted against the value in the source of truth. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on `fullNameMatch` and `dobMatch`: - `low` when `fullNameMatch` is `exact` AND `dobMatch` is `exact`. - `high` when `fullNameMatch` is `nomatch` OR `dobMatch` is `nomatch`. - `medium` for all other combinations. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ### Sample response ```json { "kyc": [ { "key": "firstNameMatch", "status": "exact" }, { "key": "middleNameMatch", "status": "exact" }, { "key": "lastNameMatch", "status": "exact" }, { "key": "fullNameMatch", "status": "exact" }, { "key": "dobMatch", "status": "exact" }, { "key": "streetMatch", "status": "exact" }, { "key": "cityMatch", "status": "exact" }, { "key": "stateMatch", "status": "exact" }, { "key": "postalCodeMatch", "status": "exact" }, { "key": "fullAddressMatch", "status": "exact" }, { "key": "genderMatch", "status": "exact" }, { "key": "phoneMatch", "status": "exact" }, { "key": "idNumMatch", "status": "exact" }, { "key": "idNum1Match", "status": "exact" }, { "key": "overallLevel", "status": "low" } ] } ``` --- - Path: `general-reference/ekyc-reference-brazil` - URL: https://developer.incode.com/general-reference/ekyc-reference-brazil/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-brazil.md # Brazil Brazil eKYC verification matches submitted individual data against Brazilian government sources of truth. Brazil also supports a separate income verification endpoint that returns employment and income data for a valid CPF. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics that apply across all identity-matching sources. ## Available sources | Source | Description | | --------- | ------------------------------------------------------------------------------------------------------- | | BR GOVT 1 | Verifies submitted data against Brazilian government records associated with the provided tax ID (CPF). | | BR Income Verification | Retrieves employment and estimated income data for a valid CPF. | ## BR GOVT 1 ### Request parameters | Parameter | Required | Description | | ------------- | --------- | -------------------------------------------------------------------------------------------- | | `country` | Mandatory | Must be `BR`. | | `taxId` | Mandatory | Brazilian CPF. Eleven digits. | | `firstName` | Mandatory | First name of the individual. | | `surName` | Mandatory | Last name of the individual. If the individual has a middle name, include it here. | | `houseNo` | Optional | House number. | | `street` | Optional | Full street including apartment number. | | `city` | Optional | City of the individual's address (for example, `Rio de Janeiro`). | | `state` | Optional | Two-letter state code (for example, `RJ`). | | `postalCode` | Optional | Postal code. | | `dateOfBirth` | Optional | Format: `yyyy-mm-dd`. | | `nationality` | Optional | Accepted values: `BRAZILIAN`, `NATURALIZED_BRAZILIAN`, `FOREIGNER`, `BRAZILIAN_BORN_ABROAD`. | ### Sample request ```json { "plugins": ["kyc"], //required field "firstName": "Renata", // required field "surName": "De Maria Santos", //required field "houseNo" : "121", "street" : "Rua Luiz Ferreira Dorta", "postalCode": "76535000", "country": "BR", //required firled "state" : "RJ", "city" : "Rio de Janerio", "dateOfBirth": "1980-06-01", "nationality" : "1", "taxId" : "23490843490" //required field } ``` ### Response fields BR GOVT 1 anchors verification on the tax ID (CPF). See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common match field definitions and status values. BR GOVT 1 uses `approximatematch` as an alternative to `fuzzy` for some fields, and `unabletoverify` for address components when the individual has no driver's license record. | Field | Statuses | Description | | ----------------------- | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `taxIdMatch` | `exact`, `nomatch` | Matches submitted CPF against the CPF in the government source of truth. | | `taxIdNameMatch` | `exact`, `approximatematch`, `nomatch` | Matches submitted name against the name associated with the CPF in the government source of truth. | | `taxIdDobMatch` | `exact`, `nomatch` | Matches submitted date of birth against the date of birth associated with the CPF. | | `taxIdStateMatch` | `exact`, `nomatch`, `unabletoverify` | Matches submitted state against the government source of truth. | | `taxIdAddressMatch` | `exact`, `approximatematch`, `nomatch`, `unabletoverify` | Matches submitted address against the government source of truth. Approximate match is returned when at least two address elements (street, postal code, city, or state) match exactly. | | `taxIdCityMatch` | `exact`, `nomatch`, `unabletoverify` | Matches submitted city against the government source of truth. | | `taxIdPostalCodeMatch` | `exact`, `nomatch`, `unabletoverify` | Matches submitted postal code against the government source of truth. | | `taxIdNationalityMatch` | `exact`, `nomatch` | Matches submitted nationality against the CPF in the government source of truth. | | `taxIdLevel` | `low`, `high` | Risk level associated with the CPF. See below. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level of the submitted attributes associated with the CPF. | :::info `unabletoverify` is returned for address-based fields (`taxIdStateMatch`, `taxIdAddressMatch`, `taxIdCityMatch`, `taxIdPostalCodeMatch`) when the individual does not have a driver's license record. Addresses are validated through the Brazilian government's driver's license source of truth. ::: ### taxIdLevel `taxIdLevel` reflects the status of the submitted CPF: - `low`: The CPF status is regular (verified). - `high`: The CPF status is suspended, associated with a deceased holder, pending regularization, canceled due to multiplicity, or canceled by authority. ### Reason codes BR GOVT 1 returns reason codes alongside match and risk-level fields. Selected Brazil-specific reason codes: | Reason code | Description | | ----------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `ASDL` | Unable to verify address because the CPF does not have a CNH (driver's license) in the official government database. | | `TSR` | Tax ID status (situação CPF) is regular. | | `TSRF` | Tax ID status is not regular. It may be suspended, canceled due to pending regularization, null, or associated with a deceased holder. | | `TSRP` | Tax ID status is pending regularization. | | `TNPIN` | Tax ID check was not performed due to invalid nationality. | | `TLGPD` | Tax ID check was not performed due to LGPD (minor's data). | | `ASCV` | State and country validated. | For the full list of reason codes, see [eKYC Reason Codes](/general-reference/ekyc-reason-codes/). ### Sample response ```json { "kyc": [ { "key": "taxIdNationalityMatch", "status": "exact" }, { "key": "taxIdDobMatch", "status": "exact" }, { "key": "taxIdMatch", "status": "exact" }, { "key": "taxIdAddressMatch", "status": "approximatematch", "reasonCodes": ["ASCV"] }, { "key": "taxIdNameMatch", "status": "exact" }, { "key": "taxIdStateMatch", "status": "exact" }, { "key": "taxIdCityMatch", "status": "exact" }, { "key": "taxIdPostalCodeMatch", "status": "nomatch" }, { "key": "taxIdLevel", "status": "low", "reasonCodes": ["TSR"] }, { "key": "overallLevel", "status": "low" } ] } ``` ## BR Income verification Brazil supports a separate endpoint for retrieving employment and estimated income data for a valid CPF. This endpoint is distinct from the standard eKYC endpoint and returns employment type, employment sector, and an estimated income range in Brazilian Real. ### Endpoint `POST /omni/externalVerification/income` For the request contract, see the [eKYC Income Verification](/reference/externalverificationincome/) API reference. ### Response fields | Field | Statuses | Description | | ------------------- | -------------------- | --------------------------------------------------------------------------------------------------------------- | | `employment_type` | `success`, `failure` | Employment type for the individual (for example, `ENTREPRENEUR / BUSINESS OWNER`, `SELF-EMPLOYED`, `EMPLOYEE`). | | `employment_sector` | `success`, `failure` | Employment sector, including the CNAE code and description. | | `income_range` | `success`, `failure` | Estimated monthly income range in Brazilian Real (R$), based on a statistical prediction model. | Each field returns a `status` (indicating whether data was available), a `sub_label` (a display label for the field), and a `message` (the actual value or `Unavailable`). ### Estimated income range The income range is calculated as a multiple of the Brazilian minimum wage and returned as a range in Brazilian Real (R$). | Income range (R$) | | ----------------- | | No information | | 0 - 1412 | | 1412 - 2824 | | 2824 - 4236 | | 4236 - 7060 | | 7060 - 9884 | | 9884 - 14120 | | 14120 - 21180 | | 21180 - 28240 | | Above 28240 | ### Employment type Employment type describes the individual's current employment status. Example values: - `ENTREPRENEUR / BUSINESS OWNER` - `SELF-EMPLOYED` - `EMPLOYEE` ### Employment sector Employment sector describes the industry the individual works in, including a CNAE code and Portuguese-language description. The CNAE (Classificação Nacional de Atividades Econômicas) is Brazil's national classification of economic activities, maintained by the Instituto Brasileiro de Geografia e Estatística (IBGE). Example values: - `PRIVATE - 4789001 - COMERCIO VAREJISTA DE SUVENIRES, BIJUTERIAS E ARTESANATOS` - `PRIVATE - 7319002 - PROMOCAO DE VENDAS` - `PUBLIC - 8412400 - REGULACAO DAS ATIVIDADES DE SAUDE, EDUCACAO, SERVICOS CULTURAIS E OUTROS SERVICOS SOCIAIS` For the full CNAE classification, see the [IBGE CNAE reference](https://concla.ibge.gov.br/busca-online-cnae.html). ### Sample response ```json { "income": [ { "key": "employment_type", "status": "success", "sub_label": "Type", "message": "ENTREPRENEUR | BUSINESS OWNER" }, { "key": "employment_sector", "status": "success", "sub_label": "Sector", "message": "PRIVATE - 4639701 - COMERCIO ATACADISTA DE PRODUTOS ALIMENTICIOS EM GERAL" }, { "key": "income_range", "status": "success", "sub_label": "Estimated Income Range", "message": "9240-13200" } ] } ``` ### Availability Income data may not always be available even for a valid, verified CPF. If a CPF passes the standard BR GOVT 1 check but no income data is available, the income verification endpoint returns `failure` statuses for the affected fields. --- - Path: `general-reference/ekyc-reference-canada` - URL: https://developer.incode.com/general-reference/ekyc-reference-canada/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-canada.md Canada eKYC verification matches submitted individual data against Canadian sources of truth. See the [eKYC API Reference](https://developer.incode.com/v1.1_shipweek/docs/ekyc-api-reference) for common response semantics that apply across all sources. ## Available sources | Source | API source string | Description | | ------------------------ | ----------------------------------- | ------------------------------------------------------------------------------------------------ | | CA RES CREDIT | `CA_RES_CREDIT` | Verifies submitted data against Canadian residential and credit records. | | CA Credit Bureau FINTRAC | `CA_CREDIT_FINTRAC` | Verifies submitted data against Canadian credit bureau records for FINTRAC compliance workflows. | ## CA RES CREDIT ### Request parameters | Parameter | Required | Description | | ------------- | --------- | ---------------------------------------------------------- | | `source` | Mandatory | Must be `CA_RES_CREDIT`. | | `country` | Mandatory | Must be `CA`. | | `firstName` | Mandatory | First name of the individual. | | `middleName` | Optional | Middle name of the individual. | | `surName` | Mandatory | Last name of the individual. | | `street` | Mandatory | Street name and house number. | | `city` | Mandatory | City of the individual's address (for example, `Toronto`). | | `state` | Mandatory | Province. | | `postalCode` | Mandatory | Postal code. | | `dateOfBirth` | Mandatory | Format: `yyyy-mm-dd`. | | `phone` | Optional | Phone number. | ### Response fields CA RES CREDIT anchors verification on the source-of-truth register. See the [eKYC API Reference](https://developer.incode.com/v1.1_shipweek/docs/ekyc-api-reference) for common match field definitions and status values. | Field | Statuses | Description | | ------------------ | --------------------------- | ----------------------------------------------------------------------------------------------------------- | | `firstNameMatch` | `exact`, `nomatch` | Matches first name submitted against the value in the source of truth. | | `middleNameMatch` | `exact`, `nomatch` | Matches middle name submitted against the value in the source of truth. | | `lastNameMatch` | `exact`, `nomatch` | Matches last name submitted against the value in the source of truth. | | `fullNameMatch` | `exact`, `nomatch` | Matches full name submitted against the value in the source of truth. | | `dobMatch` | `exact`, `nomatch` | Matches date of birth submitted against the value in the source of truth. | | `streetMatch` | `exact`, `nomatch` | Matches street submitted against the value in the source of truth. | | `cityMatch` | `exact`, `nomatch` | Matches city submitted against the value in the source of truth. | | `stateMatch` | `exact`, `nomatch` | Matches province submitted against the value in the source of truth. | | `postalCodeMatch` | `exact`, `nomatch` | Matches postal code submitted against the value in the source of truth. | | `fullAddressMatch` | `exact`, `fuzzy`, `nomatch` | Matches full address (street, city, state, postal code) submitted against the value in the source of truth. | | `phoneMatch` | `exact`, `nomatch` | Matches phone submitted against the value in the source of truth. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on the risk associated with the submitted full name, postal code, and date of birth: - `low` when `fullNameMatch`, `postalCodeMatch`, and `dobMatch` are all `exact`. - `high` when `fullNameMatch`, `postalCodeMatch`, and `dobMatch` are all `nomatch`. - `medium` for all other combinations. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ### Sample response ```json { "kyc": [ { "key": "firstNameMatch", "status": "exact" }, { "key": "middleNameMatch", "status": "exact" }, { "key": "lastNameMatch", "status": "nomatch" }, { "key": "fullNameMatch", "status": "nomatch" }, { "key": "dobMatch", "status": "exact" }, { "key": "streetMatch", "status": "exact" }, { "key": "cityMatch", "status": "exact" }, { "key": "stateMatch", "status": "exact" }, { "key": "postalCodeMatch", "status": "exact" }, { "key": "fullAddressMatch", "status": "fuzzy" }, { "key": "phoneMatch", "status": "nomatch" }, { "key": "overallLevel", "status": "medium" } ] } ``` ## CA Credit Bureau FINTRAC Canada eKYC non-doc verification leverages Canada's source of truth to validate individuals. It is essential in eKYC processes for ensuring identity authenticity, regulatory compliance, and enhanced security. It helps prevent fraud, boosts user trust, and streamlines operations through automated and efficient verification methods. eKYC module configuration gives various options to specify different search criteria with various sources of truth for each country (eg. US has multiple via Telco, Credit Bureau, and Driver's License). User data can be collected via a user input flow by using pre-selected fields where users can type in their name or date of birth, etc. See an example below: ### Module Configuration The [module configuration](/dashboard-platform-administration/ekyc-dashboard) can be leveraged to select the applicable fields for the input data you would like to collect from the end user. ### Direct API Approach All module configurations and user data can be forwarded directly in the request for performing an eKYC search. This will override existing configuration and data collected about the user. All endpoints require authentication headers to be specified as stated in [Incode API Documentation](https://developer.incode.com/reference/introduction) ### [**eKYC request**](https://developer.incode.com/reference/externalverificationekyb) **POST /omni/externalVerification/ekyc** This endpoint performs an eKYC check for the individual specified. Note: Endpoint can have empty body {} and in that case information will be pulled from module configuration and session details. - **country**: (mandatory) String. Two letter Alpha-2 country code. Must be CA. - **source**: (mandatory) String. Must be CA_RES_CREDIT or CA_CREDIT_FINTRAC. - **firstName:**: (mandatory) String. First name of the individual. - **surName**: (mandatory) String. Last name of the individual. - **middleName:**: (optional) String. - **street**: (mandatory) String. (Address = street + houseNo in CA) - **city**: (mandatory) String. City of the individual's address. (eg. Toronto). - **state**: (mandatory) String. - **postalCode**: (mandatory) String. postalCode formatted based on per-country postalCode basis. - **dateOfBirth**: (mandatory) String. Format: YYYY-MM-DD (eg. 1980-06-21) - **phone**: (mandatory) String. Example Incode requests: ```json { "plugins": ["kyc"], "source": "CA_RES_CREDIT", //mandatory "firstName": "Daniel", //mandatory "middleName": "", //optional     "surName": "Whitmore ", //mandatory     "street": "2799 Maplewood Crescent", //mandatory - houseNo + street     "city" : "Ottawa", //mandatory "state": "ON", // mandatory     "postalCode": "K1R7X5", //mandatory     "country": "CA", //mandatory     "dateOfBirth" : "1991-08-02", //mandatory "phone": "+12048900252", //mandatory } ``` ```json { "plugins": ["kyc"], "source": "CA_CREDIT_FINTRAC", "firstName": "John", "middleName": "", "surName": "Doe", "street": "97 Main St", "city" : "Ottawa", "state": "ON", "postalCode": "K1M1N8", "country": "CA", "dateOfBirth" : "1990-12-12", } ``` ### Direct API Response All endpoints require authentication headers to be specified as stated in [Incode API Documentation](https://developer.incode.com/reference/introduction) :::note Endpoint can have empty body {} and in that case information will be pulled from module configuration and session details. ::: Example Incode responses: ```json { "kyc": [ { "key": "firstNameMatch", "status": "Exact"; }, { "key": "middleNameMatch", "status": "Exact" }, { "key": "lastNameMatch", "status": "Approximate Match" }, { "key": "fullNameMatch", "status": "Fuzzy" }, { "key": "dobMatch", "status": "Exact" }, { "key": "streetMatch", "status": "Exact" }, { "key": "cityMatch", "status": "Exact" }, { "key": "stateMatch", "status": "Exact" }, { "key": "postalCodeMatch", "status": "Exact" }, { "key": "fullAddressMatch", "status": "Fuzzy" }, { "key": "phoneMatch", "status": "Match" }, { "key": "overallLevel", "status": "Low" } ] } ``` ```json { "kyc": [ { "key": "firstNameMatch", "status": "Exact"; }, { "key": "middleNameMatch", "status": "No Match" }, { "key": "lastNameMatch", "status": "Exact" }, { "key": "fullNameMatch", "status": "Exact" }, { "key": "dobMatch", "status": "Exact" }, { "key": "streetMatch", "status": "Exact" }, { "key": "cityMatch", "status": "Exact" }, { "key": "stateMatch", "status": "Exact" }, { "key": "postalCodeMatch", "status": "Exact" }, { "key": "fullAddressMatch", "status": "Exact" }, { "key": "overallLevel", "status": "Low" }, { "key": "creditFileNumber", "status": "123456789" }, { "key": "creditFileCreationDate", "status": "01-14-2000" } ] } ``` ### **eKYC error responses** Please refer to [error response](https://developer.incode.com/reference/introduction#api-responses) to see conventional HTTP response codes to indicate the success or failure of an API request. For Canada, custom 400 error messages if taxId, or country is “ “ or null: | Incode API Key | Status | Definition | |---|---|---| | firstNameMatch | exact, nomatch | Matches first name submitted against the name associated to the value in the source of truth. | | middleNameMatch | exact, nomatch | Matches middle name submitted against the name associated to the value in the source of truth. | | lastNameMatch | exact, nomatch | Matches last name submitted against the name associated to the value in the source of truth. | | fullNameMatch (first_name, last_name, middle_name) | exact, nomatch | Matches full name (first_name, last_name, middle_name) submitted against the full name associated to the value in the source of truth. | | dobMatch | exact, nomatch | Matches date of birth submitted against the date of birth associated to the value in the source of truth | | streetMatch | exact, nomatch | Matches street submitted against the street associated to the value in the source of truth (address1) | | cityMatch | exact, nomatch | Matches city submitted against the city associated to the value in the source of truth | | stateMatch | exact, nomatch | Matches state submitted against the state associated to the value in the source of truth | | postalCodeMatch | exact, nomatch | Matches postal code submitted against the postal code associated to the value in the source of truth | | fullAddressMatch (StreetMatch, cityMatch, stateMatch, postalCodeMatch) | exact, fuzzy, nomatch | Matches full address (street, city, state, zip) submitted against the full address associated to the value in the source of truth | | phoneMatch | exact, nomatch | Matches phone submitted against the phone associated to the value in the source of truth | | creditFileNumber | Integer | The credit file number of the individual.
          Note: This is only available if the credit file was created at least 3 years ago. For cases where the credit file was created 3 years ago or later, the response will be "_File created less than 3 years ago_". | | creditFileCreationDate | Date | Date when credit file was created.
          Note: This is only available if the credit file was created at least 3 years ago. For cases where the credit file was created 3 years ago or later, the response will be "_File created less than 3 years ago_". |
          ### overallLevel Overall Level is the API response key for the submitted name. The fields low, medium, and high are mapped to a proprietary fuzzy matching algorithm that is mapped to a score from 0 to 100. As a default, overallLevel will return: **low**: when fullNameMatch & postalCodeMatch & dobMatch are exact; **high**: when fullNameMatch & postalCodeMatch & dobMatch are nomatch; **medium**: for all otherwise combination. ### Single Session Dashboard Result --- - Path: `general-reference/ekyc-reference-chile` - URL: https://developer.incode.com/general-reference/ekyc-reference-chile/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-chile.md # Chile Chile eKYC verification matches submitted individual data against Chile's Official Census as the source of truth. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics that apply across all sources. ## Available sources | Source | API source string | Description | | ----------------------- | ----------------- | -------------------------------------------------------- | | Chile - Official Census | `CL_1` | Verifies submitted data against Chile's Official Census. | ## Chile - Official Census ### Request parameters | Parameter | Required | Description | | ------------- | --------- | ------------------------------------------------------------------------------------------- | | `source` | Mandatory | Must be `CL_1`. | | `country` | Mandatory | Must be `CL`. | | `idNum` | Mandatory | Chilean RUT (Rol Único Tributario). Eight digits plus a verification digit or the letter K. | | `firstName` | Mandatory | First name of the individual. | | `middleName` | Optional | Middle name of the individual. | | `surName` | Mandatory | Last name of the individual. | | `dateOfBirth` | Optional | Format: `yyyy-mm-dd`. | ### Response fields Chile - Official Census anchors verification on the source-of-truth register. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common match field definitions and status values. | Field | Statuses | Description | | ----------------- | ------------------------------------- | ------------------------------------------------------------------------- | | `firstNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches first name submitted against the value in the source of truth. | | `middleNameMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches middle name submitted against the value in the source of truth. | | `lastNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches last name submitted against the value in the source of truth. | | `fullNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches full name submitted against the value in the source of truth. | | `dobMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches date of birth submitted against the value in the source of truth. | | `idNumMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches RUT submitted against the value in the source of truth. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on the risk associated with the submitted full name and RUT: - `low` when `fullNameMatch` and `idNumMatch` are both `exact`. - `high` when `fullNameMatch` and `idNumMatch` are both `nomatch`. - `medium` for all other combinations. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ### Sample response ```json { "kyc": [ { "key": "firstNameMatch", "status": "exact" }, { "key": "middleNameMatch", "status": "exact" }, { "key": "lastNameMatch", "status": "fuzzy" }, { "key": "fullNameMatch", "status": "fuzzy" }, { "key": "dobMatch", "status": "exact" }, { "key": "idNumMatch", "status": "exact" }, { "key": "overallLevel", "status": "low" } ] } ```
          --- - Path: `general-reference/ekyc-reference-colombia` - URL: https://developer.incode.com/general-reference/ekyc-reference-colombia/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-colombia.md # Colombia Colombia eKYC verification matches submitted individual data against Colombian sources of truth. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics that apply across all sources. ## Available sources | Source | API source string | Description | | ------ | ----------------------------------- | -------------------------------------------------- | | CO 1 | | Verifies submitted data against Colombian records. | ## CO 1 Documentation for this source is forthcoming. Contact your Incode representative for details in the meantime. --- - Path: `general-reference/ekyc-reference-costa-rica` - URL: https://developer.incode.com/general-reference/ekyc-reference-costa-rica/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-costa-rica.md # Costa Rica Costa Rica eKYC verification matches submitted individual data against Costa Rican sources of truth. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics that apply across all sources. ## Available sources | Source | API source string | Description | | ------ | ----------------------------------- | ---------------------------------------------------- | | CR 1 | | Verifies submitted data against Costa Rican records. | ## CR 1 Documentation for this source is forthcoming. Contact your Incode representative for details in the meantime. --- - Path: `general-reference/ekyc-reference-greece` - URL: https://developer.incode.com/general-reference/ekyc-reference-greece/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-greece.md # Greece Greece eKYC verification matches submitted individual data against Greece's source of truth. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics that apply across all sources. ## Available sources | Source | API source string | Description | | ------ | ----------------- | --------------------------------------------------------- | | GR 1 | `GR_1` | Verifies submitted data against Greece's source of truth. | ## GR 1 ### Request parameters | Parameter | Required | Description | | ------------- | --------- | --------------------------------------------------------- | | `source` | Mandatory | Must be `GR_1`. | | `country` | Mandatory | Must be `GR`. | | `idNum` | Mandatory | Greek national ID. Nine digits, numeric only. | | `firstName` | Mandatory | First name of the individual. | | `middleName` | Optional | Middle name of the individual. | | `surName` | Mandatory | Last name of the individual. | | `houseNo` | Optional | House number. | | `street` | Optional | Street name. | | `city` | Mandatory | City of the individual's address (for example, `Athens`). | | `state` | Optional | State or region. | | `postalCode` | Optional | Postal code. | | `gender` | Optional | Accepted values are `m` or `f`. | | `dateOfBirth` | Optional | Format: `yyyy-mm-dd`. | | `phone` | Optional | Phone number. | ### Response fields GR 1 anchors verification on the source-of-truth register. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common match field definitions and status values. | Field | Statuses | Description | | ------------------ | ------------------------------------- | ----------------------------------------------------------------------------------- | | `firstNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches first name submitted against the value in the source of truth. | | `middleNameMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches middle name submitted against the value in the source of truth. | | `lastNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches last name submitted against the value in the source of truth. | | `fullNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches full name submitted against the value in the source of truth. | | `dobMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches date of birth submitted against the value in the source of truth. | | `streetMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches street and house number submitted against the value in the source of truth. | | `cityMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches city submitted against the value in the source of truth. | | `stateMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches state submitted against the value in the source of truth. | | `postalCodeMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches postal code submitted against the value in the source of truth. | | `fullAddressMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches full address submitted against the value in the source of truth. | | `idNumMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches national ID submitted against the value in the source of truth. | | `phoneMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches phone submitted against the value in the source of truth. | | `genderMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches gender submitted against the value in the source of truth. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on the risk associated with the submitted full name and national ID: - `low` when `fullNameMatch` and `idNumMatch` are both `exact`. - `high` when `fullNameMatch` and `idNumMatch` are both `nomatch`. - `medium` for all other combinations. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ### Sample response ```json { "kyc": [ { "key": "firstNameMatch", "status": "exact" }, { "key": "middleNameMatch", "status": "exact" }, { "key": "lastNameMatch", "status": "fuzzy" }, { "key": "fullNameMatch", "status": "fuzzy" }, { "key": "dobMatch", "status": "exact" }, { "key": "streetMatch", "status": "exact" }, { "key": "cityMatch", "status": "exact" }, { "key": "stateMatch", "status": "exact" }, { "key": "postalCodeMatch", "status": "exact" }, { "key": "fullAddressMatch", "status": "fuzzy" }, { "key": "idNumMatch", "status": "exact" }, { "key": "phoneMatch", "status": "nomatch" }, { "key": "overallLevel", "status": "low" } ] } ```
          --- - Path: `general-reference/ekyc-reference-guatemala` - URL: https://developer.incode.com/general-reference/ekyc-reference-guatemala/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-guatemala.md # Guatemala Guatemala eKYC verification matches submitted individual data against Guatemala's source of truth. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics that apply across all sources. ## Available sources | Source | API source string | Description | | ------ | ----------------- | ------------------------------------------------------------------------------------ | | GT 1 | `GT_1` | Verifies submitted data against Guatemalan records associated with the provided DPI. | ## GT 1 ### Request parameters | Parameter | Required | Description | | ------------- | --------- | --------------------------------------------------------------------------------------------------------------- | | `source` | Mandatory | Must be `GT_1`. | | `country` | Mandatory | Must be `GT`. | | `idNum` | Mandatory | Guatemalan DPI (Documento Personal de Identificación). Thirteen digits, typically written as `XXXX XXXXX XXXX`. | | `dateOfBirth` | Mandatory | Format: `yyyy-mm-dd`. | | `firstName` | Optional | First name (and often Segundo nombre) of the individual. | | `surName` | Optional | Last name (and often Segundo apellido) of the individual. | ### Response fields GT 1 anchors verification on the source-of-truth register. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common match field definitions and status values. GT 1 uses `approximatematch` as an alternative to `fuzzy` for name fields. | Field | Statuses | Description | | ---------------- | -------------------------------------- | ------------------------------------------------------------------------- | | `firstNameMatch` | `exact`, `approximatematch`, `nomatch` | Matches first name submitted against the value in the source of truth. | | `lastNameMatch` | `exact`, `approximatematch`, `nomatch` | Matches last name submitted against the value in the source of truth. | | `fullNameMatch` | `exact`, `approximatematch`, `nomatch` | Matches full name submitted against the value in the source of truth. | | `dobMatch` | `exact`, `fuzzy`, `nomatch` | Matches date of birth submitted against the value in the source of truth. | | `idNumMatch` | `exact`, `fuzzy`, `nomatch` | Matches DPI submitted against the value in the source of truth. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on the risk associated with the submitted full name and DPI: - `low` when `fullNameMatch` and `idNumMatch` are both `exact`. - `high` when `fullNameMatch` and `idNumMatch` are both `nomatch`. - `medium` for all other combinations. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ### Sample response ```json { "kyc": [ { "key": "firstNameMatch", "status": "exact" }, { "key": "lastNameMatch", "status": "approximatematch" }, { "key": "fullNameMatch", "status": "approximatematch" }, { "key": "dobMatch", "status": "exact" }, { "key": "idNumMatch", "status": "exact" }, { "key": "overallLevel", "status": "low" } ] } ```
          --- - Path: `general-reference/ekyc-reference-india` - URL: https://developer.incode.com/general-reference/ekyc-reference-india/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-india.md # India India eKYC verification matches submitted individual data against an Indian government source of truth. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics that apply across all sources. ## Available sources | Source | API source string | Description | | --------- | ----------------- | ---------------------------------------------- | | India DMV | `IN_DMV` | Verifies submitted driver's license details. | ## India DMV ### Request parameters | Parameter | Required | Description | | ------------- | --------- | ------------------------------------------------------------------------------------------------- | | `source` | Mandatory | Must be `IN_DMV`. | | `country` | Mandatory | Must be `IN`. `countryCode` takes priority over `country` if both are provided. | | `firstName` | Mandatory | First name of the individual. Must not contain digits. | | `surName` | Mandatory | Last name of the individual. Must not contain digits. | | `middleName` | Optional | Middle name of the individual. Must not contain digits. | | `dateOfBirth` | Mandatory | Date of birth. Format: `YYYY-MM-DD` (for example, `1991-08-02`). | | `idNumber` | Mandatory | Driving license number (for example, `SS-RRRR-YYYY-NNNNNNN`). | | `street` | Optional | House number and street name of the individual's address. | | `city` | Optional | City of the individual's address (for example, `Bengaluru`). | | `state` | Optional | State of the individual's address (for example, `Karnataka`). | | `postalCode` | Optional | PIN code. Must be exactly 6 digits (for example, `560001`). | | `gender` | Optional | Accepted values are `m` or `f`. | The endpoint can accept an empty body (`{}`), in which case information is pulled from module configuration and session details. ### Sample request ```json { "plugins": ["kyc"], "source": "IN_DMV", "country": "IN", "firstName": "Rahul", "middleName": "Kumar", "surName": "Sharma", "dateOfBirth": "1991-08-02", "idNumber": "DL0420110123456", "street": "24 MG Road", "city": "Bengaluru", "state": "Karnataka", "postalCode": "560001", "gender": "m" } ``` ### Sample response ```json { "kyc": [ { "key": "firstNameMatch", "status": "exact" }, { "key": "middleNameMatch", "status": "exact" }, { "key": "lastNameMatch", "status": "exact" }, { "key": "fullNameMatch", "status": "exact" }, { "key": "dobMatch", "status": "exact" }, { "key": "idNumMatch", "status": "exact" }, { "key": "streetMatch", "status": "exact" }, { "key": "cityMatch", "status": "exact" }, { "key": "stateMatch", "status": "exact" }, { "key": "postalCodeMatch", "status": "exact" }, { "key": "fullAddressMatch", "status": "exact" }, { "key": "genderMatch", "status": "nomatch" }, { "key": "overallLevel", "status": "low" } ] } ``` ### Response fields | Field | Statuses | Description | | ------------------ | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | | `firstNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches first name submitted against the value in the source of truth. | | `middleNameMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches middle name submitted against the value in the source of truth. | | `lastNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches last name submitted against the value in the source of truth. | | `fullNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches full name (first, middle, last) submitted against the full name in the source of truth. | | `dobMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches date of birth submitted against the value in the source of truth. | | `idNumMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches driving license number submitted against the value in the source of truth. | | `streetMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches street submitted against the value in the source of truth. | | `cityMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches city submitted against the value in the source of truth. | | `stateMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches state submitted against the value in the source of truth. | | `postalCodeMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches postal code submitted against the value in the source of truth. | | `fullAddressMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches full address (street, city, state, postal code) submitted against the full address in the source of truth. | | `genderMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches gender submitted against the value in the source of truth. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level based on submitted full name, date of birth, and driving license number. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on the submitted full name, date of birth, and driving license number: - `low` when `fullNameMatch`, `dobMatch`, and `idNumMatch` are all `exact`. - `high` when `fullNameMatch`, `dobMatch`, OR `idNumMatch` are `nomatch`. - `medium` for all other combinations. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ### Error responses See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for standard HTTP response codes and error handling conventions. ## Single Session Dashboard results Verification results for individual sessions are available in the [Single Session view](/dashboard-platform-administration/single-session-view/) in Dashboard. --- - Path: `general-reference/ekyc-reference-mexico` - URL: https://developer.incode.com/general-reference/ekyc-reference-mexico/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-mexico.md # Mexico Mexico eKYC verification uses phone and email risk-scoring rather than source-of-truth identity matching. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics. ## Available sources | Source | API source string | Description | | ------------- | ----------------- | ------------------------------------------------------------------------------------------------------- | | MX CONSUMER 1 | `MX_Consumer_1` | Returns risk scores for phone and email based on third-party data, and an aggregate overall risk level. | ## MX CONSUMER 1 MX CONSUMER 1 combines phone and email risk-scoring from third-party providers: - **Phone** returns a risk score based on account history, prepaid status, account duration, and monthly bill amount. - **Email** returns a predictive risk score based on historical transaction data and behavior patterns. The request works with only phone or only email supplied. If both are provided, the response includes both individual scores and an aggregate overall risk level. ### Request parameters | Parameter | Required | Description | | ----------------- | ----------- | ------------------------------------------------------------------------- | | `source` | Mandatory | Must be `MX_Consumer_1`. | | `country` | Mandatory | Must be `MX`. | | `phone` | Conditional | Phone number in E.164 format. Either `phone` or `email` must be provided. | | `email` | Conditional | Email address. Either `phone` or `email` must be provided. | | `firstName` | Optional | First name of the individual, including middle name if applicable. | | `surName` | Optional | Last name of the individual. | | `maternalSurname` | Optional | Maternal surname. | ### Response fields | Field | Statuses | Description | | -------------- | ------------------------------------ | ---------------------------------------------------------- | | `phoneLevel` | `low`, `medium`, `high`, `very_high` | Risk level associated with the submitted phone number. | | `phoneCarrier` | String | Phone carrier associated with the submitted phone number. | | `emailLevel` | `low`, `medium`, `high`, `very_high` | Risk level associated with the submitted email address. | | `overallLevel` | `low`, `medium`, `high`, `very_high` | Aggregate risk level combining the phone and email scores. | ### Sample response ```json { "kyc": [ { "key": "phoneLevel", "status": "low" }, { "key": "phoneCarrier", "status": "Verizon" }, { "key": "emailLevel", "status": "low" }, { "key": "overallLevel", "status": "low" } ] } ```
          --- - Path: `general-reference/ekyc-reference-nigeria` - URL: https://developer.incode.com/general-reference/ekyc-reference-nigeria/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-nigeria.md # Nigeria Nigeria eKYC verification matches submitted individual data against Nigerian sources of truth. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics that apply across all sources. ## Available sources | Source | API source string | Description | | ----------- | ----------------------------------- | -------------------------------------------------------------------------------------- | | NG MONO BVN | | Verifies submitted data against Nigerian BVN (Bank Verification Number) records. | | NG MONO NIN | | Verifies submitted data against Nigerian NIN (National Identification Number) records. | ## NG MONO BVN Documentation for this source is forthcoming. Contact your Incode representative for details in the meantime. ## NG MONO NIN Documentation for this source is forthcoming. Contact your Incode representative for details in the meantime. --- - Path: `general-reference/ekyc-reference-philippines` - URL: https://developer.incode.com/general-reference/ekyc-reference-philippines/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-philippines.md Philippines eKYC non-doc verification leverages the Philippines' sources of truth to validate individuals. It is essential in eKYC processes for ensuring identity authenticity, regulatory compliance, and enhanced security. It helps prevent fraud, boosts user trust, and streamlines operations through automated and efficient verification methods. ## Integration ### User input flow eKYC module configuration gives various options to specify different search criteria with various sources of truth for each country (e.g. Philippines has a sequenced/waterfall source that looks for matches through 2 data sources: Philippines Residential and Philippines Credit Bureau). User data can be collected via a user input flow by using pre-selected fields where users can type in their name, date of birth, etc. See an example below:
          ### Module configuration The module configuration can be leveraged to select the applicable fields for the input data you would like to collect from the end user.

          _eKYC Module configuration_ ### Direct API Approach All module configurations and user data can be forwarded directly in the request for performing an eKYC search. This will override existing configuration and data collected about the user. #### **API Authentication** All endpoints require authentication headers to be specified as stated in [Incode API Documentation](https://developer.incode.com/reference/introduction) #### eKYC request **POST /omni/externalVerification/ekyc** This endpoint performs an eKYC check for the individual specified. Note: Endpoint can have empty body `{}` and in that case information will be pulled from module configuration and session details. - **country**: (mandatory) String. Two letter Alpha-2 country code. Must be `PH`. Note: `countryCode` takes priority over `country` if both are provided. - **source**: (mandatory) String. Must be `PH_RES_CREDIT`. - **firstName**: (mandatory) String. First name of the individual. Must not contain digits. - **surName**: (mandatory) String. Last name of the individual. Must not contain digits. - **middleName**: (optional) String. Must not contain digits. - **dateOfBirth**: (mandatory) String. Format: `YYYY-MM-DD` (e.g. `1970-12-12`). - **street**: (optional) String. House number and street name of the address. - **district**: (optional) String. Barangay or district of the address. - **city**: (optional) String. City of the individual's address (e.g. `Quezon City`). - **state**: (optional) String. Province or region (e.g. `Metro Manila (NCR)`). - **postalCode**: (optional) String. Must be exactly 4 digits (e.g. `1100`). - **idNumber**: (optional) String. National ID number. Must be provided together with `idType`. Supported types below. - **idType**: (optional) String. Must be one of `SSS`, `TIN`, or `GSIS`. Must be provided together with `idNumber`. **Supported ID types:** | ID Type | Description | Format | | ------- | ------------------------------------------ | ------------------------------------------------------------------------------------------ | | `TIN` | Tax Identification Number | 9 digits (`123456789` or `123-456-789`) or 12 digits (`123456789000` or `123-456-789-000`) | | `SSS` | Social Security System Number | 10 digits with hyphens (`12-3456789-0`) | | `GSIS` | Government Service Insurance System Number | Exactly 12 digits (`123456789012`) | Example Incode request: ```json { "plugins": ["kyc"], "source": "PH_RES_CREDIT", "firstName": "Maria", "middleName": "Santos", "surName": "Cruz", "street": "123 Rizal Street", "district": "Tangil", "city": "Quezon City", "state": "Metro Manila (NCR)", "postalCode": "1100", "country": "PH", "dateOfBirth": "1970-12-12", "idNumber": "123456789012", "idType": "GSIS" } ``` ### Direct API Response #### **API Authentication** All endpoints require authentication headers to be specified as stated in [Incode API Documentation](https://developer.incode.com/reference/introduction) Note: Endpoint can have empty body `{}` and in that case information will be pulled from module configuration and session details. Example Incode response: ```json { "kyc": [ { "key": "firstNameMatch", "status": "exact" }, { "key": "middleNameMatch", "status": "nomatch" }, { "key": "lastNameMatch", "status": "exact" }, { "key": "fullNameMatch", "status": "exact" }, { "key": "dobMatch", "status": "exact" }, { "key": "streetMatch", "status": "exact" }, { "key": "districtMatch", "status": "exact" }, { "key": "cityMatch", "status": "exact" }, { "key": "stateMatch", "status": "exact" }, { "key": "postalCodeMatch", "status": "exact" }, { "key": "fullAddressMatch", "status": "exact" }, { "key": "idNumberMatch", "status": "nomatch" }, { "key": "overallLevel", "status": "low" } ] } ``` #### eKYC error responses Please refer to [error response](https://developer.incode.com/reference/introduction#api-responses) to see conventional HTTP response codes to indicate the success or failure of an API request. For Philippines, custom 400 error messages if required fields are missing or incorrectly formatted: | Incode API Key | Status | Definition | | ------------------------------------------------------------------------------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | firstNameMatch | exact, nomatch | Matches first name submitted against the name associated to the value in the source of truth. | | middleNameMatch | exact, nomatch | Matches middle name submitted against the name associated to the value in the source of truth. | | lastNameMatch | exact, nomatch | Matches last name submitted against the name associated to the value in the source of truth. | | fullNameMatch (firstName, surName, middleName) | exact, nomatch | Matches full name (firstName, surName, middleName) submitted against the full name associated to the value in the source of truth. | | dobMatch | exact, nomatch | Matches date of birth submitted against the date of birth associated to the value in the source of truth. | | streetMatch | exact, nomatch | Matches street submitted against the street associated to the value in the source of truth. | | districtMatch | exact, nomatch | Matches district/Barangay submitted against the district associated to the value in the source of truth. New field for Philippines. | | cityMatch | exact, nomatch | Matches city submitted against the city associated to the value in the source of truth. | | stateMatch | exact, nomatch | Matches state/province submitted against the state associated to the value in the source of truth. | | postalCodeMatch | exact, nomatch | Matches postal code submitted against the postal code associated to the value in the source of truth. | | fullAddressMatch (streetMatch, districtMatch, cityMatch, stateMatch, postalCodeMatch) | exact, fuzzy, nomatch | Matches full address (street, district, city, state, postalCode) submitted against the full address associated to the value in the source of truth. | | idNumberMatch | exact, nomatch | Matches national ID number submitted against the ID number associated to the value in the source of truth. | | overallLevel | low, medium, high | Overall Risk Level is focused on the risk associated to the submitted full name and date of birth. See context below for more information around how low, medium, and high are calculated. | #### overallLevel Overall Level is the API response key for the submitted name. The fields low, medium, and high are mapped to the result of the identity verification check. As a default, overallLevel will return: **low**: when fullNameMatch & dobMatch are exact; **high**: when fullNameMatch OR dobMatch are nomatch; **medium**: for all otherwise combinations. ### Single Session Dashboard Result
          --- - Path: `general-reference/ekyc-reference-spain` - URL: https://developer.incode.com/general-reference/ekyc-reference-spain/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-spain.md # Spain Spain eKYC verification matches submitted individual data against Spain's Utility - Phone Register as the source of truth. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics that apply across all sources. ## Available sources | Source | API source string | Description | | ---------------------- | ----------------- | ----------------------------------------------------------------- | | Spain Phone Register 2 | `ES_1` | Verifies submitted data against Spain's Utility - Phone Register. | ## Spain Phone Register 2 ### Request parameters | Parameter | Required | Description | | ------------- | --------- | ------------------------------------------------------------------- | | `source` | Mandatory | Must be `ES_1`. | | `country` | Mandatory | Must be `ES`. | | `taxID` | Mandatory | Spanish DNI. Nine characters: eight digits followed by a letter. | | `firstName` | Mandatory | First name of the individual. | | `surName` | Mandatory | Last name (Apellido2, mother's last name). | | `middleName` | Optional | Apellido1 (father's last name). | | `houseNo` | Optional | House or building number. | | `street` | Optional | Street name. | | `city` | Optional | City of the individual's address (for example, `Madrid`). | | `state` | Optional | State or autonomous community (for example, `Comunidad de Madrid`). | | `postalCode` | Optional | Postal code. | | `dateOfBirth` | Optional | Format: `yyyy-mm-dd`. | | `phone` | Optional | Phone number. | ### Response fields Spain Phone Register 2 anchors verification on the source-of-truth register. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common match field definitions and status values. | Field | Statuses | Description | | -------------------- | ------------------------------------- | ----------------------------------------------------------------------------------- | | `firstNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches first name submitted against the value in the source of truth. | | `middleNameMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches middle name submitted against the value in the source of truth. | | `lastNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches last name submitted against the value in the source of truth. | | `fullNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches full name submitted against the value in the source of truth. | | `dobMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches date of birth submitted against the value in the source of truth. | | `streetMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches street submitted against the value in the source of truth. | | `houseNoMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches house number submitted against the value in the source of truth. | | `streetAddressMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches street and house number submitted against the value in the source of truth. | | `cityMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches city submitted against the value in the source of truth. | | `stateMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches state submitted against the value in the source of truth. | | `postalCodeMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches postal code submitted against the value in the source of truth. | | `fullAddressMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches full address submitted against the value in the source of truth. | | `idNumMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches DNI submitted against the value in the source of truth. | | `phoneMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches phone submitted against the value in the source of truth. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on the risk associated with the submitted full name and DNI: - `low` when `fullNameMatch` and `idNumMatch` are both `exact`. - `high` when `fullNameMatch` and `idNumMatch` are both `nomatch`. - `medium` for all other combinations. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ### Sample response ```json { "kyc": [ { "key": "firstNameMatch", "status": "exact" }, { "key": "middleNameMatch", "status": "exact" }, { "key": "lastNameMatch", "status": "fuzzy" }, { "key": "fullNameMatch", "status": "fuzzy" }, { "key": "dobMatch", "status": "exact" }, { "key": "streetMatch", "status": "exact" }, { "key": "cityMatch", "status": "exact" }, { "key": "stateMatch", "status": "exact" }, { "key": "postalCodeMatch", "status": "exact" }, { "key": "fullAddressMatch", "status": "fuzzy" }, { "key": "idNumMatch", "status": "exact" }, { "key": "phoneMatch", "status": "nomatch" }, { "key": "overallLevel", "status": "low" } ] } ```
          --- - Path: `general-reference/ekyc-reference-sweden` - URL: https://developer.incode.com/general-reference/ekyc-reference-sweden/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-sweden.md # Sweden Sweden eKYC verification matches submitted individual data against Sweden's source of truth. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics that apply across all sources. ## Available sources | Source | API source string | Description | | ------ | ----------------- | --------------------------------------------------------- | | SE 1 | `SE_1` | Verifies submitted data against Sweden's source of truth. | ## SE 1 ### Request parameters | Parameter | Required | Description | | ------------- | --------- | --------------------------------------------------------------------- | | `source` | Mandatory | Must be `SE_1`. | | `country` | Mandatory | Must be `SE`. | | `idNumber` | Mandatory | Swedish personnummer. Ten characters in the most common short format. | | `firstName` | Mandatory | First name of the individual. | | `surName` | Mandatory | Last name of the individual. | | `street` | Mandatory | Street name and house number. | | `city` | Mandatory | City of the individual's address (for example, `Stockholm`). | | `postalCode` | Optional | Postal code. Always five digits, typically written with a space. | | `dateOfBirth` | Optional | Format: `yyyy-mm-dd`. | | `phone` | Optional | Phone number. | ### Response fields SE 1 anchors verification on the source-of-truth register. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common match field definitions and status values. | Field | Statuses | Description | | -------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------- | | `firstNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches first name submitted against the value in the source of truth. | | `lastNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches last name submitted against the value in the source of truth. | | `fullNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches full name (first and last) submitted against the value in the source of truth. | | `dobMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches date of birth submitted against the value in the source of truth. | | `streetAddressMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches street and house number submitted against the value in the source of truth. | | `cityMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches city submitted against the value in the source of truth. | | `postalCodeMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches postal code submitted against the value in the source of truth. | | `fullAddressMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches full address (street, city, postal code) submitted against the value in the source of truth. | | `idNumMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches personnummer submitted against the value in the source of truth. | | `phoneMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches phone submitted against the value in the source of truth. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on the risk associated with the submitted full name and personnummer: - `low` when `fullNameMatch` and `idNumMatch` are both `exact`. - `high` when `fullNameMatch` and `idNumMatch` are both `nomatch`. - `medium` for all other combinations. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ### Sample response ```json { "kyc": [ { "key": "firstNameMatch", "status": "exact" }, { "key": "lastNameMatch", "status": "fuzzy" }, { "key": "fullNameMatch", "status": "fuzzy" }, { "key": "dobMatch", "status": "exact" }, { "key": "streetAddressMatch", "status": "exact" }, { "key": "cityMatch", "status": "exact" }, { "key": "postalCodeMatch", "status": "exact" }, { "key": "fullAddressMatch", "status": "fuzzy" }, { "key": "idNumMatch", "status": "exact" }, { "key": "phoneMatch", "status": "exact" }, { "key": "overallLevel", "status": "low" } ] } ```
          --- - Path: `general-reference/ekyc-reference-united-kingdom` - URL: https://developer.incode.com/general-reference/ekyc-reference-united-kingdom/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-united-kingdom.md # United Kingdom United Kingdom eKYC verification matches submitted individual data against UK sources of truth. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics that apply across all sources. ## Available sources | Source | API source string | Description | | ------------------ | ----------------------------------- | -------------------------------------------------------------------- | | UK VOTER REGISTER | `UK_Voter_Register` | Verifies submitted data against the United Kingdom's Voter Register. | | UK CREDIT BUREAU 1 | | Verifies submitted data against UK credit bureau records. | ## UK VOTER REGISTER ### Request parameters | Parameter | Required | Description | | ------------- | --------- | -------------------------------------------------------------------------------------- | | `source` | Mandatory | Must be `UK_Voter_Register`. | | `country` | Mandatory | Must be `GB`. | | `firstName` | Mandatory | First name of the individual. | | `middleName` | Optional | Middle name of the individual. | | `surName` | Mandatory | Last name of the individual. | | `street` | Optional | Street name and house number. | | `city` | Optional | City of the individual's address. | | `postalCode` | Optional | Postal code. Five to seven characters, letters and digits only, no special characters. | | `dateOfBirth` | Optional | Format: `yyyy-mm-dd`. | | `phone` | Optional | Phone number. Ten or eleven digits, most commonly eleven. | | `gender` | Optional | Accepted values are `M` or `F`. | ### Response fields UK VOTER REGISTER anchors verification on the source-of-truth register. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common match field definitions and status values. | Field | Statuses | Description | | ----------------- | -------------------------------------- | ------------------------------------------------------------------------- | | `firstNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches first name submitted against the value in the source of truth. | | `middleNameMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches middle name submitted against the value in the source of truth. | | `lastNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches last name submitted against the value in the source of truth. | | `fullNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches full name submitted against the value in the source of truth. | | `dobMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches date of birth submitted against the value in the source of truth. | | `genderMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches gender submitted against the value in the source of truth. | | `streetMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches street submitted against the value in the source of truth. | | `cityMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches city submitted against the value in the source of truth. | | `zipcodeMatch` | `exact`, `nomatch`, `unknown` | Matches postal code submitted against the value in the source of truth. | | `addressMatch` | `exact`, `fuzzy`, `nomatch` | Matches full address submitted against the value in the source of truth. | | `phoneMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches phone submitted against the value in the source of truth. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on the risk associated with the submitted full name and address: - `low` when `fullNameMatch` is a match AND (`addressMatch` is a match OR `addressMatch` is `fuzzy`). - `high` when `fullNameMatch` and `addressMatch` are both `nomatch`. - `medium` for all other combinations. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ### Sample response ```json { "kyc": [ { "key": "firstNameMatch", "status": "exact" }, { "key": "middleNameMatch", "status": "exact" }, { "key": "lastNameMatch", "status": "fuzzy" }, { "key": "fullNameMatch", "status": "fuzzy" }, { "key": "dobMatch", "status": "exact" }, { "key": "genderMatch", "status": "exact" }, { "key": "phoneMatch", "status": "exact" }, { "key": "streetMatch", "status": "exact" }, { "key": "cityMatch", "status": "exact" }, { "key": "zipcodeMatch", "status": "exact" }, { "key": "addressMatch", "status": "exact" }, { "key": "overallLevel", "status": "low" } ] } ``` ## UK CREDIT BUREAU 1 Documentation for this source is forthcoming. Contact your Incode representative for details in the meantime. --- - Path: `general-reference/ekyc-reference-united-states` - URL: https://developer.incode.com/general-reference/ekyc-reference-united-states/ - Markdown: https://developer.incode.com/general-reference/ekyc-reference-united-states.md # United States United States eKYC verification supports multiple sources of truth, including telco databases, credit bureau records, USPS-verified address data, and state driver's license records. Because the response schema and calculation logic differ meaningfully between US sources, each source is documented separately below. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common response semantics that apply across all sources. ## Available sources | Source | API source string | Description | | -------------------- | ---------------------- | ------------------------------------------------------------------------------------------------ | | US TELCO 1 | `US_TELCO_1` | Verifies submitted data against telco records associated with the provided phone number. | | US TELCO 2 | `US_TELCO_2` | Verifies submitted data against telco records associated with the provided phone number. | | US TELCO 4 | `US_TELCO_4` | Verifies submitted data against telco records associated with the provided phone number. | | US TELCO 5 | `US_TELCO_5` | Verifies submitted data against telco records associated with the provided phone number. | | US CREDIT BUREAU 1 | `US_CREDIT_BUREAU_1` | Verifies submitted data against credit bureau records associated with the provided tax ID (SSN). | | US CREDIT BUREAU 3 | `US_CREDIT_BUREAU_3` | Verifies submitted data against credit bureau records. | | US CREDIT TELCO | `US_CREDIT_TELCO` | Verifies submitted data against combined credit bureau and telco records. | | US ADDRESS 1 | `US_Address_1` | Verifies submitted data against USPS-verified address records. | | US DRIVERS LICENSE 1 | `US_DRIVERS_LICENSE_1` | Verifies submitted driver's license details against state driver's license records. | ## US TELCO 1 ### Request parameters | Parameter | Required | Description | | ------------- | --------- | ----------------------------------------------------------- | | `source` | Mandatory | Must be `US_TELCO_1`. | | `country` | Mandatory | Must be `US`. | | `phone` | Mandatory | Phone number in E.164 format (for example, `+14081234567`). | | `firstName` | Mandatory | First name of the individual. | | `surName` | Mandatory | Last name of the individual. | | `street` | Optional | Full street including house number and apartment number. | | `city` | Optional | City of the individual's address. | | `state` | Optional | Two-letter state code. | | `postalCode` | Optional | Postal code. | | `dateOfBirth` | Optional | Format: `yyyy-mm-dd`. | | `email` | Optional | Email address. | | `dlNumber` | Optional | Driver's license number. | | `dlState` | Optional | Two-letter driver's license state. | | `last4SSN` | Optional | Last four digits of SSN. | ### Response fields US TELCO 1 anchors verification on the phone number. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common status values. | Field | Statuses | Description | | ------------------- | --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `phoneNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches name submitted against the name associated with the phone in the source of truth. | | `phoneAddressMatch` | `exact`, `fuzzy`, `nomatch` | Matches address submitted against the address associated with the phone in the source of truth. | | `phoneCityMatch` | `exact`, `nomatch` | Matches city submitted against the city associated with the phone in the source of truth. | | `phoneStateMatch` | `exact`, `nomatch` | Matches state submitted against the state associated with the phone in the source of truth. | | `phoneZipcodeMatch` | `exact`, `nomatch` | Matches zip code submitted against the zip code associated with the phone in the source of truth. | | `phoneDobMatch` | `exact`, `nomatch` | Matches date of birth submitted against the date of birth associated with the phone. | | `phoneEmailMatch` | `exact`, `nomatch` | Matches email submitted against the email associated with the phone in the source of truth. | | `dlNumberCheck` | `exact`, `nomatch` | Matches driver's license number submitted against the number associated with the phone. | | `dlStateCheck` | `exact`, `nomatch` | Matches driver's license state submitted against the state associated with the phone. | | `nameRiskLevel` | `low`, `medium`, `high` | Risk level associated with the submitted name. | | `addressRiskLevel` | `low`, `medium`, `high` | Risk level associated with the submitted address, independent of address matching.
          | | `phoneLevel` | `low`, `medium`, `high` | Risk level associated with the submitted phone. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on `phoneNameMatch` and `phoneAddressMatch`: - `low` when `phoneNameMatch` and `phoneAddressMatch` are both `exact`. - `medium` when any of the following apply: - `phoneNameMatch` is `exact` AND `phoneAddressMatch` is `fuzzy` or `nomatch`. - `phoneNameMatch` is `nomatch` AND `phoneAddressMatch` is `fuzzy`. - `phoneNameMatch` is `fuzzy` AND `phoneAddressMatch` is `fuzzy`. - `high` when `phoneNameMatch` and `phoneAddressMatch` are both `nomatch`. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ### Risk level calculations `nameRiskLevel` and `addressRiskLevel` are calculated from proprietary matching algorithms scored 0-100: - `low`: score is 70-100. - `medium`: score is 30-69. - `high`: score is less than 30. ## US TELCO 2 ### Request parameters | Parameter | Required | Description | | ------------- | --------- | ---------------------------------------------------------------------- | | `source` | Mandatory | Must be `US_TELCO_2`. | | `countryCode` | Mandatory | Must be `US`. | | `phone` | Mandatory | Phone number in E.164 format (for example, `+14081234567`). | | `firstName` | Optional | First name of the individual. | | `surName` | Optional | Last name of the individual. This source does not process middle name. | | `street` | Optional | Full street including house number and apartment number. | | `city` | Optional | City of the individual's address. | | `state` | Optional | Two-letter state code. | | `postalCode` | Optional | Postal code. | | `dateOfBirth` | Optional | Format: `yyyy-mm-dd`. | ### Response fields US TELCO 2 anchors verification on the phone number. | Field | Statuses | Description | | ------------------- | -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | `phoneMatch` | `exact`, `nomatch` | Whether the phone number exists in the source of truth. | | `phoneNameMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches name submitted against the name associated with the phone. Does not account for middle name. | | `phoneAddressMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches address submitted against the address associated with the phone. | | `phoneCityMatch` | `exact`, `nomatch`, `unknown` | Matches city submitted against the city associated with the phone. | | `phoneStateMatch` | `exact`, `nomatch`, `unknown` | Matches state submitted against the state associated with the phone. | | `phoneZipcodeMatch` | `exact`, `nomatch`, `unknown` | Matches zip code submitted against the zip code associated with the phone. | | `phoneDobMatch` | `exact`, `nomatch` | Matches date of birth submitted against the date of birth associated with the phone. `nomatch` includes cases where no DOB information was available. | | `phoneCarrier` | String | Phone carrier associated with the submitted phone number. | | `phoneLineType` | String | Type of phone line (for example, `Mobile`). | | `phoneLevel` | `low`, `medium`, `high`, `very_high` | Risk level associated with the submitted phone. | | `addressRiskLevel` | `low`, `medium`, `high`, `very_high` | Risk level associated with the submitted address, independent of address matching. | | `overallLevel` | `low`, `medium`, `high`, `very_high` | Overall risk level, customizable per customer requirements. | ### phoneNameMatch calculation `phoneNameMatch` uses a proprietary matching algorithm scored from -1 to 100. Does not account for middle name. - `unknown`: score is -1. - `nomatch`: score is 0-29. - `fuzzy`: score is 30-99. - `exact`: score is 100. ### phoneAddressMatch calculation `phoneAddressMatch` uses a proprietary matching algorithm scored from -1 to 100. - `unknown`: score is -1. - `nomatch`: score is 0-29. - `fuzzy`: score is 30-69. - `exact`: score is 70-100. The default exact threshold is 70 to account for slight variations in input such as apartment or house number. ### phoneLevel calculation `phoneLevel` is calculated from a phone risk score (0-1000, with 1000 as highest risk): - `low`: score is 500 or less. - `medium`: score is 501-800. - `high`: score is 801-900. - `very_high`: score is 901 or greater. ### addressRiskLevel calculation `addressRiskLevel` is a signal based on address validity, USPS deliverability, commercial vs. residential classification, and a Lob-based confidence score. - `low`: The address is valid, over 70% of Lob mailpieces to this address were delivered successfully, recent mailings were successful, and the address is USPS-deliverable (or deliverable to the building's default address but missing secondary unit information). - `medium`: The address is valid, but either no tracking data exists, or between 40% and 70% of Lob mailpieces were delivered successfully. - `high`: The address is valid, but less than 40% of Lob mailpieces were delivered successfully and recent mailings were not successful. - `very_high`: The address is not valid and not deliverable by USPS. ## US TELCO 4 ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ---------------------------------------------------------------------- | | `source` | Mandatory | Must be `US_TELCO_4`. | | `countryCode` | Mandatory | Must be `US`. | | `phone` | Mandatory | Phone number in E.164 format (for example, `+14081234567`). | | `firstName` | Optional | First name of the individual. | | `surName` | Optional | Last name of the individual. This source does not process middle name. | | `street` | Optional | Full street including house number and apartment number. | | `city` | Optional | City of the individual's address. | | `state` | Optional | Two-letter state code. | | `postalCode` | Optional | Postal code. | | `dateOfBirth` | Optional | Format: `yyyy-mm-dd`. | | `emailAddress` | Optional | Email address. | ### Response fields US TELCO 4 anchors verification on the phone number. It returns match fields at both the aggregate (`phoneNameMatch`, `phoneAddressMatch`) and component (`phoneFirstNameMatch`, `phoneLastNameMatch`, `phoneStreetMatch`) levels. | Field | Statuses | Description | | --------------------- | -------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `phoneMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Whether the phone number exists in the source of truth. | | `phoneFirstNameMatch` | `match`, `fuzzy`, `nomatch`, `unknown` | Matches first name submitted against the value associated with the phone. | | `phoneLastNameMatch` | `match`, `fuzzy`, `nomatch`, `unknown` | Matches last name submitted against the value associated with the phone. | | `phoneNameMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches full name against the name associated with the phone. Does not account for middle name. | | `phoneStreetMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches street submitted against the street associated with the phone. | | `phoneCityMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches city submitted against the city associated with the phone. | | `phoneStateMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches state submitted against the state associated with the phone. | | `phoneZipcodeMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches zip code submitted against the zip code associated with the phone. | | `phoneAddressMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches full address submitted against the address associated with the phone. | | `phoneDobMatch` | `exact`, `nomatch`, `unknown` | Matches date of birth submitted against the value associated with the phone. | | `phoneEmailMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches email submitted against the email associated with the phone. | | `phoneCarrier` | String | Phone carrier associated with the submitted phone number. | | `phoneLineType` | String | Type of phone line (for example, `Mobile`). | | `phoneLevel` | `low`, `medium`, `high`, `very_high` | Risk level associated with the submitted phone. | | `phoneRiskLevel` | `low`, `medium`, `high`, `very_high` (with reason codes) | Risk level associated with the submitted phone, with reason codes. Uses the same logic as `phoneLevel`. | | `emailRiskLevel` | `low`, `medium`, `high` (with reason codes) | Risk level associated with the submitted email.
          | | `overallLevel` | `low`, `medium`, `high` | Overall risk level, customizable per customer requirements. | ### phoneNameMatch calculation `phoneNameMatch` is derived from `phoneFirstNameMatch` and `phoneLastNameMatch`: - `exact`: `phoneFirstNameMatch` and `phoneLastNameMatch` are both `exact` (or `match`). - `nomatch`: `phoneFirstNameMatch` and `phoneLastNameMatch` are both `nomatch`. - `unknown`: `phoneFirstNameMatch` and `phoneLastNameMatch` are both `unknown`. - `fuzzy`: all other cases. ### phoneAddressMatch calculation `phoneAddressMatch` is derived from the component address fields: - `exact`: `phoneStreetMatch`, `phoneCityMatch`, `phoneStateMatch`, and `phoneZipcodeMatch` are all `exact`. - `nomatch`: all four component fields are `nomatch`. - `unknown`: all four component fields are `unknown`. - `fuzzy`: all other cases. ### phoneLevel calculation `phoneLevel` is calculated from a proprietary matching score (-1 to 100): - `low`: score is 300 or less. - `medium`: score is 300-600. - `high`: score is 600-800. - `very_high`: score is 800 or greater. ## US TELCO 5 ### Request parameters | Parameter | Required | Description | | -------------- | --------- | ----------------------------------------------------------- | | `source` | Mandatory | Must be `US_TELCO_5`. | | `countryCode` | Mandatory | Must be `US`. | | `phone` | Mandatory | Phone number in E.164 format (for example, `+14081234567`). | | `firstName` | Optional | First name of the individual. | | `middleName` | Optional | Middle name of the individual. | | `surName` | Optional | Last name of the individual. | | `street` | Optional | Full street including house number and apartment number. | | `city` | Optional | City of the individual's address. | | `state` | Optional | Two-letter state code. | | `postalCode` | Optional | Postal code. | | `dateOfBirth` | Optional | Format: `yyyy-mm-dd`. | | `emailAddress` | Optional | Email address. | | `idNumber` | Optional | Individual's SSN. | ### Response fields US TELCO 5 anchors verification on the phone number. Compared to US TELCO 4, it adds middle name matching, tax ID matching, and additional metadata fields. | Field | Statuses | Description | | ---------------------- | -------------------------------------- | ------------------------------------------------------------------------------------- | | `checkStatus` | String | Outcome of the check. | | `phoneMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Whether the phone number exists in the source of truth. | | `phoneFirstNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches first name submitted against the value associated with the phone. | | `phoneMiddleNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches middle name submitted against the value associated with the phone. | | `phoneLastNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches last name submitted against the value associated with the phone. | | `phoneNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches full name against the name associated with the phone. | | `phoneStreetMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches street submitted against the value associated with the phone. | | `phoneCityMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches city submitted against the value associated with the phone. | | `phoneStateMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches state submitted against the value associated with the phone. | | `phoneZipcodeMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches zip code submitted against the value associated with the phone. | | `phoneAddressMatch` | `exact`, `fuzzy`, `nomatch` | Matches full address submitted against the value associated with the phone. | | `phoneDobMatch` | `exact`, `nomatch` | Matches date of birth submitted against the value associated with the phone. | | `phoneEmailMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches email submitted against the value associated with the phone. | | `taxIdMatch` | `exact`, `nomatch` | Matches submitted tax ID against the tax ID related to the closest matching identity. | | `isItin` | `true`, `false` | Whether the returned SSN is an ITIN. | | `emailType` | String | Type of email (for example, `personal`, `business`). | | `phoneCarrier` | String | Phone carrier associated with the submitted phone number. | | `phoneLineType` | String | Type of phone line (for example, `mobile`). | | `lastPorted` | Date | Date the number was last ported, in `yyyy-mm-dd` format. | | `activityScore` | Integer | Activity score (0-1000) representing the quality of the phone number. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on `phoneNameMatch`, `phoneDobMatch`, and `taxIdMatch`: - `low` when `phoneNameMatch` is `exact` AND (`phoneDobMatch` OR `taxIdMatch`) is `exact`. - `high` when `phoneNameMatch` is `nomatch` AND (`phoneDobMatch` OR `taxIdMatch`) is `nomatch`. - `medium` for all other combinations. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ## US CREDIT BUREAU 1 ### Request parameters | Parameter | Required | Description | | ------------- | --------- | -------------------------------------------------------- | | `source` | Mandatory | Must be `US_CREDIT_BUREAU_1`. | | `countryCode` | Mandatory | Must be `US`. | | `ssn` | Mandatory | Nine-digit US tax ID (SSN). | | `firstName` | Mandatory | First name of the individual. | | `middleName` | Optional | Middle name of the individual. | | `surName` | Mandatory | Last name of the individual. | | `street` | Mandatory | Full street including house number and apartment number. | | `city` | Mandatory | City of the individual's address. | | `state` | Mandatory | Two-letter state code. | | `postalCode` | Mandatory | Postal code. | | `dateOfBirth` | Optional | Format: `yyyy-mm-dd`. | | `email` | Optional | Email address. | | `phone` | Optional | Phone number in E.164 format. | ### Response fields US CREDIT BUREAU 1 anchors verification on the tax ID (SSN) but does not perform a direct Social Security Administration lookup. Instead, the submitted attributes (name, DOB, address, email, phone, SSN) are used to find the closest matching identity from third-party data including credit header files, phone records, email records, bankruptcies, deceased data, IP information, and other public records. Match results are then returned against that closest match. The risk levels returned by this source reflect an assessment of whether the submitted identity is likely to be synthetic. A first-party synthetic identity is one where the applicant provides a true name and DOB but a fictitious SSN (often to obscure other parts of their profile). A third-party synthetic identity is one where the name, DOB, and SSN together describe a fictitious person (commonly used in organized identity fraud). `low` risk levels indicate the submitted identity is unlikely to be synthetic; `high` and `very_high` levels indicate elevated risk of synthetic identity fraud or, for `taxIdLevel`, a name or DOB mismatch against the SSN. | Field | Statuses | Description | | ------------------- | ---------------------------------------------------------- | ---------------------------------------------------------------------------------------- | | `taxIdMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches submitted tax ID against the closest matching identity. | | `taxIdNameMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches submitted full name (first, middle, last) against the closest matching identity. | | `taxIdDobMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches submitted date of birth against the closest matching identity. | | `taxIdStateMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches submitted state against the closest matching identity. | | `taxIdAddressMatch` | `exact`, `nomatch`, `unknown` | Matches submitted address against the closest matching identity. | | `taxIdLevel` | `low`, `medium`, `high`, `very_high` | Risk level associated with the tax ID. | | `phoneCarrier` | String | Phone carrier associated with the submitted phone number, if phone data is available. | | `phoneLineType` | `Mobile`, `Landline`, `FixedVOIP`, `NonFixedVOIP`, `Other` | Phone line type, if phone data is available. | | `phoneLevel` | `low`, `medium`, `high`, `very_high` | Risk level associated with the submitted phone. | | `addressRiskLevel` | `low`, `medium`, `high`, `very_high` | Risk level associated with the submitted address, independent of address matching. | | `emailLevel` | `low`, `medium`, `high`, `very_high` | Risk level associated with the submitted email. | | `emailDomainLevel` | `low`, `high` | Risk level associated with the submitted email's domain. | | `overallLevel` | `low`, `medium`, `high`, `very_high` | Overall risk level. Defaults to the value of `taxIdLevel`. | ### Fuzzy match definitions US CREDIT BUREAU 1 uses specific fuzzy match rules for each field. **Fuzzy taxIdNameMatch** is returned when at least one of the following applies: - First names match exactly. - Last names match exactly. - First and last names are swapped and match when unswapped. - The submitted first and last names appear inside the source-of-truth full name, and the submitted names are at least five characters each. For example, submitted `Joanna Smith` against source-of-truth `Joanna Lucinda Smith`. - The restricted Damerau-Levenshtein distance between the two names is less than three, and both names are at least five characters. **Fuzzy taxIdDobMatch** is returned when the DOBs are not an exact match and: - Two of three components (year, month, day) match exactly (for example, `1987-01-05` vs. `1987-06-05`). - Month and day are swapped (for example, `1987-12-06` vs. `1987-06-12`). **Fuzzy taxIdMatch** is returned when the SSNs are not an exact match and their restricted Damerau-Levenshtein distance is three or less. **Fuzzy taxIdAddressMatch** is returned when any of the following applies: - Partial match to street data (misspelling of street name, missing street number) and all other address fields match. - No match on state, but all other address fields match. - No match on zip code, but all other address fields match. - No match on city, but all other address fields match. **Fuzzy taxIdStateMatch** does not exist. State fields return only `exact`, `nomatch`, or `unknown`. ### taxIdLevel calculation `taxIdLevel` is derived from `taxIdMatch`, `taxIdNameMatch`, and `taxIdDobMatch`: - `low`: `taxIdMatch`, `taxIdNameMatch`, and `taxIdDobMatch` all return `exact`. - `medium`: at least one of `taxIdMatch`, `taxIdNameMatch`, or `taxIdDobMatch` returns `fuzzy`. - `high`: at least one of `taxIdMatch`, `taxIdNameMatch`, or `taxIdDobMatch` returns `nomatch`. - `very_high`: `taxIdMatch`, `taxIdNameMatch`, and `taxIdDobMatch` all return `nomatch`. ### phoneLevel calculation `phoneLevel` is calculated from a phone risk score (0-1000, with 1000 as highest risk): - `low`: score is 500 or less. - `medium`: score is 501-800. - `high`: score is 801-900. - `very_high`: score is 901 or greater. ### addressRiskLevel calculation `addressRiskLevel` is a signal based on address validity, USPS deliverability, commercial vs. residential classification, and a Lob-based confidence score. It is not based on address verification against the submitted name. - `low`: The address is valid, over 70% of Lob mailpieces were delivered successfully, recent mailings were successful, and the address is USPS-deliverable (or deliverable to the building's default address but missing secondary unit information). - `medium`: The address is valid, but either no tracking data exists, or between 40% and 70% of Lob mailpieces were delivered successfully. - `high`: The address is valid, but less than 40% of Lob mailpieces were delivered successfully and recent mailings were not successful. - `very_high`: The address is not valid and not deliverable by USPS. ### emailLevel calculation `emailLevel` is based on a machine-learning model that leverages email age, velocity, network signals, and domain reputation. The risk score is a value from 0-100. - `low`: score is 20 or less. - `medium`: score is 21-84. - `high`: score is 85-98. - `very_high`: score is greater than 98. ### emailDomainLevel calculation `emailDomainLevel` uses a machine-learning model to identify high-risk email domains, with a risk score of 0-100. - `low`: default when a high-risk domain is not identified. - `high`: score is 90 or greater. Incode does not have default recommendations for `medium` or `very_high` at the domain level. ## US CREDIT BUREAU 3 ### Request parameters | Parameter | Required | Description | | ------------- | ----------- | ----------------------------------------------------------------------- | | `source` | Mandatory | Must be `US_CREDIT_BUREAU_3`. | | `country` | Mandatory | Must be `US`. | | `firstName` | Mandatory | First name of the individual. | | `middleName` | Optional | Middle name of the individual. | | `surName` | Mandatory | Last name of the individual. | | `dateOfBirth` | Conditional | Format: `yyyy-mm-dd`. Either `dateOfBirth` or `phone` must be provided. | | `phone` | Conditional | Phone number. Either `dateOfBirth` or `phone` must be provided. | | `street` | Optional | Street name. | | `houseNo` | Optional | House number. | | `city` | Optional | City of the individual's address. | | `state` | Optional | State. | | `postalCode` | Optional | Postal code. | | `email` | Optional | Email address. | | `idNum` | Optional | SSN (Social Security Number). | ### Response fields US CREDIT BUREAU 3 anchors verification on the source-of-truth register. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common match field definitions and status values. | Field | Statuses | Description | | -------------------- | ------------------------------------- | ----------------------------------------------------------------------------------- | | `firstNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches first name submitted against the value in the source of truth. | | `middleNameMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches middle name submitted against the value in the source of truth. | | `lastNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches last name submitted against the value in the source of truth. | | `fullNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches full name submitted against the value in the source of truth. | | `dobMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches date of birth submitted against the value in the source of truth. | | `streetMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches street name submitted against the value in the source of truth. | | `houseNoMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches house number submitted against the value in the source of truth. | | `streetAddressMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches street and house number submitted against the value in the source of truth. | | `cityMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches city submitted against the value in the source of truth. | | `stateMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches state submitted against the value in the source of truth. | | `postalCodeMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches postal code submitted against the value in the source of truth. | | `fullAddressMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches full address submitted against the value in the source of truth. | | `idNumMatch` | `exact`, `nomatch`, `nodata` | Matches SSN submitted against the value in the source of truth. | | `phoneMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches phone submitted against the value in the source of truth. | | `emailMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches email submitted against the value in the source of truth. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on the submitted full name and at least one identity-anchoring field: - `low` when `fullNameMatch` is `exact` AND (`dobMatch` OR `fullAddressMatch` OR `idNumMatch` OR `phoneMatch`) is `exact`. - `high` when `fullNameMatch` and `idNumMatch` are both `nomatch`. - `medium` for all other combinations. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ## US CREDIT TELCO US CREDIT TELCO verifies submitted identity data against combined credit bureau and telco records. It is commonly used in eKYC processes for identity authentication and fraud prevention. ### Request parameters | Parameter | Required | Description | | ------------- | ----------- | ----------------------------------------------------------------------- | | `source` | Mandatory | Must be `US_CREDIT_TELCO`. | | `country` | Mandatory | Must be `US`. | | `firstName` | Mandatory | First name of the individual. | | `surName` | Mandatory | Last name of the individual. | | `dateOfBirth` | Conditional | Format: `yyyy-mm-dd`. Either `dateOfBirth` or `phone` must be provided. | | `phone` | Conditional | Phone number. Either `dateOfBirth` or `phone` must be provided. | | `street` | Optional | Street name. | | `apartment` | Optional | Apartment, suite, or unit number. | | `city` | Optional | City of the individual's address. | | `state` | Optional | Two-letter state code. | | `postalCode` | Optional | Postal code. | | `idNum` | Optional | SSN (Social Security Number). | ### Sample request ```json { "plugins": ["kyc"], "source": "US_CREDIT_TELCO", "country": "US", "firstName": "John", "surName": "Smith", "street": "Evergreen Terrace", "apartment": "742", "city": "Springfield", "state": "IL", "postalCode": "100011234", "dateOfBirth": "1991-08-02", "phone": "2125551234", "idNum": "123456789" } ``` ### Sample response ```json { "kyc": [ { "key": "firstNameMatch", "status": "Exact" }, { "key": "lastNameMatch", "status": "Exact" }, { "key": "fullNameMatch", "status": "Exact" }, { "key": "dobMatch", "status": "Exact" }, { "key": "streetMatch", "status": "Exact" }, { "key": "apartmentMatch", "status": "Exact" }, { "key": "cityMatch", "status": "Exact" }, { "key": "stateMatch", "status": "Exact" }, { "key": "postalCodeMatch", "status": "Exact" }, { "key": "fullAddressMatch", "status": "Exact" }, { "key": "idNumMatch", "status": "Exact" }, { "key": "phoneMatch", "status": "No Match" }, { "key": "overallLevel", "status": "Low" } ] } ``` ### Response fields See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common status values. | Field | Statuses | Description | | ------------------ | ------------------------------------- | --------------------------------------------------------------------------------------------------------------- | | `firstNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches first name submitted against the value in the source of truth. | | `lastNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches last name submitted against the value in the source of truth. | | `fullNameMatch` | `exact`, `fuzzy`, `nomatch` | Matches full name (first name, middle name, last name) submitted against the value in the source of truth. | | `dobMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches date of birth submitted against the value in the source of truth. | | `streetMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches street name submitted against the value in the source of truth. | | `apartmentMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches apartment, suite, or unit number submitted against the value in the source of truth. | | `cityMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches city submitted against the value in the source of truth. | | `stateMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches state submitted against the value in the source of truth. | | `postalCodeMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches postal code submitted against the value in the source of truth. | | `fullAddressMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches full address (street, apartment, city, postal code) submitted against the value in the source of truth. | | `idNumMatch` | `exact`, `nomatch`, `nodata` | Matches submitted SSN against the value in the source of truth. | | `phoneMatch` | `exact`, `fuzzy`, `nomatch`, `nodata` | Matches phone submitted against the value in the source of truth. | | `overallLevel` | `low`, `medium`, `high` | Overall risk level. See below for calculation logic. | ### overallLevel calculation `overallLevel` is calculated based on the submitted full name and at least one identity-anchoring field: - `low` when `fullNameMatch` is `exact` AND (`dobMatch` OR `idNumMatch`) is `exact`. - `high` when `fullNameMatch` and `idNumMatch` are both `nomatch`. - `medium` for all other combinations. Contact your Incode representative to customize the `overallLevel` calculation for your use case. ## US ADDRESS 1 ### Request parameters US ADDRESS 1 requires all address fields as mandatory. | Parameter | Required | Description | | ------------- | --------- | ---------------------------------------------------------------------- | | `source` | Mandatory | Must be `US_Address_1`. | | `countryCode` | Mandatory | Must be `US`. | | `street` | Mandatory | Full street including house number and apartment number. | | `city` | Mandatory | City of the individual's address. | | `state` | Mandatory | Two-letter state code. | | `postalCode` | Mandatory | Postal code. | | `firstName` | Optional | First name of the individual. | | `surName` | Optional | Last name of the individual. This source does not process middle name. | ### Response fields US ADDRESS 1 anchors verification on the address, using USPS-verified address data. Match results and additional address-quality signals are returned. | Field | Statuses | Description | | ------------------ | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------ | | `nameMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches name submitted against the name associated with the address. Does not account for middle name. | | `streetMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches street submitted against the value in the source of truth. | | `cityMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches city submitted against the value in the source of truth. | | `stateMatch` | `exact`, `nomatch`, `unknown` | Matches state submitted against the value in the source of truth. | | `zipcodeMatch` | `exact`, `nomatch`, `unknown` | Matches zip code submitted against the value in the source of truth. | | `addressMatch` | `exact`, `fuzzy`, `nomatch`, `unknown` | Matches full address submitted against the value in the source of truth. | | `deliverability` | `deliverable`, `deliverable_unnecessary_unit`, `deliverable_incorrect_unit`, `deliverable_missing_unit`, `undeliverable` | Represents likelihood that the address is deliverable. See below. | | `addressValid` | `true`, `false` | Whether the address exists as a real location. See below. | | `addressRiskLevel` | `low`, `medium`, `high`, `very_high` (with reason codes) | Represents likelihood that the address is deliverable, along with reason codes. | | `overallLevel` | `low`, `medium`, `high`, `very_high` | Overall risk level, customizable per customer requirements. | ### deliverability values - `deliverable`: The address is deliverable by USPS. - `deliverable_unnecessary_unit`: The address is deliverable but the secondary unit information is unnecessary. - `deliverable_incorrect_unit`: The address is deliverable to the building's default address, but the secondary unit provided may not exist. Mail may not reach the intended recipient. - `deliverable_missing_unit`: The address is deliverable to the building's default address but is missing secondary unit information. Mail may not reach the intended recipient. - `undeliverable`: The address is not deliverable by USPS. ### addressValid `addressValid` indicates whether the address was found in a comprehensive dataset including USPS records, open-source mapping data, and proprietary mail delivery data. This is a broader test than `deliverability`: an address may be valid (exists as a real location) but not deliverable by USPS. ### addressMatch calculation `addressMatch` is derived from the component address fields: - `exact`: `streetMatch`, `cityMatch`, `stateMatch`, and `zipcodeMatch` are all `exact`. - `nomatch`: `streetMatch` is `nomatch` AND (`cityMatch` is `nomatch` OR `zipcodeMatch` is `nomatch`). - `unknown`: `streetMatch` is `unknown` AND (`cityMatch` is `unknown` OR `zipcodeMatch` is `unknown`). - `fuzzy`: all other cases. ## US DRIVERS LICENSE 1 US DRIVERS LICENSE 1 verifies submitted driver's license details against state driver's license records. It is commonly used in scenarios that require age verification, such as couriers and delivery services confirming the individual is above the legal age. US DRIVERS LICENSE 1 currently supports 42 of the 50 US states. The following states are not supported: Alaska, California, Louisiana, Minnesota, New Hampshire, New York, Oklahoma, Pennsylvania, and Utah. ### Request parameters | Parameter | Required | Description | | ------------- | --------- | ------------------------------------------------------- | | `source` | Mandatory | Must be `US_DRIVERS_LICENSE_1`. | | `countryCode` | Mandatory | Must be `US`. | | `state` | Mandatory | Two-letter driver's license state (for example, `CA`). | | `dlNumber` | Mandatory | Driver's license number. Format varies per state. | | `firstName` | Optional | First name of the individual. | | `surName` | Optional | Last name of the individual. | | `dateOfBirth` | Optional | Format: `yyyy-mm-dd`. | | `dlExpireAt` | Optional | Driver's license expiration date. Format: `yyyy-mm-dd`. | ### Response fields US DRIVERS LICENSE 1 anchors verification on the driver's license record. See the [eKYC API Reference](/general-reference/ekyc-api-reference/) for common status values. | Field | Statuses | Description | | ----------------------- | -------------------------------------- | ---------------------------------------------------------------------------------------- | | `dlNumberMatch` | `exact`, `nomatch` | Whether the submitted driver's license number matches the state driver's license record. | | `dlDobMatch` | `exact`, `nomatch` | Matches date of birth submitted against the driver's license record. | | `dlNameMatch` | `exact`, `approximatematch`, `nomatch` | Matches name submitted against the driver's license record. | | `dlExpirationDateMatch` | `exact`, `nomatch` | Matches expiration date submitted against the driver's license record. | | `dlStateCodeMatch` | `exact`, `nomatch` | Matches state submitted against the driver's license record. | --- - Path: `general-reference/error-code-changes-for-colombia` - URL: https://developer.incode.com/general-reference/error-code-changes-for-colombia/ - Markdown: https://developer.incode.com/general-reference/error-code-changes-for-colombia.md # Error Code Changes for Colombia Error code definitions and response statuses for the Government Verification module for Colombia changed in June 2026. These changes improve result explainability, reduce ambiguity, and make it easier to interpret session outcomes in Dashboard and via API responses. ### Action Required If your implementation uses the impacted error codes for later decisioning logic or alerting, please review the status changes carefully and update your logic accordingly. *** ## **Status Changes for Select Error Codes** Several error codes that previously returned `FAIL` status now return `UNKNOWN`. This is more accurate. These outcomes are not definitive verification failures; instead, they indicate the verification could not be completed due to missing inputs, configuration issues, or connectivity problems. | Error Code | Description | Old Status | New Status | | ------------------ | ------------------------------------------------------------------------------------- | ---------- | ---------- | | `NOT_ENOUGH_DATA` | One or more required fields are missing or invalid. | `FAIL` | `UNKNOWN` | | `CONNECTION_ERROR` | Error occurred while trying to connect to the provider or during provider processing. | `FAIL` | `UNKNOWN` | If you prefer to continue failing sessions that now return `UNKNOWN`, such as `CONNECTION_ERROR` during a provider outage, you can configure this in **Business Rules** without any code changes on your end. *** ## **New Error Codes and Mapping** The following error codes can now be returned. Previously, these scenarios were grouped under broader codes. They now map to more specific codes to provide more precision in result handling. | New Code | Description | Status | | ------------------------- | ---------------------------------------------------------------------- | --------- | | `PROVIDER_UNAVAILABLE` | Provider has been intentionally disabled. | `UNKNOWN` | | `PROVIDER_NOT_CONFIGURED` | Provider is not configured or is incorrectly configured for this flow. | `UNKNOWN` | | `USER_NOT_FOUND` | The document was not found in the government database. | `FAIL` | *** ## **Updated Behavior for **VALIDATION_ERROR `VALIDATION_ERROR` continues to return `FAIL`, but it is now applied more precisely to only include genuine verification failures, such as a document being found but in a canceled/not-valid state. Scenarios that are not true verification failures—such as connectivity, availability, and missing input data—are now mapped individually instead of being grouped under `VALIDATION_ERROR`. *** ## **Error Codes** | Reason Code | Description | Status | | ------------------------- | ------------------------------------------------------------------------------------- | --------- | | `PROVIDER_UNAVAILABLE` | Provider has been intentionally disabled. | `UNKNOWN` | | `PROVIDER_NOT_CONFIGURED` | Provider is not configured or is incorrectly configured for this flow. | `UNKNOWN` | | `NOT_ENOUGH_DATA` | One or more required fields are missing or invalid. | `UNKNOWN` | | `CONNECTION_ERROR` | Error occurred while trying to connect to the provider or during provider processing. | `UNKNOWN` | | `USER_NOT_FOUND` | The document was not found in the government database. | `FAIL` | | `VALIDATION_ERROR` | Document exists in the government database but is an invalid status. | `FAIL` | *** ## Unchanged Behavior - **The API interface is unchanged.** Error codes continue to be returned in the same fields and the same response structure. This update is fully backwards compatible; no integration changes are required. - **Error codes remain available in Business Rules.** All error codes, including newly distinguished ones, continue to be exposed in Business Rules, so you can configure `FAIL` or `UNKNOWN` handling as needed.
          --- - Path: `general-reference/error-code-changes-for-us-government-verification` - URL: https://developer.incode.com/general-reference/error-code-changes-for-us-government-verification/ - Markdown: https://developer.incode.com/general-reference/error-code-changes-for-us-government-verification.md # Error Code Changes for US Government Verification Error code definitions and response statuses for the Government Verification module for the United States changed in April 2026. These changes improve result explainability, reduce ambiguity, and make it easier to interpret session outcomes in Dashboard and via API responses. ### Action Required If your implementation uses the impacted error codes for later decisioning logic or alerting, please review the status changes carefully and update your logic accordingly. *** ## Status Changes for Select Error Codes Several error codes that previously returned `FAIL` status now return `UNKNOWN`. This is more accurate. These outcomes are not definitive verification failures; instead, they indicate the verification could not be completed due to missing inputs, configuration issues, or connectivity problems. | Error Code | Description | Old Status | New Status | | :---------------------- | :------------------------------------------------------------------ | :--------- | :--------- | | `providerNotConfigured` | Provider is not configured or incorrectly configured for this flow | `FAIL` | `UNKNOWN` | | `missingDocumentId` | Document number missing or has an invalid pattern | `FAIL` | `UNKNOWN` | | `invalidExpirationDate` | Expiration date is not valid per document standards | `FAIL` | `UNKNOWN` | | `notEnoughData` | One or more required fields are missing or invalid | `FAIL` | `UNKNOWN` | | `missingSelfie` | Provider requires selfie for processing but not provided in session | `FAIL` | `UNKNOWN` | | `connectionError` | Error occurred during processing within provider environment | `FAIL` | `UNKNOWN` | | `infrastructureError` | Error occurred during processing within Incode environment | `FAIL` | `UNKNOWN` | If you prefer to continue failing sessions that now return `UNKNOWN`, such as `connectionError` during a provider outage, you can configure this in **Business Rules** without any code changes on your end. *** ## Deprecated Error Codes and New Mapping The following error codes are deprecated and no longer returned. Sessions that would have previously triggered these codes will now return one of the more specific replacement codes listed below. | Deprecated Code | Old Description | Now Mapped To | | --------------------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | | `validationError` | Grouped validation failure covering: record not found, data mismatch, restricted record, or face match failed | `userNotFound`, `faceComparisonFailed` (more specific codes per actual failure reason) | | `providerUnavailable` | DMV or AAMVA provider service unavailable or credentials invalid | `connectionError` | *** ## Updated Error Descriptions Some error codes retain the same status but have updated descriptions for improved clarity. No behavioral changes were made. | Error Code | Description | |---|---| | `providerNotConfigured` | **Provider Not Configured**
          Provider is not configured or is incorrectly configured for this flow. | | `missingDocumentId` | **Missing Document Number**
          Document number missing or has an invalid pattern. | | `invalidExpirationDate` | **Invalid Expiration Date**
          Expiration date is not valid per document standards. | | `notEnoughData` | **Missing Required Data**
          One or more required fields are missing or invalid. | | `missingSelfie` | **Missing Selfie**
          Provider requires selfie for processing but not provided in session. | | `documentTypeNotSupported` | **Document Type Not Supported**
          Invalid document type for validation by the configured provider. | | `geographicRegionNotSupported` | **Country Not Supported**
          Document country not supported by the configured provider. | | `geographicStateRegionNotSupported` | **State Not Supported**
          Document state not supported by the configured provider. | | `connectionError` | **Provider Connection Error**
          Error occurred during processing within provider environment. | | `infrastructureError` | **Incode Processing Error**
          Error occurred during processing within Incode environment. | | `userNotFound` | **User Not Found**
          ID data doesn't match the government database. | | `faceComparisonFailed` | **Face Match Failed**
          Selfie does not match government database portrait. | *** ## Unchanged Behavior - **The API interface is unchanged.** Error codes continue to be returned in the same fields and the same response structure. This update is fully backwards compatible; no integration changes are required. - **Error codes remain available in Business Rules.** All error codes, including newly renamed and updated ones, continue to be exposed in Business Rules, so you can configure `FAIL` or `UNKNOWN` handling as needed. - **Error codes remain unchanged for non-US connections.** The error codes for all non-US government verification connections remain unchanged. - **Billing behavior is unchanged** for all affected codes. --- - Path: `general-reference/face-authentication-webhook` - URL: https://developer.incode.com/general-reference/face-authentication-webhook/ - Markdown: https://developer.incode.com/general-reference/face-authentication-webhook.md # Face Authentication Webhook This webhook is specifically designed for use with the [Face Authentication](/features-and-modules/face-authentication/) module. It also requires the webhooks to be defined in the **Configuration** > **Webhooks** tab in Dashboard. ## Success Notification The following code block shows an example of a payload for a successful attempt when the Face Authentication module is used. ```json Successful attempt { "interviewId": , "customerId": , "externalCustomerId": , "overallStatus": ("PASS" | "FAIL"), "hint": , "attemptCounterState": { "max": , "remaining": }, "error": { "name": (check possible codes below), "message": } } ``` ## Failure Notifications Possible errors include: - `"INACTIVE_SESSION"` - `"HINT_NOT_PROVIDED"` - `"NONEXISTENT_CUSTOMER"` - `"MULTIPLE_FACES_DETECTED"` - `"SPOOF_ATTEMPT_DETECTED"` - `"FACE_TOO_DARK"` - `"FACE_CROPPING_FAILED"` - `"FACE_TOO_SMALL"` - `"FACE_TOO_BLURRY"` - `"BAD_PHOTO_QUALITY"` - `"LENSES_DETECTED"` - `"FACE_MASK_DETECTED"` - `"HEAD_COVER_DETECTED"` - `"CLOSED_EYES_DETECTED"` - `"SELFIE_FACE_OCCLUDED"` - `"SELFIE_IMAGE_LOW_QUALITY"` - `"USER_IS_NOT_RECOGNIZED"` - `"FACE_NOT_FOUND"` - `"BAD_REQUEST"` - `"PROCESSING_ERROR"` - `"DEFAULT_ERROR"` The following code block shows an example of a payload for a failed attempt when the Face Authentication module is used. This payload includes two fields with information about the error: its `name` and `message`. ```json Failed attempt { "interviewId": "68e6492f71ccd116c458f59a",   "customerId": "68e4e62e44106b8c9535436e",   "overallStatus": "FAIL",   "hint": "68e4e62e44106b8c9535436e",   "error": {       "name": "SPOOF_ATTEMPT_DETECTED",       "message": "Spoof attempt detected"    } } ```
          --- - Path: `general-reference/fetch-ekyc-input` - URL: https://developer.incode.com/general-reference/fetch-ekyc-input/ - Markdown: https://developer.incode.com/general-reference/fetch-ekyc-input.md # Fetch eKYC Data ## What is eKYC data? Customers often integrate our eKYC input forms directly into their end-user experiences. As a result, customers want to have the opportunity to save and collect the original form input. The eKYC data for an onboarding contains all of the information that was submitted during the eKYC onboarding form. This includes all the textual information submitted (eg. Name, Address, etc.) ### This endpoint requires an Admin session token. Session tokens issued for individual onboarding sessions cannot be used with this endpoint. For details on obtaining an Admin session token, see [Incode API Documentation](/reference/introduction/). ## How is eKYC data fetched? To fetch eKYC data for a given onboarding session, you will need to pass the session's unique interview ID to the API endpoint. ## Direct API approach ### API Authentication All endpoints require authentication headers to be specified as stated in [Incode API Documentation](/reference/introduction/) ### [**eKYC fetch input**]() **GET /omni/externalVerification/ekyc/session/\[interviewId]** You can retrieve the session IDs by navigating to the sessions tab within your dashboard.
          ## Sample Response ```json JSON { "userData": { "plugins": [], "source": "US_CREDIT_BUREAU_1", "firstName": "xxx", "surName": "xxx", "email": "xxx@xxx.com", "street": "XXX XX AVE", "houseNo": "XX", "postalCode": "XXXXX", "countryCode": "US", "phone": "+1408XXXXXXX", "state": "CA", "city": "SAN FRANCISCO", "ssn": "123456789", "dateOfBirth": "YYYY-MM-DD" }, "riskData": { "level": "medium", "verifications": { "phoneCarrier": "Multiple OCN Listing", "phoneLevel": "very_high", "taxIdLevel": "medium", "taxIdStateMatch": "exact", "emailDomainLevel": "low", "phoneLineType": "Landline", "taxIdMatch": "exact", "taxIdDobMatch": "exact", "taxIdNameMatch": "fuzzy", "taxIdAddressMatch": "nomatch", "addressRiskLevel": "low", "emailLevel": "medium" }, "reasonCodes": [ { "key": "addressRiskLevel", "reasonCodes": [ { "reasonCode": "A70SS", "description": "Tracking data indicates that over 70% of mailpieces sent to this address were delivered successfully and recent mailings were also successful." } ] }, { "key": "taxIdLevel", "reasonCodes": [ { "reasonCode": "TSAC", "description": "Current Address Conflict" }, { "reasonCode": "TANO", "description": "Current Address Not On-file" }, { "reasonCode": "TMAI", "description": "Multiple address inconsistencies in last 7 days and SSN seen with different phones in last 90 days" }, { "reasonCode": "TPSMT", "description": "Phone seen multiple times in last 90 days with different last names" }, { "reasonCode": "TPDNV", "description": "One or more PII data elements not verified" } ] }, { "key": "customer", "reasonCodes": [ { "reasonCode": "PRSA", "description": "This number has risky static attributes (like VOIP phone type or being on a blocklist) -" }, { "reasonCode": "EANI", "description": "Not enough information was found for the provided email address to determine a risk assessment" }, { "reasonCode": "TSAC", "description": "Current Address Conflict" }, { "reasonCode": "TANO", "description": "Current Address Not On-file" }, { "reasonCode": "TMAI", "description": "Multiple address inconsistencies in last 7 days and SSN seen with different phones in last 90 days" }, { "reasonCode": "TPSMT", "description": "Phone seen multiple times in last 90 days with different last names" }, { "reasonCode": "TPDNV", "description": "One or more PII data elements not verified" } ] } ] } } ```
          --- - Path: `general-reference/fetching-crosscheck-results` - URL: https://developer.incode.com/general-reference/fetching-crosscheck-results/ - Markdown: https://developer.incode.com/general-reference/fetching-crosscheck-results.md # Fetching Crosscheck Results The [Cross Check module](/features-and-modules/cross-check/) compares two data points from a session against each other and returns a match result. Cross checks are [configured in Dashboard](/dashboard-platform-administration/cross-check-dashboard/) as part of a Workflow or Flow: you name each comparison, choose the two fields to compare (for example, first name from ID Capture against first name entered in a Form), and set the severity applied when the values don't match. During a session, each configured comparison runs automatically. This page documents how to fetch the results of those comparisons via API. ## Endpoint `POST /omni/cross-doc-data-check/results` ## Response The response returns a dictionary keyed by comparison name. Each value is an array of result objects containing the compared fields, match outcome, and severity. ### Sample response ```json { "FirstNameComparison #i1class": [ { "interviewId": "string", "comparisonName": "string", "comparisonId": "string", "result": "OK", "leftValueDetails": { "documentType": "string", "fieldName": "string", "value": {}, "sourceNotFound": true }, "rightValueDetails": { "documentType": "string", "fieldName": "string", "value": {}, "sourceNotFound": true }, "severity": "ultra_low" } ] } ``` ### Response fields | Field | Description | | ------------------- | ---------------------------------------------------------------------------------------------------- | | `interviewId` | ID of the interview the comparison was run against. | | `comparisonName` | Name of the comparison as configured in Dashboard. | | `comparisonId` | Internal ID of the comparison. | | `result` | Match outcome for this comparison. | | `leftValueDetails` | Object describing the first field in the comparison, including document type, field name, and value. | | `rightValueDetails` | Object describing the second field in the comparison. | | `severity` | Severity level of the comparison result (for example, `ultra_low`). | ## Reading results When reading the response, iterate through the dictionary and use a "contains" comparison with the comparison name. Do not read the comparison name as a direct key on the JSON response. Incode's system automatically appends metadata to the end of each name, so a direct key lookup will not work. For example, if you name a comparison `FirstNameComparison` in Dashboard, the API may return it as `FirstNameComparison #i1class`. The appended metadata varies and should be ignored. To retrieve the result, loop through the top-level keys of the JSON response and find the key that contains `FirstNameComparison`. Name comparisons so there is no overlap in "contains" matching. For example, do not name one comparison `FirstNameComp` and another `FirstNameComparison`. This can cause your code to read from the wrong field. --- - Path: `general-reference/france` - URL: https://developer.incode.com/general-reference/france/ - Markdown: https://developer.incode.com/general-reference/france.md # France eKYB Prefill in France leverages France's source of truth to automatically retrieve and populate business information based on a company's SIREN, SIRET, RCS, RC, or VAT number, including the business name, registered address, entity type, registration status, directors, shareholders, and additional financial and corporate data, without requiring manual input from the user. ## Source | Country | Source | Description | | --- | --- | --- | | France | `FR_KYB_PREFILL` | Returns matching French business details from France's source of truth for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --- | --- | --- | | plugins | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | source | Mandatory | String. Must be `FR_KYB_PREFILL`. Identifies the Prefill source. | | country | Mandatory | String. Two-letter Alpha-2 country code. Must be `FR`. | | taxId | Mandatory | String. French business identifier. See Tax ID formats for details. | | businessName | Optional | String. Registered name of the business. When provided, adds `nameMatch` to the response. | | address | Optional | String. Business address as a freeform string. When provided, adds `addressMatch` to the response. | ### Tax ID formats The `taxId` field accepts five French business identifier types. Routing between them is determined automatically by the format of the submitted value. | **ID Type** | **Description** | **Format** | **Example** | |---|---|---|---| | **SIREN** | Company-level identifier issued by INSEE | 9 numeric digits | `775670417` | | **SIRET** | Establishment-level identifier (SIREN + NIC suffix) | 14 numeric digits (9-digit SIREN + 5-digit NIC) | `12345678901234` | | **RCS** | Registre du Commerce et des Sociétés number | `RCS` + registering court city + SIREN | `RCS Paris 775 670 417` | | **RC** | Registre du Commerce number for artisans/crafts | `RC` + city + registration number | Paris 123 456 789 | | **VAT number** | French intra-community VAT identifier | `FR` + 2-digit check code + 9-digit SIREN (13 characters total) | `FR81775670417` | Inputs that do not match any of the above formats return a 400 error. ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "FR_KYB_PREFILL", "country": "FR", "taxId": "12345678901234", "businessName": "Entreprise Exemple SAS", "address": "10 Rue de Rivoli, 75001 Paris, France" } ``` ### Sample response The Prefill response returns business data retrieved directly from the source of truth. Fields are returned as-is from the source. `nameMatch` and `addressMatch` are only present when `businessName` or `address` were submitted in the request. `vatNo` and `leiNumber` are only present when available on file for the company. **Example 1 — ABERMIDONE (small company)** ```json { "kyb-prefill": [ { "tin": "12345678901234", "vatNo": "FR12345678901", "name": "ABERMIDONE", "nameMatch": "Verified", "address": "10 Rue de Rivoli, 75001 Paris, France", "city": "Paris", "postalCode": "75001", "entityType": "Simplified joint stock company", "registrationStatus": "Active", "registrationDate": "2013-09-25T00:00:00Z", "creditRating": "B", "creditRatingDescription": "Low Risk", "industryDesc": "Retail sale via home-shopping by general catalogue", "activityDesc": "Retail sale via home-shopping by general catalogue", "employeeCount": "7 to 9 employees", "otherAddresses": [ { "type": null, "otherAddress": "33185 LE HAILLAN" }, { "type": null, "otherAddress": "75008 PARIS" } ], "shareholders": [ { "name": "Groupe Exemple SA", "percentSharesHeld": 100 } ], "directors": [ { "name": "Groupe Exemple SA", "positionName": "President" } ], "ultimateParent": { "name": "Groupe Exemple SA", "country": "FR" }, "immediateParent": { "name": "Groupe Exemple SA", "country": "FR" } } ] } ``` **Example 2 — LVMH MOET HENNESSY LOUIS VUITTON (large public company)** ```json { "kyb-prefill": [ { "tin": "12345678901234", "vatNo": "FR12345678901", "leiNumber": "549300ECLIPSELUXE199", "name": "Maison Éclipse Luxe SAS", "nameMatch": "Verified", "address": "108 AVENUE RIVIÈRE 75008 PARIS", "city": "PARIS", "postalCode": "75008", "entityType": "European Company", "registrationStatus": "Active", "registrationDate": "1989-01-13T00:00:00Z", "creditRating": "A", "creditRatingDescription": "Very Low Risk", "industryDesc": "Activities of head offices", "activityDesc": "Activities of head offices", "turnover": { "currency": "EUR", "value": 748000000 }, "employeeCount": "20", "shareholders": [ { "name": "FINANCIÈRE ÉCLAT", "percentSharesHeld": 6.73 }, { "name": "FAMILLE BEAUMONT", "percentSharesHeld": 0.57 } ], "directors": [ { "name": "M BERNARD BEAUMONT", "positionName": "Chairman of the Board" }, { "name": "Mme LYDIA ANNA-NOËLLE DUNE", "positionName": "Administrator" } ] } ] } ``` ### Response fields | Key | Value | Description | | --- | --- | --- | | tin | SIREN or SIRET | The company registration number as confirmed by the source of truth. | | vatNo | VAT number | The French VAT number (TVA intracommunautaire) as returned from the source of truth (for example, `FR81775670417`). Only present when available on file for the company. | | leiNumber | LEI number | The Legal Entity Identifier as returned from the source of truth. Only present when available — not all French companies have one. | | name | Business name | The registered legal name of the business as returned from the source of truth. | | nameMatch | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the name on file. Only present when `businessName` was submitted in the request. See Name and address match values for details. | | address | Registered address | The primary registered address of the business as returned from the source of truth. | | addressMatch | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against the registered address on file. Only present when `address` was submitted in the request. See Name and address match values for details. | | city | City | The city of the registered address as returned from the source of truth. | | postalCode | Postal code | The postal code of the registered address as returned from the source of truth. | | entityType | Entity type | The legal form of the business as returned from the source of truth (for example, `Simplified joint stock company`, `European Company`). Defaults to `Unknown` when not available. | | registrationStatus | Registration status | The current company status as returned from the source of truth (for example, `Active`). Defaults to `Unknown` when not available. | | registrationDate | Date | The date the company was registered, as returned from the source of truth. May not be present for all companies. | | creditRating | Credit rating value | The standardized credit rating value (for example, `A`). Defaults to `Unknown` when not available. | | creditRatingDescription | Credit rating description | A human-readable description of the credit rating (for example, `Very Low Risk`). | | industryDesc | Industry description | The primary activity description as returned from the source of truth (for example, `Activities of head offices`). | | activityDesc | Activity description | The principal activity description as returned from the source of truth. For France, this is typically identical to `industryDesc`. | | turnover | `{currency, value}` object or string range | The latest turnover figure or range as returned from the source of truth. Passed through as-is — may be an exact `{currency, value}` object for larger companies or absent entirely for smaller companies. May not be present for all companies. | | employeeCount | String | The latest employee count as returned from the source of truth. May be an exact number (for example, `"20"`) or a range (for example, `"6 to 9 employees"`) depending on the company. Always returned as a string. May not be present for all companies. | | otherAddresses | Array of `{type, otherAddress}` | Additional addresses on file, other than the primary registered address. May not be present for all companies. | | websites | Array of strings | Website URLs associated with the business as returned from the source of truth. May not be present for all companies. | | shareholders | Array of `{name, percentSharesHeld}` | Shareholders associated with the business as returned from the source of truth. May not be present for all companies. | | directors | Array of `{name, positionName}` | Current directors and officers as returned from the source of truth. `positionName` reflects the primary position title on file. May not be present for all companies. | | ultimateParent | `{name, country, registrationNumber}` | Ultimate parent company, if available. Absent when the entity sits at the top of its own group structure. | | immediateParent | `{name, country, registrationNumber}` | Immediate parent company, if available. Absent when the entity sits at the top of its own group structure. | ### Name and address match values | Status | Description | | --- | --- | | Verified | Exact match found against registry data. | | Approximate Match | Similar match found; may reflect minor differences in naming or address formatting. | | Unverified | No match found in registry data. | ### Registration status values | Status | Description | | --- | --- | | Active | The company is currently active and registered. | | Inactive | The company registration is dissolved, struck off, or no longer active. | | Unknown | The registration status could not be determined. | ## Error responses For standard HTTP response codes, see the API Error Response page. France Prefill returns the following country-specific 400 errors. `taxId` is missing, empty, or does not match a supported French identifier format (SIREN, SIRET, RCS, RC, or VAT number): ```json { "timestamp": 1782851408892, "status": 400, "error": "Bad Request", "message": "taxId must be a valid French identifier: SIREN (9 digits), SIRET (14 digits), RCS (RCS + city + number), RC (RC + city + number), or VAT number (FR + 11 characters)", "path": "/omni/externalVerification/ekyb-prefill" } ``` Any mandatory field (`plugins`, `source`, `country`, or `taxId`) is missing: ```json { "timestamp": 1782851468367, "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` No business match is found for the submitted `taxId`: ```json { "timestamp": 1782851583695, "status": 200, "message": "No business found matching the provided tax ID.", "path": "/omni/externalVerification/ekyb-prefill" } ``` ## Single Session Dashboard results Prefill results are available on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/germany` - URL: https://developer.incode.com/general-reference/germany/ - Markdown: https://developer.incode.com/general-reference/germany.md # Germany eKYB Prefill in Germany leverages Germany's source of truth to automatically retrieve and populate business information based on a company's commercial register number or VAT number, including the business name, registered address, entity type, registration status, directors, shareholders, and additional financial and corporate data, without requiring manual input from the user. ## Source | Country | Source | Description | | --- | --- | --- | | Germany | `DE_KYB_PREFILL` | Returns matching German business details from Germany's source of truth for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --- | --- | --- | | plugins | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | source | Mandatory | String. Must be `DE_KYB_PREFILL`. Identifies the Prefill source. | | country | Mandatory | String. Two-letter Alpha-2 country code. Must be `DE`. | | taxId | Mandatory | String. German commercial register number or VAT number. See Tax ID formats for details. | | businessName | Optional | String. Registered name of the business. When provided, adds `nameMatch` to the response. | | address | Optional | String. Business address as a freeform string. When provided, adds `addressMatch` to the response. | ### Tax ID formats The `taxId` field accepts two German business identifier types. Routing between them is determined automatically by the format of the submitted value. | ID Type | Format | Example | | --- | --- | --- | | **Handelsregisternummer** (Commercial register number) | `HRB` or `HRA` followed by digits | `HRB 209661` | | **USt-IdNr** (VAT number) | `DE` + 9 numeric digits | `DE814194672` | These formats do not overlap, so routing is unambiguous. Inputs that do not match either format return a 400 error. ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "DE_KYB_PREFILL", "country": "DE", "taxId": "HRB 123456", "businessName": "SAGDO GmbH", "address": "Lindenstraße 24, 21465 Reinbek" } ``` ### Sample response The Prefill response returns business data retrieved directly from the source of truth. Fields are returned as-is from the source. `nameMatch` and `addressMatch` are only present when `businessName` or `address` were submitted in the request. `vatNo` is only present when the VAT number is available on file for the company. ```json { "kyb-prefill": [ { "tin": "HRB 123456", "vatNo": "DE123456789", "name": "SAGDO GmbH", "nameMatch": "Verified", "address": "Lindenstraße 24, 21465 Reinbek", "city": "Reinbek", "postalCode": "21465", "entityType": "Private limited company", "registrationStatus": "Active", "registrationDate": "2005-12-16T00:00:00Z", "creditRating": "A", "creditRatingDescription": "Very Low Risk", "industryDesc": "Manufacture of sports goods", "activityDesc": "Manufacture of sports goods", "turnover": "2 million - 5 million", "employeeCount": "3-5", "websites": ["sagdo.de"], "shareholders": [ { "name": ": "Nordlicht Capital Investment GmbH", "percentSharesHeld": 100 } ], "ultimateParent": { "name": "BERGMANN BETEILIGUNGSGESELLSCHAFT MBH", "country": "DE" }, "immediateParent": { "name": "BERGMANN BETEILIGUNGSGESELLSCHAFT MBH", "country": "DE" } } ] } ``` ### Response fields | Key | Value | Description | | --- | --- | --- | | tin | Commercial register number | The Handelsregisternummer (HRB/HRA number) as confirmed by the source of truth. | | vatNo | VAT number | The USt-IdNr as returned from the source of truth (for example, `DE123456789`). Only present when the VAT number is available on file — not every company will have this field even if a VAT number exists. | | name | Business name | The registered legal name of the business as returned from the source of truth. | | nameMatch | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the name on file. Only present when `businessName` was submitted in the request. See Name and address match values for details. | | address | Registered address | The primary registered address of the business as returned from the source of truth. | | addressMatch | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against the registered address on file. Only present when `address` was submitted in the request. See Name and address match values for details. | | city | City | The city of the registered address as returned from the source of truth. | | postalCode | Postal code | The postal code of the registered address as returned from the source of truth. | | entityType | Entity type | The legal form of the business as returned from the source of truth (for example, `Private limited company`). Defaults to `Unknown` when not available. | | registrationStatus | Registration status | The current company status as returned from the source of truth (for example, `Active`). Defaults to `Unknown` when not available. | | registrationDate | Date | The date the company was registered, as returned from the source of truth. May not be present for all companies. | | creditRating | Credit rating value | The standardized credit rating value (for example, `A`). Defaults to `Unknown` when not available. | | creditRatingDescription | Credit rating description | A human-readable description of the credit rating (for example, `Very Low Risk`). | | industryDesc | Industry description | The primary activity description as returned from the source of truth (for example, `Manufacture of sports goods`). | | activityDesc | Activity description | The principal activity description as returned from the source of truth. For Germany, this is typically identical to `industryDesc`. | | turnover | String | The turnover range as returned from the source of truth (for example, `"2 million - 5 million"`). Germany provides range values only — no exact figure is available. This field is always a string, not a numeric object. | | employeeCount | String | The latest employee count as returned from the source of truth. May be an exact number (for example, `"5"`) or a range (for example, `"3-5"`) depending on the company. Always returned as a string. May not be present for all companies. | | otherAddresses | Array of `{type, otherAddress}` | Additional addresses on file, other than the primary registered address. May not be present for all companies. | | websites | Array of strings | Website URLs associated with the business as returned from the source of truth. May not be present for all companies. | | shareholders | Array of `{name, percentSharesHeld}` | Shareholders associated with the business as returned from the source of truth. May not be present for all companies. | | directors | Array of `{name, positionName}` | Current directors and officers as returned from the source of truth. `positionName` reflects the primary position title on file. May not be present for all companies. | | ultimateParent | `{name, country, registrationNumber}` | Ultimate parent company, if available. Absent when the entity is not a subsidiary. | | immediateParent | `{name, country, registrationNumber}` | Immediate parent company, if available. Absent when the entity is not a subsidiary. | ### Name and address match values | Status | Description | | --- | --- | | Verified | Exact match found against registry data. | | Approximate Match | Similar match found; may reflect minor differences in naming or address formatting. | | Unverified | No match found in registry data. | ### Registration status values | Status | Description | | --- | --- | | Active | The company is currently active and registered. | | Inactive | The company registration is dissolved, struck off, or no longer active. | | Unknown | The registration status could not be determined. | ## Error responses For standard HTTP response codes, see the API Error Response page. Germany Prefill returns the following country-specific 400 errors. `taxId` is missing, empty, or does not match the `HRB`/`HRA` + digits or `DE` + 9 digits format: ```json { "timestamp": 1782851408892, "status": 400, "error": "Bad Request", "message": "taxId must be a valid German commercial register number (HRB/HRA followed by digits) or VAT number (DE followed by 9 digits)", "path": "/omni/externalVerification/ekyb-prefill" } ``` Any mandatory field (`plugins`, `source`, `country`, or `taxId`) is missing: ```json { "timestamp": 1782851468367, "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` No business match is found for the submitted `taxId`: ```json { "timestamp": 1782851583695, "status": 200, "message": "No business found matching the provided tax ID.", "path": "/omni/externalVerification/ekyb-prefill" } ``` ## Single Session Dashboard results Prefill results are available on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/get-an-access-token` - URL: https://developer.incode.com/general-reference/get-an-access-token/ - Markdown: https://developer.incode.com/general-reference/get-an-access-token.md # Get an Access Token Incode's platform includes two primary access control levels. The first level is the session token and it's scoped to an onboarding session. The second level is the executive token and this token provides access to any session, as well as privileged operations. Privileged operations include, but are not limited to operations such as, asynchronously fetching scores or other pieces of past session data, using our SMS endpoint, and fetching data after a webhook is received. ## Session Tokens A session token is returned by the `omni/start`API endpoint and is used for the immediate activities related to the Incode session it was generated for. For example, once calling the `omni/start` endpoint, the same token should be used to call subsequent capture and process API calls. The token returned in the `omni/start`response is used for the **X-Incode-Hardware-Id** header. The TTL (time to live) value of these tokens defaults to 90 days. ## Executive Tokens The executive token, also reffered to as an admin token, is generated from a user's password and email. You can find this information in your Incode delivery document. Supply the credentials associated with the environment that you are attempting to access data in. For example, when trying to fetch session images in the Demo environment, use your dashboard login credentials for the Demo environment. The TTL value of these tokens defaults to 24 hours. The request body for the API [call](/api-reference/executive-log-in/) will look like the following JSON example: ```json { "email": "some@email.com", "password": "somePassword" } ``` #### Response: The response will be a token that you will use for the **X-Incode-Hardware-Id** header. ```json { "token": "[string]" } ``` ## Request Header This is the standard request header that will be used for all API calls * **api-version**: This header is mandatory for each request. The value must be set to `1.0` * **x-api-key**: This header is mandatory for each request. This is a client specific API key which should be issued by Incode. You can find this in your Incode delivery document * **X-Incode-Hardware-Id**: The value for this header is should be set after calling the `omni/start` endpoint or after calling the ` /executive/log-in` endpoint --- - Path: `general-reference/global-watchlists-webhook` - URL: https://developer.incode.com/general-reference/global-watchlists-webhook/ - Markdown: https://developer.incode.com/general-reference/global-watchlists-webhook.md # Global watchlists webhook Global watchlists supports continuous updates for a session if continuous updates were subscribed to via the API. The Global Watchlists Webhook will asynchronously send updates if the search has any updated security information. The received `ref` and `search_id` fields are both identifiers that were assigned when the initial search was performed. Any of the received fields can be used to retrieve the new search result using the [updated watchlist](/reference/getupdatedwatchlistresult/) endpoint. To configure your callback URL, navigate to the Dashboard and select `Configuration -> Webhooks`, and then enter your URL under `WATCHLIST UPDATE WEBHOOK URL (OPTIONAL)`. For more information see the webhook introduction page. # Endpoint details `POST https://{client-defined-url}` ## Request Below is an example of the payload that you will get when the webhook triggers ```json Sample request payload { "interviewId": "", "ref" : "", // Reference number received when search was created "search_id": "" // Search id created when search was created. } ``` If you are [authenticating your webhook requests](/general-reference/authorizing-webhooks-requests/) , the webhook will contain the `Authorization` header along with the OAuth2.0 bearer token: `Authorization: Bearer ` If you configured additional custom headers, they will be included as well. ## Response To avoid our [retry policy](/general-reference/webhooks-overview/#retry-policy) to keep sending the same notification over and over, make sure your endpoint returns one of the following: * Status code `204 No content` * Status code `200 OK` with a response type `application/json`, for example `{ "success" : true }` ```json Sample response { "success" : true } ``` --- - Path: `general-reference/government-verification-sources` - URL: https://developer.incode.com/general-reference/government-verification-sources/ - Markdown: https://developer.incode.com/general-reference/government-verification-sources.md # Government Verification Incode verifies user-provided identity data against official government registries to confirm that IDs are legitimate, valid, and belong to the person presenting them. Registries are maintained by government agencies in each supported country; supported documents, verifiable data, and available verification tiers vary by country. Government verification runs as part of an onboarding session after data capture and biometric checks are complete. ## Country coverage Each country page documents the registry Incode connects to, the verification tiers available (for example, Data, Face, or Data and Face), the supported document types, and the fields that can be verified. Where applicable, pages also note credential requirements for accessing the registry. - [Argentina](/general-reference/system-of-record-argentina/) - [Australia](/general-reference/system-of-record-australia/) - [Brazil](/general-reference/system-of-record-brazil/) - [Chile](/general-reference/system-of-record-chile/) - [Colombia](/general-reference/system-of-record-colombia/) - [Mexico](/general-reference/system-of-record-mexico/) - [South Africa](/general-reference/system-of-record-south-africa/) - [United States (GovMatch)](/general-reference/united-states-govmatch/) ## Direct API approach For the request and response reference, see [Process Government Validation](/api-reference/process-government-validation/) in the Incode Omni API Reference. --- - Path: `general-reference/greece` - URL: https://developer.incode.com/general-reference/greece/ - Markdown: https://developer.incode.com/general-reference/greece.md # Greece eKYB Prefill in Greece leverages Greece's source of truth to automatically retrieve and populate business information based on a company's AFM or GEMI number, including the business name, entity type, registration status, registration date, credit rating, and other corporate details, without requiring manual input from the user. ## Source | Country | Source | Description | | --- | --- | --- | | Greece | `GR_KYB_PREFILL` | Returns matching Greek business details from Greece's source of truth for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --- | --- | --- | | `plugins` | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | `source` | Mandatory | String. Must be `GR_KYB_PREFILL`. Identifies the Prefill source. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `GR`. | | `taxId` | Mandatory | String. AFM or GEMI number. See [Tax ID formats](#tax-id-formats) for details. | | `businessName` | Optional | String. Registered business name, used to verify the match against the source of truth. | | `address` | Optional | String. Business address, used to verify the match against the source of truth. | ### Tax ID formats Greece supports two business identifier formats as search input. Requests with an invalid format return a 400 error. | Entity Type | Format | | --- | --- | | AFM (Arithmos Forologikou Mitroou) | 9 numeric digits (e.g. `801725938`). Also accepted with the `EL` VAT prefix (e.g. `EL801725938`) — the prefix is stripped before lookup. | | GEMI number (General Commercial Registry number) | 12 numeric digits | ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "GR_KYB_PREFILL", "country": "GR", "taxId": "801725938", "businessName": "", "address": "" } ``` ### Sample response The Prefill response returns business data retrieved directly from the source of truth. Passthrough fields are returned as-is from the source, without fuzzy matching or verification scoring. Match fields (`nameMatch`, `addressMatch`) are only returned when the corresponding input (`businessName`, `address`) was submitted. Field availability varies by company — see the notes under each example below. **Example 1 — small company with trading name and previous name** ```json { "kyb-prefill": [ { "tin": "123456789000", "vatNo": "801725938", "name": "SAMPLE BOAT I.K.E.", "nameMatch": "Verified", "address": "Sample Street 1 Kerkyra Kerkyra 49100", "city": "Kerkyra", "postalCode": "49100", "entityType": "Private Capital Company", "registrationStatus": "Active", "registrationDate": "2023-05-12T00:00:00Z", "creditRating": "E", "creditRatingDescription": "Not Rated", "activityDesc": "Yachting", "turnover": { "currency": "EUR", "value": 74882 }, "websites": ["www.sampleboat.example"], "shareholders": [ { "name": "Sample Owner Name", "percentSharesHeld": 100 } ], "directors": [ { "name": "Sample Director Name", "positionName": "Administrator" } ], "otherNames": [ { "name": "SAMPLE BOAT", "businessNameType": "Trading Name" }, { "name": "SAMPLE BOAT SINGLE MEMBER P.C.", "businessNameType": "Previous Name" } ] } ] } ``` **Example 2 — company with multiple shareholders (limited turnover/contact data)** ```json { "kyb-prefill": [ { "tin": "987654321000", "vatNo": "802498747", "name": "SAMPLE RENTAL E.E.", "nameMatch": "Verified", "address": "Sample Avenue 86 Kavala Kavala 65404", "city": "Kavala", "postalCode": "65404", "entityType": "Limited Partnership", "registrationStatus": "Active", "registrationDate": "2026-02-02T00:00:00Z", "creditRating": "E", "creditRatingDescription": "Not Rated", "shareholders": [ { "name": "Sample Shareholder One", "percentSharesHeld": 35 }, { "name": "Sample Shareholder Two", "percentSharesHeld": 35 }, { "name": "Sample Shareholder Three", "percentSharesHeld": 30 } ], "directors": [ { "name": "Sample Director One", "positionName": "Administrator" }, { "name": "Sample Director Two", "positionName": "Administrator" } ], "otherNames": [ { "name": "SAMPLE TRADING NAME", "businessNameType": "Trading Name" }, { "name": "SAMPLE RENTAL O.E.", "businessNameType": "Previous Name" } ] } ] } ``` *(`turnover`, `employeeCount`, `websites`, `otherAddresses` omitted — not present in this response.)* **Example 3 — larger company (with otherAddresses/employeeCount)** ```json { "kyb-prefill": [ { "tin": "456789123000", "vatNo": "094232831", "name": "SAMPLE SHOES SA", "nameMatch": "Verified", "address": "Sample Road 7 Argyroupoli 16452 Attiki", "entityType": "Societe Anonyme", "registrationStatus": "Active", "creditRating": "C", "creditRatingDescription": "Moderate Risk", "industryDesc": "Wholesale of clothing and footwear", "turnover": { "currency": "EUR", "value": 4887918 }, "employeeCount": "19", "websites": ["www.sampleshoes.example"], "otherAddresses": [ { "otherAddress": "Sample Secondary Address, Glyfada, Attiki 16675" } ], "otherNames": [ { "name": "SAMPLE SHOES S.A.", "businessNameType": "Trading Name" }, { "name": "SAMPLE SHOES S.A.", "businessNameType": "Previous Name" } ] } ] } ``` *(`otherNames` entries here are near-duplicates of `name`, differing only in punctuation — a real, if unremarkable, response.)* ### Response fields | Key | Value | Description | | --- | --- | --- | | `tin` | GEMI number | 12-digit General Commercial Registry number, as returned from the source of truth. | | `vatNo` | AFM | 9-digit tax registry number. | | `name` | Business name | The registered **legal** name of the business, as returned from the source of truth — not the trading name. | | `nameMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the registered name. Only returned when `businessName` is submitted. | | `address` | Address | The registered business address as returned from the source of truth. | | `addressMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against the registered address. Only returned when `address` is submitted. | | `city` | City | The city associated with the registered business address, when available. | | `postalCode` | Postal code | The postal code associated with the registered business address, when available. Always 5 digits. | | `entityType` | Entity type | The legal entity type of the business (e.g. Private Capital Company, Societe Anonyme). Defaults to "Unknown" when not available. | | `registrationStatus` | Active, Expired, Unknown, Not Found | Current registration status of the business. Defaults to "Unknown" when not available. | | `registrationDate` | Date | The date the business was registered. May not be available for all entities. | | `creditRating` | Rating value (e.g. A, C, E) | The business's credit rating, as returned from the source of truth. Defaults to "Unknown" when not available. | | `creditRatingDescription` | Description (e.g. Moderate Risk, Not Rated) | Human-readable description of the credit rating. Defaults to "Unknown" when not available. | | `industryDesc` | Industry description | Description of the business's main activity, when available. | | `activityDesc` | Activity description | Description of the business's principal activity, when available. | | `turnover` | `{currency, value}` object | The business's latest reported turnover figure. May not be available for all entities. | | `employeeCount` | Number (as string) | Latest reported number of employees, if available. | | `websites` | Array of strings | Websites associated with the business, if available. | | `otherAddresses` | Array of `{otherAddress}` | Addresses associated with the business other than the main registered address, if any. May not be present for smaller companies. | | `shareholders` | Array of `{name, percentSharesHeld}` | Shareholder information, if available. | | `directors` | Array of `{name, positionName}` | Directors associated with the business, if available. May occasionally contain garbled or low-quality name data. | | `otherNames` | Array of `{name, businessNameType}` | Trading name and any previous legal names for the business, combined into a single list. `businessNameType` is `"Trading Name"` or `"Previous Name"`. | ## Error responses For standard HTTP response codes, see the API Error Response page. Greece Prefill returns the following country-specific 400 errors. `taxId` is not a valid 9-digit AFM or 12-digit GEMI number: ```json { "status": 400, "error": "Bad Request", "message": "taxId must be a valid AFM (9 digits) or GEMI number (12 digits)", "path": "/omni/externalVerification/ekyb-prefill" } ``` Any mandatory field (`plugins`, `source`, `country`, or `taxId`) is missing: ```json { "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` No business match is found for the submitted taxId: ```json { "timestamp": 1782851583695, "status": 200, "message": "No business found matching the provided tax ID.", "path": "/omni/externalVerification/ekyb-prefill" }` ``` ## Single Session Dashboard results Prefill results are available on the **Business** tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/incode-api-overview` - URL: https://developer.incode.com/general-reference/incode-api-overview/ - Markdown: https://developer.incode.com/general-reference/incode-api-overview.md # Incode API Overview The Incode Omni API is organized around REST. In general our API uses standard secure HTTP requests with JSON arguments and JSON responses. ## Authentication REST API calls must be authenticated using a custom HTTP header `X-Incode-Hardware-Id` — along with a JSON web token. Additionally, every API call has to contain `x-api-key` header with valid client API key. :::info Please check [Get an Access Token](/general-reference/get-an-access-token/) for an explanation of how access tokens are generated and used. ::: ## API Responses Incode Omni uses conventional HTTP response codes to indicate the success or failure of an API request. In general: - Codes in the `2XX` range indicate success. - Codes in the `4xx` range indicate an error that failed given the information provided (e.g. missing required parameter). These usually mean you need to fix your request. - Codes in the `5xx` range indicate server side errors (these are rare). :information_source: Some `2XX` responses of the Omni API have a dynamic nature. For example, the [Fetch ocr data](/api-reference/get-ocr-data/) or [Fetch ocr data V2](/api-reference/get-ocr-data-v2/) endpoint will might contain additional fields depending on the data which was extracted from provided ID Document in the session. If you are using typed languages such as Java or C#, consider these cases to avoid having serialization exception when reading the JSON responses. :warning: `4XX` errors that can be handled programmatically on your end include status of an error and message that briefly explains the error reported. Arguments: - **timestamp**: Long, UTC timestamp in milliseconds - **status**: Integer, custom error code or http status code - **error**: String, Http status error - **message**: String, custom error message - **path**: String, endpoint path Custom error codes are given for each endpoint. ```json Example response with custom error { "timestamp": 1584639032757, "status": 405, "error": "Spoof attempt detected", "message": "BadRequestException: Spoof attempt detected.", "path": "/omni/add/face" } ``` HTTP status code summary: - `200` (OK): Everything worked as expected. - `400` (Bad Request): The request was unacceptable, often due to missing a required parameter. - `401` (Unauthorized): Invalid or missing access token. - `403` (Forbidden): Invalid or missing api key. - `404` (Not Found): The requested resource doesn't exist. - `405` (Method Not Allowed): Unacceptable HTTP method for requested resource. - `406` (Not Acceptable): Unacceptable request. - `429` (Too Many Requests): See [rate limits](#rate-limits) below. - `500, 502, 503, 504` (Server Errors): Something went wrong on server side. (These are rare.) ## API Limitations ### Maximum Request Size **There is a limitation of 10Mb** as the maximum possible request / response size in all our API endpoints, for this reason; it's is not possible to upload or fetch images/files larger than 10 Mb. ### Timeout **There is a hard limit of 30 seconds** for all of our endpoints. If any request takes longer than that, you will receive a `Request Timeout` error ### Rate limits We rate limit our APIs via throttling based on the "tokens in a bucket" approach: - Each endpoint call requires a token (each organization has a bucket of tokens per endpoint category) - Bucket capacity (`burst`) defines how many tokens can be withdrawn at once - Tokens are refilled until the bucket reaches maximum capacity based on the refill rate (`maxRps`) There are three endpoint categories, each one with its own bucket: 1.  `SUPER_HEAVY`: ID endpoints triggered by the SDK normally (e.g. `add/front`, `add/back`, `process/id)` 2.  `HEAVY`: Face endpoints triggered by the SDK normally (e.g. `add/face`, `process/face`) 3.  `OTHER`: All other endpoints | Category | maxRps | burst | | :---------- | :----- | :---- | | SUPER HEAVY | 1 | 5 | | HEAVY | 1 | 5 | | OTHER | 100 | 50 | See [API Rate Limits](/general-reference/rate-limits/) for more information. For **special cases (only)** where these limits are not enough, our Customer Success team can help you adjust as needed. **Rate limit example:** The endpoints `add/front` `add/back` and `process/id` are in the `SUPER_HEAVY` category. The maximum bucket capacity is `5`, meaning the max amount of requests that can be done in a second is 5. Every request will deplenish the bucket by 1. If all 5 requests are consumed **within the same second** the bucket is emptied, any additional requests within the same second will receive the response: `429 Too Many Requests` . The `SUPER_HEAVY` bucket has a refill rate of 1 (`maxRps`) per second, so it will refill by 1 unit every second until it's filled (5). --- - Path: `general-reference/india` - URL: https://developer.incode.com/general-reference/india/ - Markdown: https://developer.incode.com/general-reference/india.md # India eKYB Prefill in India leverages India's source of truth to automatically retrieve and populate business information based on a company's tax identifier (CIN or GSTIN), including the business name, entity type, registration status, registration date, credit rating, PAN details, and GST registrations, without requiring manual input from the user. ### Source | Country | Source | Description | | --- | --- | --- | | India | `IN_KYB_PREFILL` | Returns matching Indian business details from India's source of truth for pre-fill. | ### Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. #### Endpoint `POST /omni/externalVerification/ekyb-prefill` #### Request parameters | Parameter | Required | Description | | --- | --- | --- | | `plugins` | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | `source` | Mandatory | String. Must be `IN_KYB_PREFILL`. Identifies the Prefill source. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `IN`. | | `taxId` | Mandatory | String. CIN or GSTIN. See [Tax ID formats](#tax-id-formats) for details. | | `businessName` | Optional | String. Registered business name, used to verify the match against the source of truth. | | `address` | Optional | String. Business address, used to verify the match against the source of truth. | #### Tax ID formats India supports two business identifier formats as search input. Requests with an invalid format return a 400 error. | Entity Type | Format | | --- | --- | | CIN (Corporate Identification Number) | 21 alphanumeric characters — company-type entities only (e.g. `U12345MH2020PTC123456`) | | GSTIN (Goods and Services Tax Identification Number) | 15 alphanumeric characters | Routing logic: if `taxId` is exactly 21 characters, it is treated as a CIN. Otherwise, if it matches the 15-character GSTIN format, it is treated as a GSTIN. Any other length or format returns a 400 error. :::note PAN (Permanent Account Number) is a valid Indian tax identifier but is **not** usable as search input — it does not return results. PAN is still returned as a field within the response (`panNumber`/`panName`) when available. India does not have a separate VAT distinct from GST — the GSTIN serves as both. Not every entity has a GSTIN, since registration is turnover-threshold dependent. Proprietorships (sole proprietors) have no CIN at all — only a GSTIN and PAN. ::: #### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "IN_KYB_PREFILL", "country": "IN", "taxId": "U12345MH2020PTC123456", "businessName": "", "address": "123 Sample Road, Mumbai, MH 123 456" } ``` #### Sample response The Prefill response returns business data retrieved directly from the source of truth. Passthrough fields are returned as-is from the source, without fuzzy matching or verification scoring. Match fields (`nameMatch`, `addressMatch`) are only returned when the corresponding input (`businessName`, `address`) was submitted. Field availability varies significantly by entity type — see the notes under each example below. **Example 1 — public company (CIN-based)** ```json { "kyb-prefill": [ { "tin": "U12345MH2020PTC123456", "vatNo": "14AAAAA0000A1Z1", "allGSTINs": [ { "gstin": "14AAAAA0000A1Z1", "status": "Active" }, { "gstin": "32AAAAA0000A1Z2", "status": "Active" }, { "gstin": "02AAAAA0000A1Z3", "status": "Cancelled" } ], "panNumber": "AAAAA0000A", "panName": "SAMPLE INDUSTRIES LIMITED", "leiNumber": "5493000000000000AB12", "name": "SAMPLE INDUSTRIES LIMITED", "nameMatch": "Verified", "address": "1ST FLOOR SAMPLE TOWER 100 EXAMPLE ROAD NA MUMBAI Maharashtra India 400001", "entityType": "Public", "registrationStatus": "Active", "registrationDate": "1990-01-15T00:00:00Z", "creditRating": "C", "creditRatingDescription": "Moderate Risk", "industryDesc": "Manufacture of fuels, oils, and related chemical products.", "activityDesc": "The company is engaged in the business of manufacturing, refining, and distribution of industrial products.", "turnover": { "currency": "INR", "value": 5000000000000 }, "websites": ["www.sampleindustries.example"], "shareholders": [ { "name": "Public", "percentSharesHeld": 49.52 }, { "name": "Example Commercials LLP", "percentSharesHeld": 11.12 } ], "directors": [ { "name": "ANANYA SAMPLE RAO", "positionName": "Whole-time director" }, { "name": "ROHAN SAMPLE MEHTA", "positionName": "Director" } ] } ] } ``` *(`ultimateParent`/`immediateParent` omitted — this entity sits at the top of its own group.)* **Example 2 — sole proprietorship (GSTIN/PAN-based, no CIN)** ```json { "kyb-prefill": [ { "vatNo": "27BBBBB1111B1Z1", "allGSTINs": [ { "gstin": "27BBBBB1111B1Z1", "status": "Active" } ], "panNumber": "BBBBB1111B", "panName": "SAMPLE PROPRIETOR NAME", "name": "Sample Engineering Works", "nameMatch": "Verified", "address": "Plot 12, Sample Industrial Estate, Sample Road, Pune - 411000, Maharashtra, India", "entityType": "Proprietorship", "registrationStatus": "Active", "creditRating": "C", "creditRatingDescription": "Moderate Risk", "industryDesc": "Manufacture of fabricated metal products.", "activityDesc": "The entity is engaged in the business of manufacturing metal components and providing related services.", "otherAddresses": [ { "type": "PAN Address", "otherAddress": "Flat 5, Sample Apartments, Sample Nagar, Pune - 411001, Maharashtra, INDIA" } ] } ] } ``` :::info Field availability differs across entity types and is not consistent even within the same type. `tin` (CIN), `leiNumber`, `registrationDate`, `turnover`, `shareholders`, `directors`, `ultimateParent`, and `immediateParent` are generally not available for proprietorships, since these entities have no company registration or share structure. `city` and `postalCode` are not consistently present for any entity type and should be treated as optional. ::: #### Response fields | Key | Value | Description | | --- | --- | --- | | `tin` | CIN | Corporate Identification Number. May not be available for all entities (e.g. proprietorships have no CIN). | | `vatNo` | GSTIN | The active GSTIN. India has no separate VAT — this field holds the GSTIN. If the input `taxId` was a GSTIN, that value is echoed back; otherwise the first active GSTIN on record is returned. | | `allGSTINs` | Array of `{gstin, state, status}` | All GSTINs on record for the business. May not be available for all entities. Some entities hold multiple GSTINs (one per state of operation). | | `panNumber` | PAN | The business's (or, for proprietorships, the owner's) Permanent Account Number. | | `panName` | Name | The legal name associated with the PAN. May reflect the individual owner's name for proprietorships. | | `leiNumber` | LEI | Legal Entity Identifier, if available. | | `name` | Business name | The registered legal name of the business as returned from the source of truth. | | `nameMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the registered name. Only returned when `businessName` is submitted. | | `address` | Address | The registered business address as returned from the source of truth. | | `addressMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against the registered address. Only returned when `address` is submitted. | | `city` | City | The city associated with the registered business address, when available. | | `postalCode` | Postal code | The postal code associated with the registered business address, when available. | | `entityType` | Entity type | The legal entity type of the business (e.g. Public, Proprietorship). Defaults to "Unknown" when not available. | | `registrationStatus` | Active, Expired, Unknown, Not Found | Current registration status of the business. Defaults to "Unknown" when not available. | | `registrationDate` | Date | The date the business was registered. May not be available for all entities. | | `creditRating` | Rating value (e.g. A, C) | The business's credit rating, as returned from the source of truth. Defaults to "Unknown" when not available. | | `creditRatingDescription` | Description (e.g. Moderate Risk) | Human-readable description of the credit rating. Defaults to "Unknown" when not available. | | `industryDesc` | Industry description | Description of the business's main activity. Defaults to "Unknown" when not available. | | `activityDesc` | Activity description | Description of the business's principal activity. Defaults to "Unknown" when not available. | | `turnover` | `{currency, value}` object | The business's latest reported turnover figure. May not be available for all entities. | | `websites` | Array of strings | Websites associated with the business, if available. | | `otherAddresses` | Array of `{type, otherAddress}` | Addresses associated with the business other than the main registered address, if any. | | `shareholders` | Array of `{name, percentSharesHeld}` | Shareholder information, if available. | | `directors` | Array of `{name, positionName}` | Directors associated with the business, if available. | | `ultimateParent` | `{name, country, registrationNumber}` | The business's ultimate parent company, if the business is a subsidiary. | | `immediateParent` | `{name, country, registrationNumber}` | The business's immediate parent company, if the business is a subsidiary. | ### Error responses For standard HTTP response codes, see the API Error Response page. India Prefill returns the following country-specific 400 errors. `taxId` is not a valid 21-character CIN or a valid 15-character GSTIN: ```json { "status": 400, "error": "Bad Request", "message": "taxId must be a valid CIN (21 characters) or GSTIN (15 characters)", "path": "/omni/externalVerification/ekyb-prefill" } ``` Any mandatory field (`plugins`, `source`, `country`, or `taxId`) is missing: ```json { "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` ### Single Session Dashboard results Prefill results are available on the **Business** tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/ine-scraping-webhook` - URL: https://developer.incode.com/general-reference/ine-scraping-webhook/ - Markdown: https://developer.incode.com/general-reference/ine-scraping-webhook.md # INE Scraping The purpose of this webhook is to notify customers when the results of an INE scraping verification are available. INE scraping functionality is based on the execution of an asynchronous process, this process runs in background and once the results from the “INE Listas Nominales” are retrieved, these results are updated as part of the Onboarding Scores. To know when this asynchronous process has finished, it is highly recommended to implement the INE Scraping Webhook. This webhook is a simple HTTP request notification that will be triggered when the INE scraping process has finished. To configure your callback URL, navigate to the Dashboard and select `Configuration -> Webhooks`, and then enter your URL under `INE SCRAPING WEBHOOK URL (OPTIONAL)`. For more information see the webhook introduction page. # INE Scraping Process ![](https://developer.incode.com/assets/76d053a8da25c05cf4c32ffd7e72e848.png)
          # INE Scraping Webhook Details When INE Scraping is enabled and configured, the following two HTTP requests are sent: 1. INE Scraping In Progress 1. This request will be received when an INE scraping process is triggered and is in progress. 2. INE Scraping Finished. 1. This request will be received when an INE scraping process has finished. 2. Once the `FINISHED` status is received, the /omni/get/score API can be called to retrieve the results about the “INE Listas Nominales” verification. ## In Progress Request **POST`https://{client-defined-url}`** ### Request Payload **POST Body:** * **InterviewId:** String, mandatory. Session ID. * **externalId:** String, optional. External ID - only if it was sent in start. * **ScrapingStatus:`IN_PROGRESS`** String, mandatory. ## Response Response body must be `{"success": "true"}` * **success:** Boolean. Flag indicating client received notification successfully. ## Finished Request ### Request **Body:** * **InterviewId:** String, mandatory. Session ID. * **externalId:** String, optional. External ID - only if it was sent in start. * **ScrapingStatus:`FINISHED`** String, mandatory. ## Response Response body must be `{"success": "true"}` * **success:** Boolean. Flag indicating client received notification successfully. --- - Path: `general-reference/ireland` - URL: https://developer.incode.com/general-reference/ireland/ - Markdown: https://developer.incode.com/general-reference/ireland.md # Ireland eKYB Prefill in Ireland leverages Ireland's source of truth to automatically retrieve and populate business information based on a company's CRO number or VAT number, including the business name, entity type, registration status, registration date, credit rating, and other corporate details, without requiring manual input from the user. ## Source | Country | Source | Description | | --- | --- | --- | | Ireland | `IE_KYB_PREFILL` | Returns matching Irish business details from Ireland's source of truth for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --- | --- | --- | | `plugins` | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | `source` | Mandatory | String. Must be `IE_KYB_PREFILL`. Identifies the Prefill source. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `IE`. | | `taxId` | Mandatory | String. CRO number or VAT number. See [Tax ID formats](#tax-id-formats) for details. | | `businessName` | Optional | String. Registered business name, used to verify the match against the source of truth. | | `address` | Optional | String. Business address, used to verify the match against the source of truth. | ### Tax ID formats Ireland supports two business identifier formats as search input. Requests with an invalid format return a 400 error. | Entity Type | Format | | --- | --- | | CRO number (Company Registration Number) | Purely numeric, typically 5–9 digits (e.g. `301274`). May or may not appear with an `IE` prefix in the response — do not assume either way. | | VAT number | `IE` + 7 digits + 1–2 check letters (e.g. `IE6321274H`) | Disambiguation logic: if `taxId` is purely numeric, it is treated as a CRO number. If it contains letters, it is treated as a VAT number. ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "IE_KYB_PREFILL", "country": "IE", "taxId": "301274", "businessName": "", "address": "" } ``` ### Sample response ```json { "kyb-prefill": [ { "tin": "IE301274", "vatNo": "IE6321274H", "name": "SAMPLE CHEMICAL & DAIRY ENGINEERING LIMITED", "nameMatch": "Verified", "address": "SAMPLE ROAD, EXAMPLETOWN CORK Ireland", "entityType": "LTD - PRIVATE COMPANY LIMITED BY SHARES", "registrationStatus": "Active", "registrationDate": "1999-02-15T00:00:00Z", "creditRating": "A", "creditRatingDescription": "Very Low Risk", "industryDesc": "Manufacture of metal structures and parts of structures", "activityDesc": "The manufacture of process systems and stainless steel products including the design, procurement and manufacture of modular process skid units.", "turnover": { "currency": "EUR", "value": 53090461 }, "employeeCount": "211", "shareholders": [ { "name": "SAMPLE CHEMICAL & DAIRY ENGINEERING (HOLDINGS) LIMITED", "percentSharesHeld": 100 } ], "directors": [ { "name": "SAMPLE DIRECTOR NAME", "positionName": "Director" }, { "name": "SAMPLE DIRECTOR NAME", "positionName": "Company Secretary" }, { "name": "ANOTHER SAMPLE NAME", "positionName": "Director" }, { "name": "THIRD SAMPLE NAME", "positionName": "Director" } ], "ultimateParent": { "name": "SAMPLE HOLDING GROUP", "country": "FR" }, "immediateParent": { "name": "SAMPLE HOLDING GROUP", "country": "FR" } } ] } ``` **Example 2 — sole trader (NonLtd)** ```json { "kyb-prefill": [ { "tin": "240907", "name": "SAMPLE SALON", "nameMatch": "Verified", "address": "2 SAMPLE COURT, SAMPLE ROAD, EXAMPLE AREA, DUBLIN 18, D18TW10", "city": "DUBLIN", "postalCode": "D18TW10", "entityType": "INDIVIDUAL", "registrationStatus": "Active", "registrationDate": "2003-09-10T00:00:00Z", "activityDesc": "Website", "directors": [ { "name": "SAMPLE OWNER NAME", "positionName": "Registered Business Owner" } ] } ] } ``` :::info Field availability differs significantly by entity type. `vatNo`, `creditRating`, `turnover`, `employeeCount`, and `shareholders` may all be absent for sole traders. `ultimateParent`/`immediateParent` are absent for entities that sit at the top of their own group. `city`, `postalCode`, and `websites` are not consistently present across entities. ::: ### Response fields | Key | Value | Description | | --- | --- | --- | | `tin` | CRO number | Company Registration Number. May or may not include an `IE` prefix, depending on the entity — do not assume either way. | | `vatNo` | VAT number | Includes the `IE` prefix as stored in the source of truth (not stripped). Absent for sole traders and pure holding companies with no VAT registration. | | `name` | Business name | The registered legal name of the business as returned from the source of truth. | | `nameMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the registered name. Only returned when `businessName` is submitted. | | `address` | Address | The registered business address as returned from the source of truth. | | `addressMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against the registered address. Only returned when `address` is submitted. | | `city` | City | The city associated with the registered business address, when available. May not be present even when available at the initial search step. | | `postalCode` | Postal code | Eircode format (3+4 characters), when available. | | `entityType` | Entity type | The legal entity type of the business (e.g. LTD - PRIVATE COMPANY LIMITED BY SHARES, INDIVIDUAL). Defaults to "Unknown" when not available. | | `registrationStatus` | Active, Expired, Unknown, Not Found | Current registration status of the business. Defaults to "Unknown" when not available. | | `registrationDate` | Date | The date the business was registered. May not be available for all entities. | | `creditRating` | Rating value (e.g. A, C) | The business's credit rating, as returned from the source of truth. Defaults to "Unknown" when not available. | | `creditRatingDescription` | Description (e.g. Very Low Risk) | Human-readable description of the credit rating. Defaults to "Unknown" when not available. | | `industryDesc` | Industry description | Description of the business's main activity. | | `activityDesc` | Activity description | Description of the business's principal activity. May be a short label or a long free-text description depending on the company — this varies within Ireland itself. | | `turnover` | `{currency, value}` object | The business's latest reported turnover figure. May not be present (e.g. for sole traders). | | `employeeCount` | Number (as string) | Latest reported number of employees, if available. | | `websites` | Array of strings | Websites associated with the business, if available. | | `shareholders` | Array of `{name, percentSharesHeld}` | Shareholder information. Entirely absent for sole traders and other non-limited entities — not just empty. | | `directors` | Array of `{name, positionName}` | Directors associated with the business. The same person may appear multiple times with different `positionName` values — all entries are listed, without deduplication. For sole traders, the owner appears here with `positionName: "Registered Business Owner"`. | | `ultimateParent` | `{name, country}` | The business's ultimate parent company, if the business is a subsidiary. Absent when the entity sits at the top of its own group. | | `immediateParent` | `{name, country}` | The business's immediate parent company, if the business is a subsidiary. Absent when the entity sits at the top of its own group. | ## Error responses For standard HTTP response codes, see the API Error Response page. Ireland Prefill returns the following country-specific 400 errors. `taxId` is not a valid CRO number (numeric) or VAT number (`IE` + 7 digits + 1–2 letters): ```json { "status": 400, "error": "Bad Request", "message": "taxId must be a valid CRO number or Irish VAT number", "path": "/omni/externalVerification/ekyb-prefill" } ``` Any mandatory field (`plugins`, `source`, `country`, or `taxId`) is missing: ```json { "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` No business match is found for the submitted `taxId`: ```json { "timestamp": 1782851583695, "status": 200, "message": "No business found matching the provided tax ID.", "path": "/omni/externalVerification/ekyb-prefill" } ``` ## Single Session Dashboard results Prefill results are available on the **Business** tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/italy` - URL: https://developer.incode.com/general-reference/italy/ - Markdown: https://developer.incode.com/general-reference/italy.md # Italy eKYB Prefill in Italy leverages Italy's source of truth to automatically retrieve and populate business information based on a company's CCIAA/NREA number, VAT/Tax Code, or Codice Fiscale, including the business name, registered address, entity type, registration status, directors, shareholders, and additional financial and corporate data, without requiring manual input from the user. ## Source | Country | Source | Description | | --- | --- | --- | | Italy | `IT_KYB_PREFILL` | Returns matching Italian business details from Italy's source of truth for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --- | --- | --- | | plugins | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | source | Mandatory | String. Must be `IT_KYB_PREFILL`. Identifies the Prefill source. | | country | Mandatory | String. Two-letter Alpha-2 country code. Must be `IT`. | | taxId | Mandatory | String. Italian business identifier. See Tax ID formats for details. | | businessName | Optional | String. Registered name of the business. When provided, adds `nameMatch` to the response. | | address | Optional | String. Business address as a freeform string. When provided, adds `addressMatch` to the response. | ### Tax ID formats The `taxId` field accepts three Italian business identifier types. Routing between them is determined automatically by the format of the submitted value. | ID Type | Description | Format | Example | | --- | --- | --- | --- | | **CCIAA/NREA** | Chamber of Commerce registration number | 2 letters + 6 or 7 digits | `BR123456`, `VA187262` | | **Partita IVA** (VAT/Tax Code) | Italian VAT identifier | 11 numeric digits. A leading `IT` prefix is stripped automatically before processing. | `02324830740`, `IT08719600960` | | **Codice Fiscale** | Personal tax code for sole traders | 16-character alphanumeric | `CGNMHL70D16A225B` | Inputs that do not match any of the above formats return a 400 error. ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "IT_KYB_PREFILL", "country": "IT", "taxId": "BR123456", "businessName": "ITALIA VENEZIA ENTERPRISE", "address": "STRADA MILANO STRADA 17, 72014 CISTERNINO BR" } ``` ### Sample response The Prefill response returns business data retrieved directly from the source of truth. Fields are returned as-is from the source. `nameMatch` and `addressMatch` are only present when `businessName` or `address` were submitted in the request. Fields such as `turnover`, `employeeCount`, `shareholders`, `directors`, `creditRating`, and `companySize` may be absent for sole traders and smaller companies — this is expected, not an error. **Example 1 — ITALIA VENEZIA ENTERPRISE (Limited Liability Company)** ```json { "kyb-prefill": [ { "tin": "BR123456", "vatNo": "12345678901", "name": "ITALIA VENEZIA ENTERPRISE - SOCIETA' A RESPONSABILITA' LIMITATA", "nameMatch": "Verified", "address": "STRADA MILANO STRADA 17, 72014 CISTERNINO BR", "city": "CISTERNINO", "postalCode": "72014", "entityType": "LIMITED LIABILITY COMPANY", "registrationStatus": "Active", "creditRating": "C", "creditRatingDescription": "Moderate Risk", "industryDesc": "Non-specialised retail sale", "turnover": { "currency": "EUR", "value": 2298098 }, "employeeCount": "4", "shareholders": [ { "name": "Alessandro Moretti", "percentSharesHeld": 60 } ], "directors": [ { "name": "Giulia Romano", "positionName": "SOLE DIRECTOR" } ] } ] } ``` **Example 2 — RUOTA LIBERA DI CAGNAZZI MICHELE (Sole trader)** ```json { "kyb-prefill": [ { "tin": "BA123456", "vatNo": "12345678901", "name": "RUOTA VENEZIA DI CAGNAZZI MICHELE", "nameMatch": "Verified", "address": "HOUSE 123, STREET ABC, 72014 CISTERNINO BR", "city": "CISTERNINO", "postalCode": "72014", "entityType": "SOLE PROPRIETOR", "registrationStatus": "Active", "registrationDate": "2008-09-22T00:00:00Z", "industryDesc": "Other retail sale of new goods in specialised stores" } ] } ``` ### Response fields | Key | Value | Description | | --- | --- | --- | | tin | CCIAA/NREA number | The Italian Chamber of Commerce registration number as confirmed by the source of truth. | | vatNo | Partita IVA | The 11-digit Italian VAT number as returned from `alternateSummary.vatRegistrationNumber` in the source of truth. This field is reliable for all entity types, including sole traders, regardless of how the search was performed. | | name | Business name | The registered legal name of the business as returned from the source of truth. | | nameMatch | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the name on file. Only present when `businessName` was submitted in the request. See Name and address match values for details. | | address | Registered address | The primary registered address of the business as returned from the source of truth. | | addressMatch | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against the registered address on file. Only present when `address` was submitted in the request. See Name and address match values for details. | | city | City | The city of the registered address as returned from the source of truth. | | postalCode | Postal code | The postal code of the registered address as returned from the source of truth. | | entityType | Entity type | The legal form of the business as returned from the source of truth (for example, `LIMITED LIABILITY COMPANY`, `SOLE PROPRIETOR`). Defaults to `Unknown` when not available. | | registrationStatus | Registration status | The current company status as returned from the source of truth (for example, `Active`). Defaults to `Unknown` when not available. | | registrationDate | Date | The date the company was incorporated (`incorporationDate`), as returned from the source of truth. May not be present for all companies. | | creditRating | Credit rating value | The standardized credit rating value (for example, `A`). Defaults to `Unknown` when not available. May not be present for sole traders. | | creditRatingDescription | Credit rating description | A human-readable description of the credit rating (for example, `Very Low Risk`). May not be present for sole traders. | | industryDesc | Industry description | The primary activity description as returned from the source of truth (for example, `Non-specialised retail sale`). | | activityDesc | Activity description | The principal activity description as returned from the source of truth. For Italy, this is typically identical to `industryDesc`. May not be present for all companies. | | turnover | `{currency, value}` object | The latest turnover figure as returned from the source of truth. May not be present for sole traders and smaller companies. | | employeeCount | String | The latest employee count as returned from the source of truth. Always returned as a string. May not be present for sole traders and smaller companies. | | companySize | String | The company size classification as returned from the source of truth (for example, `Small Company`). May not be present for all companies. | | shareholders | Array of `{name, percentSharesHeld}` | Shareholders associated with the business as returned from the source of truth. `percentSharesHeld` is sourced from `quotaPercentage` under `shareCapitalStructureExtra`. May not be present for sole traders. | | directors | Array of `{name, positionName}` | Current directors and officers as returned from the source of truth. `positionName` reflects the primary position title on file. May not be present for sole traders. | ### Name and address match values | Status | Description | | --- | --- | | Verified | Exact match found against registry data. | | Approximate Match | Similar match found; may reflect minor differences in naming or address formatting. | | Unverified | No match found in registry data. | ### Registration status values | Status | Description | | --- | --- | | Active | The company is currently active and registered. | | Inactive | The company registration is dissolved, struck off, or no longer active. | | Unknown | The registration status could not be determined. | ## Error responses For standard HTTP response codes, see the API Error Response page. Italy Prefill returns the following country-specific 400 errors. `taxId` is missing, empty, or does not match a supported Italian identifier format: ```json { "timestamp": 1782851408892, "status": 400, "error": "Bad Request", "message": "taxId must be a valid Italian identifier: CCIAA/NREA (2 letters + 6-7 digits), Partita IVA (11 digits), or Codice Fiscale (16 alphanumeric characters)", "path": "/omni/externalVerification/ekyb-prefill" } ``` Any mandatory field (`plugins`, `source`, `country`, or `taxId`) is missing: ```json { "timestamp": 1782851468367, "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` No business match is found for the submitted `taxId`: ```json { "timestamp": 1782851583695, "status": 200, "message": "No business found matching the provided tax ID.", "path": "/omni/externalVerification/ekyb-prefill" } ``` ## Single Session Dashboard results Prefill results are available on the Business tab in [Single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/migrations-and-deprecations` - URL: https://developer.incode.com/general-reference/migrations-and-deprecations/ - Markdown: https://developer.incode.com/general-reference/migrations-and-deprecations.md # Migrations and Deprecations This section documents changes to existing Incode behavior that require action from your integration: features being retired, endpoints being replaced, and defaults being changed. Each page states what is changing, who is affected, the enforcement date, and the replacement path. Review this section whenever you plan integration work. Changes listed here have fixed enforcement dates, and most have no grace period. ## Active Migrations | Change | Enforcement date | Who's affected | | --- | --- | --- | | [Moving off session restarts](/general-reference/moving-off-session-restarts/) | TBD | Any integration that calls `omni/start` with an `interviewId` or `externalId` that already exists | ## Pages - [Moving off session restarts](/general-reference/moving-off-session-restarts/): Retires the ability to restart an existing session with `omni/start`, and covers the replacement paths: admin-token reads, new sessions linked by `identityId`, and new sessions per attempt. ## How to Use These Pages - **Check whether you're affected.** Each page opens with an *At a glance* summary naming the affected call sites and how to find them in your own code. - **Identify your scenario.** A single integration may hit the same deprecation for several different reasons, each with its own replacement. Work through the scenarios in order. - **Migrate before the enforcement date.** Replacement paths are generally available well ahead of enforcement, so you can switch incrementally rather than in one cutover. - **Remove the old path.** Migration is not complete until the deprecated call site is gone. --- - Path: `general-reference/moving-off-session-restarts` - URL: https://developer.incode.com/general-reference/moving-off-session-restarts/ - Markdown: https://developer.incode.com/general-reference/moving-off-session-restarts.md # Migration Guide: Moving Off Session Restarts The ability to call `omni/start` again on a session that already exists, referred to as a **restart**, is being retired. If your integration does this, you need to migrate to one of the replacement paths below before the enforcement date. ## At a glance | | | |---|---| | **Enforcement date** | TBD | | **What's changing** | Restarting a session by calling `omni/start` API or SDK again with an existing `interviewId` or `externalId` | | **Who's affected** | Any integration that calls `omni/start` with an `interviewId` or `externalId` that already exists | | **How to check** | Search your integration for call sites where `omni/start` is passed an existing `interviewId` or `externalId`. For each one, work through [Find Your scenario](#find-your-scenario) to identify why. | | **Grace period** | None. See [Enforcement](#enforcement). | ## What is changing | | What it is | Status | |---|---|---| | **Restart** | Calling `omni/start` API or SDK again with the `interviewId` or `externalId` of an existing session. Begins the flow from the top. | Being retired | | **Continue** | Calling `/omni/session/continue` to pick the same session back up where it left off. | The supported path going forward | The 48-hour rule governs **session resume** only. A session can be resumed via [`/omni/session/continue`](/api-reference/session-continue/) within 48 hours of the `omni/start` call that created it, up to twice. Resuming does not extend the window, and once it closes a new session is required. The 48 hours do not apply when a session is only being read using an admin token; there is no limit on session age in that case. ### Enforcement The enforcement date is **TBD**. There will be no reset at that date and no grace period: the 48 hours are measured from each session's own `omni/start` call, so a session created more than 48 hours before enforcement cannot be resumed once enforcement begins. After the enforcement date, a restart on a session outside its 48-hour window returns HTTP 400: | Code | Message | Meaning | |---|---|---| | 400 | `maximum session lifetime exceeded` | The session is too old to restart. | | 400 | `maximum session inactivity exceeded` | The session has not been updated recently enough to restart. | The [`/omni/session/continue`](/api-reference/session-continue/) endpoint returns a distinct response for each rejection case. ## Find your scenario Work through these in order. The first match is your scenario. An integration may fall into more than one, in which case handle each separately. | # | Applies when | Replacement | |---|---|---| | [1](#scenario-1-reading-session-data) | A session is restarted only to obtain a token in order to read its data (scores, OCR, images) | Use an **admin token** with the `interviewId` as a query parameter. No session opened. | | [2](#scenario-2-resuming-an-interrupted-session) | A real user drops off and returns within a couple of days to finish | TBD | | [3](#scenario-3-step-up-and-additional-checks) | An old session is reopened to run an extra check or collect another document (a signature, a proof of address, a tier upgrade) | Start a **new session** referencing the original via `identityId` | | [4](#scenario-4-repeating-a-completed-onboarding) | The user completed onboarding, and the finished session is restarted later to run it again | Create a **new session** for each attempt | | — | None of the above | Contact your Incode CS representative or reach out using the customer portal. | ## Scenario 1: Reading session data **Applies when:** the integration calls `omni/start` again purely to mint a token, then uses that token to read data. The restart is a side effect of needing a token, not something the flow requires. **What to do instead:** authenticate with an **admin token** and pass the session's `interviewId` explicitly. No session is opened. **Prerequisites**: - Provision an admin user: A dashboard user with the **Admin** role is required on the specific instance being called. The admin token is issued in exchange for that user's email and password. If the account is removed or its password changes, the integration stops working. - Obtain and refresh the admin token. ### The endpoints you'll call The admin token goes in the **`X-Incode-Hardware-Id`** header, not `Authorization: Bearer`. The session is identified by `interviewId` as a **query parameter**, which is what allows an existing session to be read without opening it. ```bash curl -X GET 'https:///omni/get/ocr-data?id=' \ --header 'x-api-key: ' \ --header 'x-incode-hardware-id: ' \ --header 'api-version: 1.0' ``` | Data required | Call | |---|---| | OCR data | [`GET /omni/get/ocr-data?id=`](/api-reference/get-ocr-data/) | | Scores | [`GET /omni/get/score?id=`](/api-reference/get-score/)| | Device info | [`GET /omni/get/device-info?id=`](/api-reference/get-device-info/)| | Images | [`POST /omni/get/images/v2?id=`](/api-reference/get-images-v2/) | | Session events | [`GET /omni/interview-events?interviewId=`](/api-reference/getevents/)| | Video selfie download URL | [`GET /omni/generateVideoSelfieDownloadUrl?interviewId=`](/api-reference/generatevideoselfiedownloadurl/)| | Authentication attempts | [`POST /omni/authentications/external/search`](/api-reference/authentications-external-search/)| | Custom fields | [`GET /omni/get/custom-fields`](/api-reference/get-custom-fields/)| **Images.** Use `POST /omni/get/images/v2`, documented at [`get-images-v2`](/api-reference/get-images-v2/) as "Fetch image links". It returns pre-signed download URLs valid for one hour. The v1 path `POST /omni/get/images` returns base64 instead, and responses over 10MB fail at the API gateway. New integrations should use v2. **Session age.** There is no age restriction on reads made with an admin token. A session from any point in the past can be read, provided its `interviewId` is known. Log in to obtain a token: ```bash curl -X POST 'https:///executive/log-in' \ --header 'api-version: 1.0' \ --header 'Content-Type: application/json' \ --data '{ "email": "", "password": "" }' ``` The response contains `token` (the admin token, a JWT), plus `refreshToken` and `incodeRefreshToken`. Reference: [`executive/log-in`](/api-reference/executive-log-in/). One admin token works across all sessions. Store it and reuse it rather than calling `/executive/log-in` for each request. The token expires after **24 hours** by default. Store the expiry alongside the token and request a new one before it lapses, rather than waiting for a call to fail. Refresh via `POST /executive/refresh`, passing the refresh token in the `X-Incode-Hardware-Id` header. The `incodeRefreshToken` is single-use and is invalidated on logout. :::warning An admin token together with the API key can read any session in the organization, including personal data. Store the token, the API key, and the admin user's credentials according to your own security policy. ::: ### After migration: remove the old path Remove any code path that calls `omni/start` with an existing `interviewId` or `externalId` in order to obtain a token for reading. Storing a session token is not an alternative. The session token TTL is configurable and currently defaults to 90 days; that default is being reduced to 20 minutes. ## Scenario 2: Resuming an interrupted session **Applies when:** a real user abandons a flow partway and the session is restarted so they can pick up where they left off. **What to do instead:** A solution for this scenario is in progress. This page will be updated when it is finalized and actionable. ## Scenario 3: Step-up and additional checks **Applies when:** an existing or completed session is reopened to run an extra verification step or collect another document: a signature, a proof of address, a tier upgrade, or a renewed terms acceptance. **What to do instead:** start a new session, begin it with authentication against the existing identity, and reference the original via `identityId` so both remain associated under one identity. ### A. Step-ups involving a signature (including NOM-151, AES, or QES) Development is underway to let a new session retrieve the signature and OCR data from the identity. Endpoint details will follow. ### B. Step-ups that do not involve a signature Examples include collecting a proof of address months after onboarding or upgrading an account tier. Existing behavior continues to work for now, and additional guidance will be provided separately. ## Scenario 4: Repeating a completed onboarding **Applies when:** a user completed onboarding successfully, and days, weeks, or months later the finished session is restarted rather than a new one created. The session was not interrupted partway; it completed. **What to do instead:** create a new session for each attempt. --- - Path: `general-reference/netherlands` - URL: https://developer.incode.com/general-reference/netherlands/ - Markdown: https://developer.incode.com/general-reference/netherlands.md # Netherlands eKYB Prefill in the Netherlands leverages the Netherlands' source of truth to automatically retrieve and populate business information based on a company's KvK number or RSIN, including the business name, registered address, entity type, registration status, directors, and additional corporate data, without requiring manual input from the user. ## Source | Country | Source | Description | | --- | --- | --- | | Netherlands | `NL_KYB_PREFILL` | Returns matching Dutch business details from the Netherlands' source of truth for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --- | --- | --- | | plugins | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | source | Mandatory | String. Must be `NL_KYB_PREFILL`. Identifies the Prefill source. | | country | Mandatory | String. Two-letter Alpha-2 country code. Must be `NL`. | | taxId | Mandatory | String. Dutch KvK number or RSIN. See Tax ID formats for details. | | businessName | Optional | String. Registered name of the business. When provided, adds `nameMatch` to the response. | | address | Optional | String. Business address as a freeform string. When provided, adds `addressMatch` to the response. | ### Tax ID formats The `taxId` field accepts two Dutch business identifier types. Routing between them is determined automatically by the format of the submitted value. | ID Type | Description | Format | Example | | --- | --- | --- | --- | | **KvK number** | Kamer van Koophandel registration number | 8 numeric digits | `12345678` | | **RSIN** | Rechtspersonen en Samenwerkingsverbanden Informatienummer | 9 numeric digits | `123456789` | Inputs that do not match either format return a 400 error. RSIN is not issued to sole traders — searching by RSIN will not return sole trader records. ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "NL_KYB_PREFILL", "country": "NL", "taxId": "12345678", "businessName": "Noorderlicht Ventures B.V.", "address": "Lindengracht 42, 1015 KJ Amsterdam, Netherlands" } ``` ### Sample response The Prefill response returns business data retrieved directly from the source of truth. Fields are returned as-is from the source. `nameMatch` and `addressMatch` are only present when `businessName` or `address` were submitted in the request. `vatNo` is absent for sole traders. Director position names and authority levels are returned in Dutch and are not translated. `shareholders` is typically absent for Dutch BV companies, as shareholder registers commonly show only an aggregate share capital figure. **Example 1 — Noorderlicht Ventures B.V. (sole trader)** ```json { "kyb-prefill": [ { "tin": "12345678", "name": "Noorderlicht Ventures B.V.", "nameMatch": "Verified", "address": "Lindengracht 42, 1015 KJ Amsterdam, Netherlands", "city": "Amsterdam", "postalCode": "1234RV", "entityType": "Sole trader with one owner", "registrationStatus": "Active", "registrationDate": "2012-12-11T00:00:00Z", "creditRating": "C", "creditRatingDescription": "Moderate Risk", "industryDesc": "Activities of Noorderlicht", "activityDesc": "Activities of Noorderlicht", "employeeCount": "1", "websites": ["www.daanvandijk.nl"], "directors": [ { "name": "Daan van Dijk", "positionName": "Eigenaar" } ], "otherNames": [ { "name": "Noorderlicht", "businessNameType": "Trading Name" } ] } ] } ``` **Example 2 — Noorderlicht Trader B.V. (private limited company)** ```json { "kyb-prefill": [ { "tin": "12345678", "vatNo": "123456789", "name": "Noorderlicht Trader B.V.", "nameMatch": "Verified", "address": ": "Tulpenlaan 27, 3511 AB Utrecht, Netherlands", "entityType": "Private limited liability company (BV) with ordinary structure", "registrationStatus": "Active", "registrationDate": "2019-12-17T00:00:00Z", "creditRating": "E", "creditRatingDescription": "Not Rated", "industryDesc": "Retail sale of motor vehicles", "activityDesc": "Retail sale of motor vehicles", "employeeCount": "2", "directors": [ { "name": "Daan van Dijk", "positionName": "Algemeen Directeur", "authority": "Alleen/zelfstandig bevoegd" }, { "name": "Daan van Dijk", "positionName": "Algemeen Directeur", "authority": "Alleen/zelfstandig bevoegd" } ], "otherNames": [ { "name": "Noorderlicht Trader B.V.", "businessNameType": "Trading Name" } ] } ] } ``` ### Response fields | Key | Value | Description | | --- | --- | --- | | tin | KvK number | The 8-digit Kamer van Koophandel registration number as confirmed by the source of truth. | | vatNo | RSIN | The 9-digit Rechtspersonen en Samenwerkingsverbanden Informatienummer as returned from the source of truth. Only present for legal entities — not issued to sole traders. | | name | Business name | The registered legal name of the business as returned from the source of truth. | | nameMatch | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the name on file. Only present when `businessName` was submitted in the request. See Name and address match values for details. | | address | Registered address | The primary registered address of the business as returned from the source of truth. | | addressMatch | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against the registered address on file. Only present when `address` was submitted in the request. See Name and address match values for details. | | city | City | The city of the registered address as returned from the source of truth. May not be present for all companies. | | postalCode | Postal code | The postal code of the registered address as returned from the source of truth. May not be present for all companies. | | entityType | Entity type | The legal form of the business as returned from the source of truth (for example, `Sole trader with one owner`, `Private limited liability company (BV) with ordinary structure`). Defaults to `Unknown` when not available. | | registrationStatus | Registration status | The current company status as returned from the source of truth (for example, `Active`). Defaults to `Unknown` when not available. | | registrationDate | Date | The date the company was registered, as returned from the source of truth. May not be present for all companies. | | creditRating | Credit rating value | The standardized credit rating value (for example, `C`, `E`). Defaults to `Unknown` when not available. | | creditRatingDescription | Credit rating description | A human-readable description of the credit rating (for example, `Moderate Risk`, `Not Rated`). | | industryDesc | Industry description | The primary activity description as returned from the source of truth (for example, `Retail sale of motor vehicles`). | | activityDesc | Activity description | The principal activity description as returned from the source of truth. For the Netherlands, this is typically identical to `industryDesc`. | | turnover | `{currency, value}` object | The latest turnover figure as returned from the source of truth. May not be present for all companies. | | employeeCount | String | The latest employee count as returned from the source of truth. Sourced from `additionalInformation.misc.employeeNumber`. Always returned as a string. May not be present for all companies. | | shareholders | Array of `{name, percentSharesHeld}` | Shareholders associated with the business as returned from the source of truth. Typically absent for Dutch BV companies — Dutch shareholder registers commonly surface only an aggregate share capital figure, not named shareholders. | | directors | Array of `{name, positionName, authority}` | Current directors and officers as returned from the source of truth. `positionName` and `authority` are returned in Dutch and are not translated (for example, `Algemeen Directeur`, `Alleen/zelfstandig bevoegd`). May not be present for all companies. | | otherNames | Array of `{name, businessNameType}` | Trading names associated with the business. `businessNameType` is always `"Trading Name"`. May not be present for all companies. | | otherAddresses | Array of `{type, otherAddress}` | Additional addresses on file, other than the primary registered address. May not be present for all companies. | | websites | Array of strings | Website URLs associated with the business as returned from the source of truth. May not be present for all companies. | ### Name and address match values | Status | Description | | --- | --- | | Verified | Exact match found against registry data. | | Approximate Match | Similar match found; may reflect minor differences in naming or address formatting. | | Unverified | No match found in registry data. | ### Registration status values | Status | Description | | --- | --- | | Active | The company is currently active and registered. | | Inactive | The company registration is dissolved, struck off, or no longer active. | | Unknown | The registration status could not be determined. | ## Error responses For standard HTTP response codes, see the API Error Response page. Netherlands Prefill returns the following country-specific 400 errors. `taxId` is missing, empty, or does not match a supported Dutch identifier format: ```json { "timestamp": 1782851408892, "status": 400, "error": "Bad Request", "message": "taxId must be a valid Dutch identifier: KvK number (8 digits) or RSIN (9 digits)", "path": "/omni/externalVerification/ekyb-prefill" } ``` Any mandatory field (`plugins`, `source`, `country`, or `taxId`) is missing: ```json { "timestamp": 1782851468367, "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` No business match is found for the submitted `taxId`: ```json { "timestamp": 1782851583695, "status": 200, "message": "No business found matching the provided tax ID.", "path": "/omni/externalVerification/ekyb-prefill" } ``` ## Single Session Dashboard results Prefill results are available on the Business tab in [Single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/oauth2-secured-sessions` - URL: https://developer.incode.com/general-reference/oauth2-secured-sessions/ - Markdown: https://developer.incode.com/general-reference/oauth2-secured-sessions.md # OAuth2 Secured Sessions OAuth2 Secured Sessions is a configurable setting in [Workflows](/dashboard-platform-administration/workflows-20/) and [Flows](/dashboard-platform-administration/flows-1/) that mitigates security risks associated with redirect-based webflows. When enabled, the Workflow or Flow runs as part of an OAuth 2.0 / OpenID Connect (OIDC) authorization flow. The onboarding process itself serves as the authentication step. After the user completes onboarding successfully, the authorization server issues an authorization code. When the **OAuth2 Secured** setting is enabled on a Workflow or Flow: - A dedicated OIDC client is automatically generated. This OAuth client ID is visible in the Workflow or Flow settings after saving. The client is configured with: - Authorization Code grant - Proof Key for Code Exchange (PKCE) S256 - The Workflow or Flow execution is part of an OIDC authentication process - A redirect URL becomes mandatory. - If you change this URL later, you must update it in the Workflow or Flow configuration and in all client authorize and token requests. Mismatches cause authorization failures. - Disabling and re-enabling the setting regenerates the OAuth client and invalidates the previous one. When a Workflow or Flow uses OAuth security, the legacy incodesmile.com URL scheme no longer works for that Flow ID. You must use the new URL scheme and authorization pattern described below. This prevents security gaps caused by manual URL tampering. ## Security Model The generated OAuth client uses Proof Key for Code Exchange (PKCE) ([RFC 7636](https://www.rfc-editor.org/rfc/rfc7636.txt)) and does not require a client secret. This makes the secured session flow suitable for Single Page Applications (SPAs), mobile applications, or any client unable to securely store secrets. PKCE protects the authorization code from interception by binding it to a cryptographically random verifier known only to the client. ## OpenID Connect (OIDC) Authorization Flow The following diagram shows the sequence of a successful onboarding using OIDC: ![Sequence diagram showing a successful OIDC onboarding flow between client, authorization server, and Omni API](https://developer.incode.com/assets/cd744109a99270c1f5b6c23f89b6399f.png) The following diagram shows the sequence of a failed onboarding using OIDC: ![Sequence diagram showing a failed OIDC onboarding flow with error response](https://developer.incode.com/assets/bb882966324df926bca1f58389f5138b.png) ### Step 1: Authorization Request (`/oauth2/authorize`) Before initiating the authorization request, the client must: 1. Generate a cryptographically random `code_verifier` and store it 2. Compute the `code_challenge` by hashing the `code_verifier` with SHA-256 3. Generate a `state` parameter that is used for CSRF protection. The value should be: - Cryptographically random - High entropy (unguessable) - Unique per authorization request Store `state` in memory for SPAs, or in a secure session cookie or session-keyed in-memory cache for a Backend for Frontend (BFF) layer. For more detail, see [RFC 6749 §10.12](https://datatracker.ietf.org/doc/html/rfc6749#section-10.12). 4. Generate a `nonce` parameter to prevent ID token replay attacks. The value should be: - High-entropy - Unique per authentication request - Same quality as state Store `nonce` the same way you store `state`. For more detail, see the [OIDC nonce notes](https://openid.net/specs/openid-connect-core-1_0.html#NonceNotes). The well-known endpoint for automatic discovery of configuration, endpoints, and key sets is at [https://auth.incode.com/.well-known/openid-configuration](https://auth.incode.com/.well-known/openid-configuration). #### Authorization Request Parameters | Parameter | Description | | :------------------------------------- | :-------------------------------------------------------------------------------------- | | `client_id` | OAuth Client ID generated and stored in the Workflow/Flow settings. | | `redirect_uri` | Redirect URI configured in the Workflow/Flow settings. | | `response_type` | `code` | | `scope` | `openid` | | `state` | Opaque value used to maintain request/response integrity | | `nonce` | Value used to associate the ID Token with the client session and prevent replay attacks | | `code_challenge_method` | `S256` | | `code_challenge` | Generated PKCE challenge | | `response_mode` | `form_post` | | `external_customer_id`
          _Optional_ | ID that identifies user in clients external system | Example Authorization Request ```text Request https://auth.incode.com/oauth2/authorize ?client_id={client_id} &redirect_uri={redirect_uri} &scope=openid &response_type=code &response_mode=form_post &state={state} &nonce={nonce} &code_challenge_method=S256 &code_challenge={codeChallenge} &external_customer_id={external_customer_id} ``` Here's what this request does: - The user is redirected to the Incode authorization server. - The associated Workflow or Flow runs as part of the `/authorize` endpoint. - If onboarding succeeds: - The user is redirected back to `redirect_uri`. - An authorization code and `state` are returned in the URL. - The client must verify the `state` parameter on callback by comparing the returned value to the stored one. If it's missing or doesn't match, abort the process. - If onboarding fails: - The user is redirected back to `redirect_uri`. - Error and error description parameters are included in the URL (see the [OIDC error spec](https://openid.net/specs/openid-connect-core-1_0.html#AuthError)). ### Step 2: Token Exchange (`/oauth2/token`) The client exchanges the authorization code for tokens. Client authenticates using the `code_verifier` generated in [Step 1](/general-reference/oauth2-secured-sessions/#step-1-authorization-request-oauth2authorize). #### Token Request Parameters | Parameter | Description | | :-------------- | :--------------------------------------------------------------------------------------------------------------------------------------- | | `grant_type` | `authorization_code` | | `code` | Authorization code from [Step 1](/general-reference/oauth2-secured-sessions/#step-1-authorization-request-oauth2authorize) | | `client_id` | Client ID used in the authorize request | | `redirect_uri` | Redirect URI used in the authorize request | | `code_verifier` | Original PKCE code verifier | #### Example Token Response Body ```json Response { "access_token": "eyJraWQiOiI2MzM2NjAy....zAZ4-FboQg", "scope": "openid profile", "id_token": "eyJraWQiOiI2MzM2NjAyYy05....O3dDfO13Yyg", "token_type": "Bearer", "expires_in": 86399 } ``` After a successful response, client must validate ID token. Validation must confirm that: - The issuer identifier exactly matches the `iss` claim. - The `aud` claim contains the client's `client_id` value. - The JWS signature is valid, using the algorithm in the JWT header and the public key from the issuer's well-known JWKS endpoint. - The current time is before the `exp` claim. - The `nonce` claim exactly matches the `nonce` value the client sent in the authentication request. Access token validation is the responsibility of the Omni server, and happens in [Step 3](/general-reference/oauth2-secured-sessions/#step-3-api-access). ### Step 3: API Access Use the `access_token` from [Step 2](/general-reference/oauth2-secured-sessions/#step-2-token-exchange-oauth2token) as a Bearer token in the `Authorization` header instead of the `x-incode-hardware-id` header. The token: - Is required to access Omni APIs - Is bound to a single session - Follows standard OAuth 2.0 token validation rules #### Example curl request with OAuth Secured Workflows/Flows ```curl curl request curl --location 'https://saas-api.incodesmile.com/omni/get/score' \ --header 'Content-Type: application/json' \ --header 'api-version: 1.0' \ --header 'x-api-key: 13cf313e0db1507e77bf8d0631f3ca736173ccde' \ --header 'Authorization: Bearer eyJraWQiOiI2MzM2Nj.....Lf_N7hww' ``` You can use this token with the following endpoints: - `omni/get/score` - `omni/get/custom-fields` - `omni/get/onboarding/status` - `omni/get/ocr-data`
          --- - Path: `general-reference/onboarding-status-webhook` - URL: https://developer.incode.com/general-reference/onboarding-status-webhook/ - Markdown: https://developer.incode.com/general-reference/onboarding-status-webhook.md # Onboarding status webhook The Onboarding Status Webhook sends notifications to your specified server URL in real time when a module completes and thus the onboarding status changes. These notifications indicate the current state of the onboarding interview. Depending on the number of modules in the session Flow or Workflow, this could be more notifications than you need or want. If you only want notification for a specific event, [session webhooks](/general-reference/session-webhooks/) may be a better fit for your needs. You can configure a session webhook for each of these statuses: `Session_Started`, `Session_Failed`, `Session_Succeeded`, and `Session_Pending_Review`. Each webhook triggers for only the single session event noted. ## Onboarding Statuses Onboarding statuses occur sequentially and describe the processing state of the interview. See below for a description of each status and the order in which it occurs. 1. `UNKNOWN`: 1. A session has a status of unknown when it has not been started by the user. For example, this could happen when an onboarding URL is shared with a customer, but the customer has not yet clicked the link to begin the session. **You will not receive a webhook notification for unknown status. This status can be determined by calling the endpoint [get session status](/api-reference/session-status-get)** . 2. `ID_VALIDATION_FINISHED` 1. For Webflows and Workflows that perform ID validation, the `ID_VALIDATION_FINISHED` webhook indicates that the processes for the ID validation modules are complete. Although the overall session data is not complete at this point, it is possible to fetch some elements, such as the OCR data and ID validation score. 3. `ID_VALIDATION_FINISHED_SECOND_ID` 1. For Webflows and Workflows that perform ID validation, the `ID_VALIDATION_FINISHED_SECOND_ID` webhook indicates that the processes for the second ID validation modules are complete (If applicable). Although the overall session data is not complete at this point, it is possible to fetch some elements, such as the OCR data and ID validation score. 4. `GOVERNMENT_VALIDATION_FINISHED` 1. Government validation occurs after ID validation and indicates that the tests associated with government validation are complete. Similarly to `ID_VALIDATION_FINISHED`, once the `GOVERNMENT_VALIDATION_FINISHED `notification is received, preliminary results can be fetched via the API. While this is possible, we recommend waiting until the `ONBOARDING_FINISHED` notification is received to ensure that all results are finalized. 5. `FACE_VALIDATION_FINISHED` 1. Face validation requires two images for comparison. The first comparison image is taken from the ID portrait photo during the ID validation process and the second comparison photo is acquired from the selfie capture process. As a result, face validation occurs after ID validation and the selfie capture process. If government validation is part of the flow, the `FACE_VALIDATION_FINISHED` notification will generally occur subsequently to `GOVERNMENT_VALIDATION_FINISHED`. 6. `POST_PROCESSING_FINISHED` 1. Post processing indicates that all collected raw interview data is done processing. 7. `POST_PROCESSING_FINISHED_SECOND_ID` 1. Post processing indicates that all collected raw interview data is done processing for the second ID (if applicable). 8. `ONBOARDING_FINISHED` 1. The `ONBOARDING_FINISHED` notification indicates that all data has been collected and processed, any custom business rules have been applied, the session status has been updated to its final determination, and the user has exited the flow. We recommend waiting for this status before fetching session data. 9. `MANUAL_REVIEW_APPROVED` 1. This notification occurs after `ONBOARDING_FINISHED` once a session with a `MANUAL` status is reviewed and manually approved through the Incode dashboard. This will occur subsequent to an `ONBOARDING_FINISHED` notification. 10. `MANUAL_REVIEW_REJECTED` 1. This notification occurs after `ONBOARDING_FINISHED` once a session with a `MANUAL` status is reviewed and manually rejected through the Incode dashboard. This will occur subsequent to an `ONBOARDING_FINISHED` notification. 11. `EXPIRED` 1. This notification occurs when an expired time limit is set on a flow configuration and the user surpasses the expiration time limit by abandoning the session. When the user returns to an expired session, it will display a session expiration screen. 12. `DELETED` 1. This notification occurs when a session's data has been deleted. Take into account that sessions might not be deleted instantly, since data deletion is placed in a queue. This webhook will contain a field `interviewIds` instead of `interviewId`. The field is a string array with 1 or more interview IDs which have just been deleted. ## Endpoint Details `POST https://{your-defined-url}` ### Request Below is an example of the payload that you will get when the webhook triggers ```json Sample request payload { "clientId": "MyClientId001", "flowId": "66969519eb1d789a96347ca7", "interviewId": "664283755e0f8e1b87fcc2ce", "externalCustomerId": "MyCustomerID#0001", // only if an externalCustomerId was specified on the omni/start endpoint "onboardingStatus": "ONBOARDING_FINISHED" // see above for possible values } ``` If you are [authenticating your webhook requests](/general-reference/authorizing-webhooks-requests/) , the webhook will contain the `Authorization` header along with the OAuth2.0 bearer token: `Authorization: Bearer ` If you configured additional custom headers, they will be included as well. ### Response To avoid our [retry policy](/general-reference/webhooks-overview/#retry-policy) to keep sending the same notification over and over, make sure your endpoint returns one of the following: * Status code `204 No content` * Status code `200 OK` with a response type `application/json`, for example `{ "success" : true }` ```json Sample response { "success" : true } ``` --- - Path: `general-reference/payment-proof-webhook` - URL: https://developer.incode.com/general-reference/payment-proof-webhook/ - Markdown: https://developer.incode.com/general-reference/payment-proof-webhook.md # Proof of payment webhook For customers in Mexico that need to verify documents such as utility bills, the payment proof webhook provides the payment proof data as soon as all asynchronous processes are complete and the data is available. This webhook is the recommended method for receiving payment proof data. ## Triggering the Payment Proof Webhook In order to trigger the payment proof webhook, the following API endpoints must be called in order: 1. First create a flow and call the [Start onboarding](https://developer.incode.com/api-reference/start/) endpoint. 2. Call the `omni/add/qr-code-text` endpoint. You can find additional documentation API docs [here](https://developer.incode.com/api-reference/add-qr-code-text/). This will add the QR code text as a custom field to the session started in step #1. Below is an example cURL request. 3. Lastly, call the `omni/process/payment-proof` [endpoint](https://developer.incode.com/api-reference/process-payment-proof/). Once processing is complete a webhook containing the payment proof data will be sent the URL specified in the configuration tab of the dashboard. If you haven't configured your callback URL yet, see the our webhook introduction [page](/general-reference/webhooks-overview/). Below is an example cURL request. ``` curl --location --request POST 'https://demo-api.incodesmile.com/omni/process/payment-proof' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --header 'api-version: 1.0' \ --header 'x-api-key: YOUR API KEY' \ --header 'X-Incode-Hardware-Id: YOUR SESSION TOKEN' \ --data '' ``` ## Endpoint Details `POST https://{your-defined-url}` ### Request Below is an example of the payload that you will get when the webhook triggers ```json Sample request payload { "requestId": "cba1e997-sbaf-1234-abc5-n456bb2343c3", "rfcIssuer": "SLI1234567", "issuerName": "SOME ISSUER NAME", "rfcReceiver": "MP1231231", "receiverName": "SOME CLIENT NAME", "fiscalInvoice": "SOME FISCAL INVOICE ID", "issueDate": "2025-06-19T12:33:20", "certificationDate": "2025-06-19T12:33:20", "rfcPac": "MBS42143234", "totalCfdi": "$1,962.36", "voucherEffect": "Nómina", "cancellationStatus": "Cancelable sin aceptación", "validationCode": "fc413452345.34563", "status": "OK" } ``` If you are [authenticating your webhook requests](/general-reference/authorizing-webhooks-requests/), the webhook will contain the `Authorization` header along with the OAuth2.0 bearer token: `Authorization: Bearer ` If you configured additional custom headers, they will be included as well. ### Response To avoid our [retry policy](/general-reference/webhooks-overview/#retry-policy) to keep sending the same notification over and over, make sure your endpoint returns one of the following: * Status code `204 No content` * Status code `200 OK` with a response type `application/json`, for example `{ "success" : true }` ```json Sample response { "success" : true } ``` --- - Path: `general-reference/portugal` - URL: https://developer.incode.com/general-reference/portugal/ - Markdown: https://developer.incode.com/general-reference/portugal.md # Portugal eKYB Prefill in Portugal leverages Portugal's source of truth to automatically retrieve and populate business information based on a company's NIF, including the business name, entity type, registration status, registration date, credit rating, and other corporate details, without requiring manual input from the user. ## Source | Country | Source | Description | | --- | --- | --- | | Portugal | `PT_KYB_PREFILL` | Returns matching Portuguese business details from Portugal's source of truth for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --- | --- | --- | | `plugins` | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | `source` | Mandatory | String. Must be `PT_KYB_PREFILL`. Identifies the Prefill source. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `PT`. | | `taxId` | Mandatory | String. NIF (Número de Identificação Fiscal). See [Tax ID formats](#tax-id-formats) for details. | | `businessName` | Optional | String. Registered business name, used to verify the match against the source of truth. | | `address` | Optional | String. Business address, used to verify the match against the source of truth. | ### Tax ID formats The NIF (Número de Identificação Fiscal) is the Portuguese tax identifier. It serves as both the company registration number and the VAT number — no separate VAT identifier exists for Portugal. Requests with an invalid format return a 400 error. | Entity Type | Format | | --- | --- | | NIF | 9 numeric digits (e.g. `123456789`) | ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "PT_KYB_PREFILL", "country": "PT", "taxId": "123456789", "businessName": "", "address": "" } ``` ### Sample response The Prefill response returns business data retrieved directly from the source of truth. Passthrough fields are returned as-is from the source, without fuzzy matching or verification scoring. Match fields (`nameMatch`, `addressMatch`) are only returned when the corresponding input (`businessName`, `address`) was submitted. Field availability varies by entity type and size — see the notes under each example below. **Example 1 — large public company (no group structure)** ```json { "kyb-prefill": [ { "tin": "123456789", "vatNo": "123456789", "name": "SAMPLE ENERGY SA", "nameMatch": "Verified", "address": "Av. Sample, nº 12, 1000-000, LISBOA, LISBOA", "city": "LISBOA", "postalCode": "1000-000", "entityType": "Joint Stock Company", "registrationStatus": "Active", "registrationDate": "1991-01-22T00:00:00Z", "creditRating": "A", "creditRatingDescription": "Very Low Risk", "industryDesc": "Activities of corporate headquarters", "activityDesc": "Activities of corporate headquarters", "turnover": { "currency": "EUR", "value": 326830000 }, "employeeCount": "617", "websites": ["http://www.sampleenergy.example"], "shareholders": [ { "name": "EXAMPLE CAPITAL INC", "percentSharesHeld": 8.35 }, { "name": "SAMPLE HOLDINGS GROUP", "percentSharesHeld": 22.2 } ], "directors": [ { "name": "MARIA SAMPLE SILVA", "positionName": "Board of Director's President" } ] } ] } ``` *(`ultimateParent`/`immediateParent` omitted — this entity sits at the top of its own group.)* **Example 2 — small company with a parent (no directors)** ```json { "kyb-prefill": [ { "tin": "987654321", "vatNo": "987654321", "name": "SAMPLE DREAM FACTORY LDA", "nameMatch": "Verified", "address": "Rua Sample, nº 41, 4000-000, VALONGO, PORTO", "city": "VALONGO", "postalCode": "4000-000", "entityType": "Private Limited Company", "registrationStatus": "Active", "registrationDate": "2009-07-16T00:00:00Z", "creditRating": "A", "creditRatingDescription": "Very Low Risk", "industryDesc": "Web search portal activities", "activityDesc": "Web search portal activities", "turnover": { "currency": "EUR", "value": 227214 }, "employeeCount": "2", "websites": ["http://www.sampledreamfactory.example"], "shareholders": [ { "name": "EXAMPLE EVENTOS LDA", "percentSharesHeld": 5 }, { "name": "SAMPLE NETWORK LDA", "percentSharesHeld": 71 }, { "name": "EXAMPLE HOLDING LDA", "percentSharesHeld": 24 } ], "ultimateParent": { "name": "SAMPLE NETWORK LDA", "country": "PT" }, "immediateParent": { "name": "SAMPLE NETWORK LDA", "country": "PT" }, "otherAddresses": [ { "otherAddress": "Rua Sample, nº 41 4000-000" }, { "otherAddress": "RUA EXAMPLE JUNQUEIRO, 495, 1º, SALA E 4100-000" } ] } ] } ``` **Example 3 — small, single-owner company** ```json { "kyb-prefill": [ { "tin": "456789123", "vatNo": "456789123", "name": "SAMPLE INOVACAO AMBIENTAL LDA", "nameMatch": "Verified", "creditRating": "A", "creditRatingDescription": "Very Low Risk", "industryDesc": "Other physical and natural science research and development", "activityDesc": "Other physical and natural science research and development", "turnover": { "currency": "EUR", "value": 449780 }, "employeeCount": "5", "websites": ["http://www.sampleinovamb.example"], "shareholders": [ { "name": "SAMPLE INVESTIMENTOS SGPS SA", "percentSharesHeld": 100 } ], "directors": [ { "name": "JOAO SAMPLE ROQUE", "positionName": "Manager" } ] } ] } ``` > **Info** > Field availability differs across companies, regardless of entity type or size. `directors`, `shareholders`, `ultimateParent`, `immediateParent`, `city`, `postalCode`, `otherAddresses`, and `websites` may all be absent for a given company — this is expected and does not indicate an error. ### Response fields | Key | Value | Description | | --- | --- | --- | | `tin` | NIF | Company registration number, as returned from the source of truth. | | `vatNo` | NIF | The VAT registration number. Identical to `tin` for Portugal, since the NIF serves both purposes. | | `name` | Business name | The registered legal name of the business as returned from the source of truth. | | `nameMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the registered name. Only returned when `businessName` is submitted. | | `address` | Address | The registered business address as returned from the source of truth. | | `addressMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against the registered address. Only returned when `address` is submitted. | | `city` | City | The city associated with the registered business address, when available. | | `postalCode` | Postal code | The postal code associated with the registered business address, when available. | | `entityType` | Entity type | The legal entity type of the business (e.g. Joint Stock Company, Private Limited Company). Defaults to "Unknown" when not available. | | `registrationStatus` | Active, Expired, Unknown, Not Found | Current registration status of the business. Defaults to "Unknown" when not available. | | `registrationDate` | Date | The date the business was registered. May not be available for all entities. | | `creditRating` | Rating value (e.g. A, C) | The business's credit rating, as returned from the source of truth. Defaults to "Unknown" when not available. | | `creditRatingDescription` | Description (e.g. Very Low Risk) | Human-readable description of the credit rating. Defaults to "Unknown" when not available. | | `industryDesc` | Industry description | Description of the business's main activity. | | `activityDesc` | Activity description | Description of the business's principal activity. Identical to `industryDesc` for Portugal. | | `turnover` | `{currency, value}` object | The business's latest reported turnover figure. | | `employeeCount` | Number (as string) | Latest reported number of employees, if available. | | `websites` | Array of strings | Websites associated with the business, if available. | | `otherAddresses` | Array of `{otherAddress}` | Addresses associated with the business other than the main registered address, if any. No `type` label is provided in the source data for Portugal. | | `shareholders` | Array of `{name, percentSharesHeld}` | Shareholder information, if available. | | `directors` | Array of `{name, positionName}` | Directors associated with the business, if available. | | `ultimateParent` | `{name, country}` | The business's ultimate parent company, if the business is a subsidiary. Absent when the entity sits at the top of its own group. | | `immediateParent` | `{name, country}` | The business's immediate parent company, if the business is a subsidiary. Absent when the entity sits at the top of its own group. | ## Error responses For standard HTTP response codes, see the API Error Response page. Portugal Prefill returns the following country-specific 400 errors. `taxId` is missing, empty, or not a 9-digit NIF: ```json { "status": 400, "error": "Bad Request", "message": "taxId must be a valid Portuguese NIF: 9 numeric digits", "path": "/omni/externalVerification/ekyb-prefill" } ``` Any mandatory field (`plugins`, `source`, `country`, or `taxId`) is missing: ```json { "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` No business match is found for the submitted taxId: ```json { "timestamp": 1782851583695, "status": 200, "message": "No business found matching the provided tax ID.", "path": "/omni/externalVerification/ekyb-prefill" }` ``` ## Single Session Dashboard results Prefill results are available on the **Business** tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/rate-limits` - URL: https://developer.incode.com/general-reference/rate-limits/ - Markdown: https://developer.incode.com/general-reference/rate-limits.md # API Rate Limits The Incode Omni API uses a token bucket algorithm to enforce rate limits. It's important to understand how limits work and how to handle them gracefully. This will help you build integrations that stay within bounds under normal conditions. It will also help you recover cleanly when limits are reached. ## How Rate Limiting Works Each API endpoint belongs to one of three categories. Each category has its own independent token bucket. When you make a request, one token is consumed from that category's bucket. If the bucket is empty, the request is rejected with a `429 Too Many Requests` response. Buckets refill automatically at a fixed rate (`maxRps`) up to their maximum capacity (`burst`). The burst value defines the maximum number of requests you can make in a single second before the bucket empties. ## Endpoint Categories and Limits | Category | Endpoints | maxRps | Burst | | :--- | :--- | :--- | :--- | | `SUPER_HEAVY` | ID capture and processing (`add/front`, `add/back`, `process/id`) | 1 req/sec | 5 | | `HEAVY` | Face capture and processing (`add/face`, `process/face`) | 1 req/sec | 5 | | `OTHER` | All other endpoints | 100 req/sec | 50 | The category for a given endpoint is fixed. You cannot move endpoints between categories or configure per-endpoint limits. For special cases where the default limits are insufficient, contact your Incode Customer Success representative. ## Reading a Rate Limit Example The `SUPER_HEAVY` bucket has a burst capacity of 5. If you send 5 requests to `add/front` within the same second, the bucket empties and any additional requests within that second return `429 Too Many Requests`. The bucket then refills at 1 token per second until it reaches capacity again. In practice, a typical onboarding session might call `add/front`, `add/back`, and `process/id` sequentially. Thus, a single session's document capture flow consumes 3 tokens. The burst capacity of 5 accommodates a small amount of concurrent sessions. High-volume production traffic will approach limits in the `SUPER_HEAVY` category more quickly than in `OTHER`. ## Handling 429 Responses When your integration receives a `429` response, do not retry immediately. Implement an exponential backoff strategy: 1. On the first `429`, wait before retrying. 2. Double the wait time on each subsequent retry. 3. Add a small random jitter to prevent synchronized retries across concurrent requests. 4. Set a maximum retry count or total wait time to avoid indefinite loops. ```javascript async function requestWithBackoff(fn, maxRetries = 4) { let delay = 1000; {/* start with 1 second */} for (let attempt = 0; attempt <= maxRetries; attempt++) { try { return await fn(); } catch (err) { if (err.status !== 429 || attempt === maxRetries) throw err; const jitter = Math.random() * 500; await new Promise(res => setTimeout(res, delay + jitter)); delay *= 2; } } } ``` ## Request and Response Size Limits Two additional constraints apply regardless of rate category: - **Maximum request/response size:** 10 MB. Images and files larger than 10 MB cannot be uploaded or retrieved. - **Request timeout:** 30 seconds. Any request that exceeds this limit returns a timeout error. --- - Path: `general-reference/reference-section` - URL: https://developer.incode.com/general-reference/reference-section/ - Markdown: https://developer.incode.com/general-reference/reference-section.md # General Reference This section answers quick, standalone questions that come up across integrations: what Incode supports, what a code or status means, and how a session or session type behaves. It's built for both developers and business users, and it's meant to be searched rather than read start to finish. For deeper implementation detail, see the Helpful Links below. ## Coverage and Compatibility These pages help you confirm whether Incode supports a country, ID type, language, or system before you build against it: - [Incode Coverage Hub](/general-reference/coverage-hub/): A starting point for geographic coverage, linking out to the specific reference pages below. - [Supported Languages](/general-reference/supported-languages/): The languages available across Incode's SDKs and dashboard experiences. - [Supported IDs](/general-reference/supported-ids/): ID document types Incode can process, by country. - [Supported Digital IDs](/general-reference/supported-digital-ids/): Digital ID formats and issuing authorities Incode supports, by region. - [System of Records Verification](/general-reference/government-verification-sources/): Government and third-party systems of record available for identity verification, by country. ## Errors and Troubleshooting Use this group when something failed and you need to know what a code or message means. - [API Error Codes](/general-reference/api-error-codes/): Consolidated list of API error codes and their meanings. - [SDK Error Handling](/general-reference/sdk-error-handling/): Common SDK-level errors and how to handle them in your integration. ## Sessions, Limits, and Security Use this group to understand session behavior, request limits, and authentication requirements. - [Incode Session Statuses](/general-reference/session-statuses/): The full list of session statuses and what each one means. - [API Rate Limits](/general-reference/rate-limits/): Request limits by endpoint and plan. - [OAuth2 Secured Sessions](/general-reference/oauth2-secured-sessions/): How OAuth2 authentication applies to session security. ## Webhooks - [Incode Webhooks](/general-reference/webhooks-overview/): Catalog of webhook events for onboarding, session status changes, and authentication, with payload details for each. ## eKYB Reference - [eKYB Reference](/general-reference/ekyb-verification-api-reference): Country coverage, response fields, and country-specific detail for eKYB verification. ## eKYC Reference - [eKYC Reference](/general-reference/ekyc-reference/): Reason codes and explanations specific to eKYC customers. ## Module and Integration References Specialized references for specific modules and integration patterns. - [Fetching Crosscheck Results](/general-reference/fetching-crosscheck-results/): How to fetch and read Cross Check comparison results via API. - [Accessibility Manifest](/general-reference/accessibility): Accessibility conformance information for Incode SDKs and dashboard experiences. ## Helpful Links The following pages and sections contain more specialized reference information: - API Reference section, linked at the top of each page - [SDK Reference section](/sdk-reference/sdk-reference/), linked in the left navigation menu - [Incode Glossary](/get-started-with-incode/glossary/) --- - Path: `general-reference/sdk-error-handling` - URL: https://developer.incode.com/general-reference/sdk-error-handling/ - Markdown: https://developer.incode.com/general-reference/sdk-error-handling.md # SDK Error Handling Incode SDKs surface errors differently from the Omni API. Rather than HTTP status codes, SDK errors appear as typed values delivered through callbacks, delegate methods, or state machine transitions — depending on the platform and integration path. This page covers error handling for the Web SDK 2.0, iOS SDK, and Android SDK. For API error codes, see [API Error Codes](/general-reference/api-error-codes/). *** ## Error Handling Model by Platform Before diving into platform specifics, it helps to understand the structural difference between how each SDK surfaces errors: | Platform | Fatal flow errors | Module-level errors | Configuration errors | | --------------- | --------------------------------------------------------------- | ----------------------------------------------------- | -------------------------------------------------- | | **Web SDK 2.0** | `error` state on manager; `onError` callback on `` | `captureStatus === 'uploadError'` on capture managers | Thrown at runtime for unrecognized workflow steps | | **iOS** | `onError(_ error: IncdFlowError)` delegate method | Per-module result error enums (e.g. `NFCScanError`) | Runtime. No dedicated configuration exception | | **Android** | `onError(error: Throwable)` listener method | `resultCode` on module result objects | `ModuleConfigurationException` thrown at `build()` | *** ## Web SDK 2.0 The Web SDK 2.0 uses a state machine model. Every manager exposes an `error` terminal state, and the `` component surfaces fatal errors via a callback. ### Fatal Errors **Headless managers** (Phone, Email, Selfie, ID Capture, Workflow, Orchestrated Flow) all share the same `error` state shape: ```typescript // Subscribe to state changes on any manager manager.subscribe((state) => { if (state.status === 'error') { console.error('Fatal error:', state.error); // state.error is a string describing the failure } }); ``` ``** component** surfaces fatal errors via its `onError` callback: ```typescript flow.onError = (error: string | undefined, errorCode?: number) => { console.error('Flow error:', error, errorCode); }; ``` | Property | Type | Description | | ----------- | --------------------- | ---------------------------------------------------------------------------------------- | | `error` | `string \| undefined` | Human-readable description of the error | | `errorCode` | `number` (optional) | Numeric error code providing additional detail. See review note 1 for documentation gap. | The **Workflow manager** error state also includes an optional `errorCode`: ```typescript // WorkflowState when status === 'error' { status: 'error', error: string, errorCode?: number } ``` ### Capture Errors During active capture, errors surface as sub-state properties rather than as a separate `error` state. These are inline failures the user can retry, not fatal flow terminations. **Selfie and ID Capture managers** — when `captureStatus === 'uploadError'`: | Property | Type | Description | | ------------------------ | --------- | ----------------------------------------- | | `uploadError` | `string?` | Error code identifying the upload failure | | `uploadErrorMessage` | `string?` | Human-readable error message | | `uploadErrorDescription` | `string?` | Detailed error description | Retry is available when `canRetry === true`. Call `manager.retryCapture()` to retry. ### Camera Permission Errors When `status === 'permissions'` and `permissionStatus === 'denied'`, the user has denied camera access. This is not a fatal error. Prompt the user to enable camera permissions in their browser settings, then call `manager.requestPermission()` again. ### Unrecognized Workflow Steps (Headless Mode Only) In headless mode using `createOrchestratedFlowManager`, if the workflow returns a step whose module key is not registered, the manager throws: ``` "No registered module found for: " ``` This does not apply to the `` component, which renders a fallback "Module not available" screen and advances the flow automatically. *** ## iOS SDK The iOS SDK uses a delegate pattern. Fatal flow errors are delivered to a single `onError` method on `IncdOnboardingDelegate`, while module-level errors are returned as typed enum values within each module's result struct. ### Fatal Flow Errors All fatal errors during an onboarding flow are delivered via: ```swift func onError(_ error: IncdFlowError) { // Handle fatal flow error } ``` The documented `IncdFlowError` cases are: | Case | Description | | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------- | | `.interrupted` | The flow was interrupted programmatically via `forceInterrupt()` or `dismiss(forceInterrupt: true)`. | | `.apiKeyRevoked(apiKey)` | The API key used to initialize the SDK was revoked mid-session. The associated value contains the revoked key. Use this case to trigger API key rotation. | :::info When `.apiKeyRevoked` is received, reinitialize the SDK with a new API key using `IncdOnboardingManager.shared.initIncdOnboarding(url:apiKey:)`, then restart or resume the session. See [API Key Rotation](/sdk-reference/ios-api-key-rotation) for full details. ::: ### Handling Programmatic Interruption To force-stop the current flow: ```swift // Attempt to mark session as finished, then trigger onError(.interrupted) IncdOnboardingManager.shared.forceInterrupt(tryFinishingFlow: true) { success, error in // Cleanup complete } // Or dismiss without finishing: IncdOnboardingManager.shared.dismiss(forceInterrupt: true) ``` ### Module Result Errors Each module callback returns a result struct that includes an error property. Errors here indicate a module-level failure, not necessarily a fatal flow error. #### AES (Advanced Electronic Signature) ```swift func onAesCompleted(_ result: AESResult) { if let error = result.error { // Handle AES error } } ``` `AESError` values: | Value | Description | | --------------- | -------------------------------------------------------------- | | `.noDocuments` | No documents are available for the current onboarding session. | | `.failedToSign` | The AES signing operation failed. | #### NFC Scan ```swift func onNFCScanCompleted(_ result: NFCScanResult) { if let error = result.error { // Handle NFC error } } ``` `NFCScanError` values: | Value | Description | | -------------------------- | ---------------------------------------------------------------------------------------------- | | `.error(IncdError)` | An underlying SDK error occurred. The associated `IncdError` value provides additional detail. | | `.notAvailable` | NFC scanning is not available on this device. | | `.userDocumentHasNoChip` | The user indicated their document does not have an NFC chip. | | `.noScanAttemptsRemaining` | The user exhausted all NFC scan attempts without success. | #### Face Login/Selfie Scan Face login results include a `SelfieScanError` in the `error` property of `SelfieScanResult`. Spoof detection is surfaced separately via the `spoofAttempt` boolean: ```swift IncdOnboardingManager.shared.startFaceLogin() { result in if let error = result.error { // A SelfieScanError occurred } if result.spoofAttempt == true { // Liveness check failed — spoof detected } } ``` ### On-Demand Resources Error If you are using On-Demand Resources (ODR) and call an onboarding method before the resources have been downloaded, the method returns a `.resourcesNotFound` error. Always call `downloadOnDemandResources()` and wait for `onCompleted` before starting any onboarding modules. ### Simulator Behavior On iOS Simulator, modules that require the camera (`ID Scan`, `Selfie Scan`, `Video Selfie`, and others) show a black screen for 2 seconds, then return `.simulatorDetected` and advance to the next module. Ensure `testMode: true` is set during initialization when running on Simulator. *** ## Android SDK The Android SDK uses a listener pattern. Fatal errors are delivered as `Throwable` objects to `onError()` on `OnboardingListener`. Module results carry a `ResultCode` indicating the outcome. ### Fatal Flow Errors ```kotlin override fun onError(error: Throwable) { // Fatal flow error — log error.message for details IncodeWelcome.getInstance().deleteUserLocalData() } ``` ```java @Override public void onError(@NonNull Throwable error) { // Fatal flow error — log error.getMessage() for details IncodeWelcome.getInstance().deleteUserLocalData(); } ``` :::warning Always call `IncodeWelcome.getInstance().deleteUserLocalData()` in `onError()`, `onSuccess()`, and `onUserCancelled()` to ensure local session data is cleaned up regardless of how the flow exits. ::: Unlike the iOS SDK, Android does not use a typed error enum for fatal flow errors. The `Throwable` message is the primary source of diagnostic information. ### Module Result Codes Every module result object includes a `resultCode` property of type `ResultCode`. This indicates the high-level outcome of the module: | Value | Description | | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `SUCCESS` | The module completed successfully. | | `ERROR` | The module encountered an error. Check the result object for additional details. | | `USER_CANCELLED` | The user cancelled the module. | | `EMULATOR_DETECTED` | The module was running on an emulator. After a 2-second delay, the module returns this code automatically. Remove `setTestModeEnabled(true)` before production builds. | For `ID Scan` specifically, emulator detection is returned as `IdResults.RESULT_EMULATOR_DETECTED` on the `frontIdResult` and `backIdResult` properties rather than via `ResultCode`. ### Configuration Errors `FlowConfig.Builder.build()` throws `ModuleConfigurationException` synchronously if the flow configuration violates module rules; for example, if mandatory modules are omitted or ordering dependencies are violated. Catch this at build time: ```kotlin try { val flowConfig = FlowConfig.Builder() .addID(IdScan.Builder().build()) .addSelfieScan(SelfieScan.Builder().build()) .addFaceMatch() .build() } catch (e: ModuleConfigurationException) { // Invalid flow configuration — fix before running Log.e("Incode", "Flow config error: ${e.message}") } ``` ```java try { FlowConfig flowConfig = new FlowConfig.Builder() .addID(new IdScan.Builder().build()) .addSelfieScan(new SelfieScan.Builder().build()) .addFaceMatch() .build(); } catch (ModuleConfigurationException e) { // Invalid flow configuration — fix before running Log.e("Incode", "Flow config error: " + e.getMessage()); } ``` This is an Android-specific error type with no direct equivalent in the iOS or Web SDKs. ### Delayed Onboarding Sync Errors When syncing offline (delayed) onboardings, errors are delivered via a dedicated listener: ```kotlin IncodeWelcome.getInstance().syncDelayedOnboardings(object : SyncDelayedOnboardingListener { override fun onError(error: DelayedOnboardingSyncError) { // Handle sync error } }) ``` ### Emulator Behavior On Android emulators, camera-dependent modules (`ID Scan`, `Selfie Scan`, `Face Match`, `Document Scan`, `Video Selfie`) show a black screen for 2 seconds then return `ResultCode.EMULATOR_DETECTED` automatically. Remove `setTestModeEnabled(true)` before building for production. *** ## Flutter, React Native, and Xamarin The Flutter, React Native, and Xamarin SDKs wrap the native iOS and Android SDKs. Error handling in these platforms mirrors the underlying native platform: - On **iOS devices**, errors follow the iOS SDK model described above: typed `IncdFlowError` cases delivered via delegate callbacks, with per-module result error enums. - On **Android devices**, errors follow the Android SDK model: `Throwable` errors via listener callbacks, with `ResultCode` on module results. Refer to each platform's integration guide for the platform-specific callback and listener signatures used to receive these errors. :::note Detailed error handling documentation for Flutter, React Native, and Xamarin is coming soon. Contact your Incode customer success manager or refer to the native platform sections above in the meantime. ::: --- - Path: `general-reference/session-statuses` - URL: https://developer.incode.com/general-reference/session-statuses/ - Markdown: https://developer.incode.com/general-reference/session-statuses.md # Incode Session Statuses There are two categories of session status values: - **Onboarding progress statuses** are set automatically by the Incode Platform as [a session moves](/get-started-with-incode/onboarding-session-lifecycle/) through its verification modules. You receive these via the [Onboarding Status Webhook](/general-reference/onboarding-status-webhook/) or by polling the [`/omni/get/onboarding/status`](https://developer.incode.com/api-reference/get-onboarding-status/) endpoint. - **Manual session states** are values you set by calling the [`/omni/session/status/set`](https://developer.incode.com/api-reference/session-status-set/) endpoint. :::info Some of the API and code references on this page refer to _onboarding sessions_. Some of the statuses can apply to either onboarding or authentication sessions. It's important to know [the difference between onboarding and authentication](/concepts-and-architecture/onboarding-vs-authentication/). ::: *** ## Onboarding Progress Statuses A session moves through these statuses in order. Not every status occurs in every session. The modules configured in your Workflow or Flow determine which statuses occur. ### Sequential Processing Statuses | Status | Description | | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `UNKNOWN` | Initial status. The session is created but the user has not yet started it. For example, an onboarding URL has been shared but the user has not clicked it. **No webhook notification is sent for this status.** Retrieve it by calling the [get session status](https://developer.incode.com/api-reference/session-status-get/) endpoint. | | `ID_VALIDATION_FINISHED` | ID document validation is complete. OCR data has been extracted and the `idValidation` score has been calculated. Preliminary OCR data and the ID validation score can be fetched at this point. Wait for `ONBOARDING_FINISHED` before fetching final results. | | `ID_VALIDATION_FINISHED_SECOND_ID` | ID document validation is complete for a second ID document, if applicable. Preliminary data for the second ID can be fetched at this point. | | `GOVERNMENT_VALIDATION_FINISHED` | Validation against a government registry or third-party source of truth is complete. Preliminary government validation results can be fetched. Wait for `ONBOARDING_FINISHED` before fetching final results. | | `FACE_VALIDATION_FINISHED` | Face Match is complete. The selfie has been compared against the ID document photo. The `faceRecognition` and `liveness` scores have been calculated. If government validation is part of the flow, this status generally occurs after `GOVERNMENT_VALIDATION_FINISHED`. | | `POST_PROCESSING_FINISHED` | ID post-processing is complete. Used in specific implementations where additional server-side data review is required after ID capture. | | `POST_PROCESSING_FINISHED_SECOND_ID` | ID post-processing is complete for the second ID document, if applicable. | | `ONBOARDING_FINISHED` | The session is complete. All data has been collected and processed, business rules have been applied, the final session score has been calculated, and the user has exited the flow. **Wait for this status for before fetching scores and session data.** | ### Post-Completion Statuses These statuses occur after `ONBOARDING_FINISHED` and show the outcome of manual review or session lifecycle events. | Status | Description | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `MANUAL_REVIEW_APPROVED` | A session that was in a Needs Review state has been manually approved by a reviewer in Dashboard. | | `MANUAL_REVIEW_REJECTED` | A session that was in a Needs Review state has been manually rejected by a reviewer in Dashboard. | | `EXPIRED` | A time limit is configured on the Flow or Workflow and the user abandons the session after that limit. If the user returns, they see a session expired screen. | | `DELETED` | The session's data has been deleted. Deletion is not immediate. Finished sessions are placed in a queue. The webhook payload for this status uses `interviewIds`, a string array, instead of the usual `interviewId` field. Multiple sessions may be deleted in a single event. See [Deleted sessions](#deleted-sessions) below. | *** ## Manual Session States You can manually set a session's state by calling the [`POST /omni/session/status/set`](https://developer.incode.com/api-reference/session-status-set/) endpoint with one of the following `action` values: | State | Description | | --------- | ------------------------------------------------------------------------------------------------------------------------------------- | | `Alive` | The session is active. All `/add/...` data capture calls are permitted. This is the default state for a session in progress. | | `Closed` | The session is closed. All `/add/...` calls are disabled. No further data can be added to the session. The session data is preserved. | | `Deleted` | The important data stored in the session is deleted. See [Deleted sessions](#deleted-sessions) below. | *** ## Deleted Sessions `Deleted` appears in both categories because a session can reach a deleted state in two ways: 1. **Manually**, by calling `POST /omni/session/status/set` with `action: Deleted`. 2. **Automatically**, as a platform-level data deletion event. For example, when data retention policies cause session data to be purged. In both cases, if you have configured the [Onboarding Status Webhook](/general-reference/onboarding-status-webhook/), a `DELETED` webhook notification is sent when the deletion is processed. The payload for this notification differs from all other onboarding status webhooks; it contains an `interviewIds` array of one or more session IDs, rather than a single `interviewId` field. *** ## Webhook Coverage Not all onboarding progress statuses trigger a webhook notification. The table below shows which statuses send a webhook when the [Onboarding Status Webhook](/general-reference/onboarding-status-webhook/) is configured. | Status | Webhook sent? | | ------------------------------------ | ---------------------------------------- | | `UNKNOWN` | ❌ No, poll the API instead | | `ID_VALIDATION_FINISHED` | ✅ Yes | | `ID_VALIDATION_FINISHED_SECOND_ID` | ✅ Yes, if applicable | | `GOVERNMENT_VALIDATION_FINISHED` | ✅ Yes | | `FACE_VALIDATION_FINISHED` | ✅ Yes | | `POST_PROCESSING_FINISHED` | ✅ Yes | | `POST_PROCESSING_FINISHED_SECOND_ID` | ✅ Yes, if applicable | | `ONBOARDING_FINISHED` | ✅ Yes | | `MANUAL_REVIEW_APPROVED` | ✅ Yes | | `MANUAL_REVIEW_REJECTED` | ✅ Yes | | `EXPIRED` | ✅ Yes | | `DELETED` | ✅ Yes, payload uses `interviewIds` array | *** ## Related Pages - [Onboarding Session Lifecycle](/get-started-with-incode/onboarding-session-lifecycle/): How statuses change during a session - [Onboarding Status Webhook](/general-reference/onboarding-status-webhook/): Webhook payload details, authentication, and retry policy - [Session Webhooks](/general-reference/session-webhooks/): Targeted webhooks for specific session events (`Session_Started`, `Session_Failed`, `Session_Succeeded`, `Session_Pending_Review`) - [Get Session Status](https://developer.incode.com/api-reference/session-status-get/): API endpoint for polling session status - [Set Session Status](https://developer.incode.com/api-reference/session-status-set/): API endpoint for setting session state
          --- - Path: `general-reference/session-webhooks` - URL: https://developer.incode.com/general-reference/session-webhooks/ - Markdown: https://developer.incode.com/general-reference/session-webhooks.md # Session Webhooks Session webhooks let you set up notifications for events that happen during any session triggered by a Flow or Workflow. You can [configure them](/dashboard-platform-administration/configuration-webhooks-tab/), along with other types of webhooks, in Dashboard. ## Learn more about webhooks Webhooks are event notifications. They let your organization's application know when a specific event happens on the Incode platform or when a process initiated by a user is completed (also known as a callback). Your application can then take action based on the notification. Webhooks are asynchronous (that is, the communication is only from the Incode platform to your application). You must configure them if you want to use them. Each session webhook notifies you about a specific session event. This is different from the [Onboarding Status webhook,](/general-reference/onboarding-status-webhook/) which sends notifications at the completion of every module during a single session. Depending on the number of modules in the session Flow or Workflow, this could be more notifications than you need or want. Session webhooks provide additional flexibility and let you tailor your notifications for specific needs. There are six session webhooks available: - **Session Started:** Triggered when any session triggered by a Flow or Workflow starts. - **Session Progress:** Triggered on any `/start` endpoint call after the initial session creation. For example, when an end user resumes a session on their phone. - **Session Failed:** Triggered when any session triggered by a Flow or Workflow fails. Sessions can fail at various points and for various reasons during a Flow or Workflow. You can view more information about failed sessions in Dashboard. Go to **Dashboard** > **Sessions** and click any session in the table to open it. - **Session Succeeded:** Triggered when any session triggered by a Flow or Workflow succeeds. - **Session Pending Review:** Triggered when any session triggered by a Flow or Workflow requires manual review. - **Identity Enrolled:** Triggered the first time an Identity is created. Updates to an existing Identity do not emit this event. *** ## Key facts about session webhooks - Each session webhook notification contains a number of common fields. These provide context and allow you to track what's happening more easily. - Notifications come as `POST` requests to the endpoint you configured in Dashboard. - Notification headers are passed as key/value pairs. - Notification payloads are sent in JSON format. You must configure any internal settings to include `Accept Application/json`. - Data is included in the first notification for which it is available. *** ## Notification payload fields ### Common fields The fields in the following table are common to all session webhook notifications (`SESSION_STARTED`, `SESSION_PROGRESS`, `SESSION_FAILED`, `SESSION_SUCCEEDED`, and `SESSION_PENDING_REVIEW`). They are the only fields included in `SESSION_STARTED` and `SESSION_PROGRESS`. | Field | Type | Description | | -------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `event_type` | `string` | Name of the webhook providing the notification: `SESSION_STARTED`, `SESSION_PROGRESS`, `SESSION_FAILED`, `SESSION_SUCCEEDED`, or `SESSION_PENDING_REVIEW` | | `timestamp` | `string` | UTC timestamp of the triggering event in ISO 8601 format | | `interviewId` | `string` | Unique identifier for the session | | `externalCustomerId` | `string` | Unique identifier from your system that is used for data matching | | `clientId` | `string` | Unique identifier assigned to your organization | | `configurationId` | `string` | Unique identifier assigned to the Flow or Workflow for this session | | `integrationId` | `string` | Unique identifier assigned by Incode to the integration associated with this session. If there was no integration for the session, this field does not appear. | | `integrationType` | `string` | Type of integration associated with this session. If there was no integration for the session, this field does not appear. | | `loginHint` | `string` | Displays a value entered by the end user as a login hint for this session. If no login hint was used, this field does not appear. | | `devices` | `array` | Not included in `SESSION_STARTED` or `SESSION_PROGRESS` notifications. See [Devices array](#devices-array) for details. | ### Fields available after a session starts The next table explains fields that are only available after a session starts. These fields are included in `SESSION_FAILED`, `SESSION_SUCCEEDED`, or `SESSION_PENDING_REVIEW` notifications. | Field | Type | Description | | ------------------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `onboardingStatus` | `string` | Status of the session; the value is always `ONBOARDING_FINISHED`. The term "onboarding" here applies to any session. | | `ip` | `string` | IP address for the end user device (legacy field, preserved for backward compatibility). Not available for fully API-integrated sessions. | | `latitude` | `string` | Latitude at which the end user device was located during the session (legacy field, preserved for backward compatibility). Not available for fully API-integrated sessions. | | `longitude` | `string` | Longitude at which the end user device was located during the session (legacy field, preserved for backward compatibility). Not available for fully API-integrated sessions. | | `devices` | `array` | Structured array of device objects containing enriched device fingerprint data. Empty array (`[]`) when no device data is available. See [Devices array](#devices-array). | ### Fields available for specific event types The following table explains fields that appear only in specific event type notifications. | Field | Event type(s) | Type | Description | | ---------------- | ------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `identityId` | `SESSION_SUCCEEDED`, `SESSION_FAILED` | `string` | Unique identifier for the Identity that was matched or created for this session. Included in `SESSION_FAILED` when the failed session is tied to an existing Identity. | | `failureReasons` | `SESSION_FAILED` | `array` | Sorted, deduplicated array of upper-snake-case string identifiers indicating why the session failed. Replaces the legacy `failureReason` field. See [Failure reasons](#failure-reasons). | ### Devices array The `devices` field is a structured array of device objects included in `SESSION_FAILED`, `SESSION_SUCCEEDED`, and `SESSION_PENDING_REVIEW` notifications. It replaces the flat `ip`, `latitude`, and `longitude` fields previously included. However, these fields are preserved for backward compatibility. Devices are sorted by timestamp, with the oldest first. Each device object contains the following fields: | Field | Type | Description | | ------------- | -------- | ----------------------------------------- | | `ip` | `string` | IP address of the end user device | | `latitude` | `number` | Latitude of the end user device location | | `longitude` | `number` | Longitude of the end user device location | | `browser` | `string` | Browser used during the session | | `deviceModel` | `string` | Model of the end user device | | `deviceType` | `string` | Type of device (for example, `mobile`) | | `osVersion` | `string` | Operating system and version | | `hash` | `string` | Device fingerprint hash | Example: ```json { "ip": "203.0.113.10", "latitude": 37.7749, "longitude": -122.4194, "browser": "Chrome", "deviceModel": "iPhone 15", "deviceType": "mobile", "osVersion": "iOS 17.5", "hash": "fingerprint-hash" } ``` ### Failure reasons ### **Breaking change:** The legacy `failureReason` (singular string) field has been removed from `SESSION_FAILED` notifications and replaced by the `failureReasons` array. The `failureReasons` field is included only in `SESSION_FAILED` notifications. It contains a stable, sorted, deduplicated array of identifiers indicating why the session failed. Example: ```json { "event_type": "SESSION_FAILED", "failureReasons": ["ID_VALIDATION", "LIVENESS"] } ``` The following table lists all possible identifiers: | Identifier | Source | | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | `AUTHENTICATION` | `authentication` score field | | `ID_VALIDATION` | `idValidation` score field | | `SECOND_ID_VALIDATION` | `secondIdValidation` score field | | `ANTIFRAUD` | `antifraud` score field | | `LIVENESS` | `liveness` score field | | `DEEPSIGHT` | `deepsight` score field | | `FACE_CAPTURE_ASSESSMENT` | `faceCaptureAssessment` score field | | `FACE_RECOGNITION` | `faceRecognition` score field | | `FACE_RECOGNITION_SECOND_ID` | `faceRecognitionSecondId` score field | | `GOVERNMENT_VALIDATION` | `governmentValidation` score field | | `VIDEO_SELFIE` | `videoConference` score field | | `PREMIUM_EXTERNAL_VERIFICATION` | `premiumExternalVerification` score field | | `CURP_VERIFICATION` | `curpVerification` score field | | `ID_OCR_CONFIDENCE` | `idOcrConfidence` score field | | `ID_OCR_CONFIDENCE_SECOND_ID` | `idOcrConfidenceSecondId` score field | | `INCODE_WATCHLIST` | `incodeWatchlistScore` score field | | `DEVICE_RISK` | `deviceRisk` score field | | `BEHAVIORAL_RISK` | `behavioralRisk` score field | | `TRUST_GRAPH` | `trustGraph` score field | | `AUTOPILOT` | `autopilot` score field | | `INVOICE_VALIDATION` | `invoiceValidation` score field | | `LINK_EXPIRED` | Session link expiry failure path | | `MANUAL_REJECTED` | Triggered when a session enters Review state and a Dashboard admin rejects the session. | | `OTHER` | Fallback used when no specific failure reason can be determined. For example, when it's unclear whether a module or a condition caused the failure. | *** ## Identity Enrolled webhook The `IDENTITY_ENROLLED` webhook fires the first time an Identity is created. It does not fire for updates to an existing Identity. The payload for `IDENTITY_ENROLLED` uses the following shape: | Field | Type | Description | | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------- | | `eventType` | `string` | Always `IDENTITY_ENROLLED` | | `timestamp` | `string` | UTC timestamp of the triggering event in ISO 8601 format | | `identityId` | `string` | Unique identifier for the newly created Identity (required) | | `interviewId` | `string` | Unique identifier for the session associated with the Identity creation | | `externalId` | `string` | External identifier from the integration, if available. If not available, this field does not appear. | | `externalCustomerId` | `string` | Unique identifier from your system used for data matching. If not available, this field does not appear. | | `clientId` | `string` | Unique identifier assigned to your organization | | `configurationId` | `string` | Unique identifier assigned to the Flow or Workflow for this session | | `integrationReference` | `string` | Reference to the integration associated with this session. If there was no integration for the session, this field does not appear. | | `loginHint` | `string` | Displays a value entered by the end user as a login hint for this session. If no login hint was used, this field does not appear. | Example payload: ```json { "eventType": "IDENTITY_ENROLLED", "timestamp": "2026-05-20T14:00:00Z", "identityId": "65f8...", "interviewId": "65f7...", "externalId": "ext-abc-123", "externalCustomerId": "cust-456", "clientId": "client-xyz", "configurationId": "flow-prod-onboarding", "integrationReference": "ref-789" } ``` *** ## Session Failed on link expiration When a Workforce verification link expires, the platform sends a `SESSION_FAILED` webhook with `failureReasons` containing `["LINK_EXPIRED"]`. This feature is configuration-dependent. Contact your Incode representative to enable it. *** ## Error handling and retry policy Webhooks make up to 5 attempts to deliver a notification in case of endpoint failures. You should ensure your endpoint is ready to handle retries and process duplicate notifications gracefully. Retries will be triggered by either of these scenarios: - A timeout is received when your endpoint is called - A status code is returned from your service and is not either: - `200 OK` along with the `application/json` header, or - `204 No content` The retry policy for webhooks is exponential, with an initial interval of 30 seconds and a multiplier of 2.5. The maximum number of attempts is 5. This means the maximum time a webhook can take to reach its destination is approximately 32 minutes, as illustrated in the following table. | Retry attempt | Delay (seconds) | Delay (minutes) | Total (minutes) | | :-----------: | --------------: | --------------: | --------------: | | 1 | 30 | 0.5 | 0.5 | | 2 | 75 | 1.25 | 1.75 | | 3 | 187.5 | 3.13 | 4.88 | | 4 | 468.75 | 7.81 | 12.69 | | 5 | 1,171.88 | 19.53 | 32.22 | *** ## Webhook IP address list If your organization restricts inbound traffic for your network, make sure the following IP addresses are added to your allow list. ### United States Allow the IP addresses shown in this table for the SAAS (Production) environment. | IP Address | Active | | ------------- | ---------------------- | | 54.86.34.156 | Currently Active | | 3.142.125.52 | Currently Active | | 54.85.117.182 | As of February 2, 2026 | | 3.233.40.153 | As of February 2, 2026 | Allow this IP address for the Demo environment. | IP Address | Active | | -------------- | ----------------------------------------------------- | | 34.198.171.165 | Active since October 2024 (previously 18.210.119.234) | ### Europe Allow this IP address for both the Production and Demo environments. | IP Address | Active | | ------------- | ------ | | 18.158.116.18 | Active |
          --- - Path: `general-reference/spain` - URL: https://developer.incode.com/general-reference/spain/ - Markdown: https://developer.incode.com/general-reference/spain.md # Spain eKYB Prefill in Spain leverages Spain's source of truth to automatically retrieve and populate business information based on a company's CIF or VAT number, including the business name, registered address, entity type, registration status, directors, shareholders, and additional financial and corporate data, without requiring manual input from the user. ## Source | Country | Source | Description | | --- | --- | --- | | Spain | `ES_KYB_PREFILL` | Returns matching Spanish business details from Spain's source of truth for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --- | --- | --- | | plugins | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | source | Mandatory | String. Must be `ES_KYB_PREFILL`. Identifies the Prefill source. | | country | Mandatory | String. Two-letter Alpha-2 country code. Must be `ES`. | | taxId | Mandatory | String. Spanish CIF or VAT number. See Tax ID formats for details. | | businessName | Optional | String. Registered name of the business. When provided, adds `nameMatch` to the response. | | address | Optional | String. Business address as a freeform string. When provided, adds `addressMatch` to the response. | ### Tax ID formats The `taxId` field accepts three CIF formats and a VAT number format. Routing between them is determined automatically by the format of the submitted value. | ID Type | Format | Example | | --- | --- | --- | | **CIF — Regular company** | 1 letter + 8 digits | `B12345678` | | **CIF — Sole Trader** | 8 digits + 1 letter | `12345678A` | | **CIF — Foreign Sole Trader** | 1 letter + 7 digits + 1 letter | `X1234567A` | | **VAT number** | `ES` + CIF | `ESB12345678` | Inputs that do not match any of the above formats return a 400 error. ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "ES_KYB_PREFILL", "country": "ES", "taxId": "B12345678", "businessName": "SECONDOLAB SL", "address": "CALLE ANNA 6 PTA 2, 08620 SANT VICENÇ DELS HORTS" } ``` ### Sample response The Prefill response returns business data retrieved directly from the source of truth. Fields are returned as-is from the source. `nameMatch` and `addressMatch` are only present when `businessName` or `address` were submitted in the request. `otherNames`, `turnover`, `employeeCount`, `companySize`, `shareholders`, and `directors` are only present when available for the company. **Example 1 — SECONDOLAB (Limited Liability Company)** ```json { "kyb-prefill": [ { "tin": "B12345678", "vatNo": "ES12345678", "name": "SECONDOLAB SL", "otherNames": [ { "name": "SECONDOLAB", "businessNameType": "Trade Name" } ], "nameMatch": "Verified", "address": "CALLE ANNA 6 PTA 2, 08620 SANT VICENÇ DELS HORTS", "city": "SANT VICENÇ DELS HORTS", "postalCode": "12345", "entityType": "Limited Liability Company", "registrationStatus": "Active", "registrationDate": "2011-09-15T00:00:00Z", "creditRating": "B", "creditRatingDescription": "Low Risk", "industryDesc": "Retail sale via mail order houses or via Internet", "activityDesc": "Retail sale via mail order houses or via Internet", "turnover": { "currency": "EUR", "value": 120000 }, "employeeCount": "1", "companySize": "Micro-company", "shareholders": [ { "name": "ANA MARIA JIMENEZ", "percentSharesHeld": 100 } ], "directors": [ { "name": "ANA MARIA JIMENEZ", "positionName": "Sole Administrator" } ] } ] } ``` **Example 2 — MARIA MAESTRE ANNA CB (Joint Ownership / Comunidad de Bienes)** ```json { "kyb-prefill": [ { "tin": "E12345678", "vatNo": "ES12345678", "name": "MARIA MAESTRE ANNA CB", "otherNames": [ { "name": "Champús", "businessNameType": "Trade Name" } ], "nameMatch": "Verified", "address": "CALLE Champús PROPI LA OCA 90 LOCAL POSTERIOR, 28041 MADRID", "city": "MADRID", "postalCode": "28041", "entityType": "Joint Ownership", "registrationStatus": "Active", "creditRating": "C", "creditRatingDescription": "Moderate Risk", "industryDesc": "Retail sale of footwear and leather goods in specialised stores", "activityDesc": "Retail sale of footwear and leather goods in specialised stores", "employeeCount": "12", "companySize": "Small company" } ] } ``` ### Response fields | Key | Value | Description | | --- | --- | --- | | tin | CIF number | The Spanish CIF as confirmed by the source of truth. | | vatNo | VAT identifier | The Creditsafe internal company number (`companyNumber`) mapped as the VAT identifier (for example, `ES09166632`). Present for all companies. | | name | Business name | The registered legal name of the business (`registeredCompanyName`) as returned from the source of truth. | | otherNames | Array of `{name, businessNameType}` | Trade names or other business names associated with the company. `businessNameType` is always `"Trade Name"`. Only present when a trade name differs from the registered legal name. | | nameMatch | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the registered name on file. Only present when `businessName` was submitted in the request. See Name and address match values for details. | | address | Registered address | The primary registered address of the business as returned from the source of truth. | | addressMatch | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against the registered address on file. Only present when `address` was submitted in the request. See Name and address match values for details. | | city | City | The city of the registered address as returned from the source of truth. | | postalCode | Postal code | The postal code of the registered address as returned from the source of truth. | | entityType | Entity type | The legal form of the business as returned from the source of truth (for example, `Limited Liability Company`, `Joint Ownership`). Defaults to `Unknown` when not available. | | registrationStatus | Registration status | The current company status as returned from the source of truth (for example, `Active`). Defaults to `Unknown` when not available. | | registrationDate | Date | The date the company was registered, as returned from the source of truth. May not be present for all companies. | | creditRating | Credit rating value | The standardized credit rating value (for example, `B`). Defaults to `Unknown` when not available. May not be present for all companies. | | creditRatingDescription | Credit rating description | A human-readable description of the credit rating (for example, `Low Risk`). May not be present for all companies. | | industryDesc | Industry description | The primary activity description as returned from the source of truth (for example, `Retail sale via mail order houses or via Internet`). | | activityDesc | Activity description | The principal activity description as returned from the source of truth. For Spain, this is typically identical to `industryDesc`. | | turnover | `{currency, value}` object | The latest turnover figure as returned from the source of truth. May not be present for all companies. | | employeeCount | String | The latest employee count as returned from the source of truth. Always returned as a string. May not be present for all companies. | | companySize | String | The company size classification as returned from the source of truth (for example, `Micro-company`, `Small company`). May not be present for all companies. | | shareholders | Array of `{name, percentSharesHeld}` | Shareholders associated with the business as returned from the source of truth. Absent for Joint Ownership (`Comunidad de Bienes`) entities — this is expected, not an error. May not be present for all other company types. | | directors | Array of `{name, positionName}` | Current directors and officers as returned from the source of truth. `positionName` reflects the primary position title on file. Absent for Joint Ownership (`Comunidad de Bienes`) entities — this is expected, not an error. May not be present for all other company types. | ### Name and address match values | Status | Description | | --- | --- | | Verified | Exact match found against registry data. | | Approximate Match | Similar match found; may reflect minor differences in naming or address formatting. | | Unverified | No match found in registry data. | ### Registration status values | Status | Description | | --- | --- | | Active | The company is currently active and registered. | | Inactive | The company registration is dissolved, struck off, or no longer active. | | Unknown | The registration status could not be determined. | ## Error responses For standard HTTP response codes, see the API Error Response page. Spain Prefill returns the following country-specific 400 errors. `taxId` is missing, empty, or does not match a supported Spanish identifier format: ```json { "timestamp": 1782851408892, "status": 400, "error": "Bad Request", "message": "taxId must be a valid Spanish CIF (letter + 8 digits, 8 digits + letter, or letter + 7 digits + letter) or VAT number (ES + CIF)", "path": "/omni/externalVerification/ekyb-prefill" } ``` Any mandatory field (`plugins`, `source`, `country`, or `taxId`) is missing: ```json { "timestamp": 1782851468367, "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` No business match is found for the submitted `taxId`: ```json { "timestamp": 1782851583695, "status": 200, "message": "No business found matching the provided tax ID.", "path": "/omni/externalVerification/ekyb-prefill" } ``` ## Single Session Dashboard results Prefill results are available on the Business tab in [Single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/supported-digital-ids` - URL: https://developer.incode.com/general-reference/supported-digital-ids/ - Markdown: https://developer.incode.com/general-reference/supported-digital-ids.md # Supported Digital IDs Incode's Digital IDs capability lets you accept and verify government-issued digital identity credentials in any Incode flow. Digital IDs include mobile driver's licenses (mDLs), national eIDs, and government ID apps. Digital IDs do not replace the rest of Incode's identity stack. They feed into it. Each digital ID session can still run liveness, deepfake detection, TrustGraph signal lookup, and risk scoring on top. ## Supported regions - [**United States**](/general-reference/supported-digital-ids-united-states/): Mobile driver's licenses (mDLs) from Apple Wallet, Google Wallet, and Samsung Wallet. - [**Europe**](/general-reference/supported-digital-ids-europe/): More than 20 national identity schemes, including MitID, BankID, itsme, SPID, and Smart-ID. - [**Asia**](/general-reference/supported-digital-ids-asia/): Singpass, DigiLocker, and UAE Pass. ## Integration paths Digital IDs can be integrated through three surfaces. All three require your Incode Representative to enable the Digital IDs feature for your organization first. | Path | Where it lives | Configuration | | ----------------------------------- | --------------------- | ---------------------------------------------------------------------- | | Dashboard (Web Flows and Workflows) | Hosted onboarding app | ID Capture module in each Workflow; no code changes | | SDK (mobile, web) | Your app | `verificationOptions.methods` in the SDK, plus Dashboard configuration | | Server API | Your backend | Direct API endpoints for session creation and credential exchange | For Dashboard configuration steps, see [ID Capture module configuration](/dashboard-platform-administration/id-capture-dashboard). For the Web SDK headless integration, see [Digital ID Wallet Verification](/features-and-modules/digital-id-wallet-verification/) and the [`renderWallet` API reference](/sdk-reference/web-sdk-reference/#renderwallet). ## Selective disclosure Unlike physical document capture, digital ID presentation is attribute-by-attribute. The wallet or scheme only releases the fields you explicitly request. Anything not requested never leaves the user's device. Requested attributes are configured per flow in the Dashboard. Customers do not pass requested fields directly from the browser or SDK at runtime. This keeps every request aligned with the approved flow configuration. When no custom attribute set is configured, Incode applies the default set for the enabled method. ## Observability Every digital ID session logs: - The method presented - The verification outcome, including success or fail reason - Whether a fallback was triggered, for example when a credential is missing and the user falls back to physical document capture - The flow ID, session ID, and device metadata These fields are available in session results and downstream analytics. See the per-region pages for method-specific attribute sets. ## Common integration notes - **Device capability detection.** The iOS SDK checks entitlements and wallet contents before offering a method, so users do not reach a dead end on unsupported devices. - **Chrome on iOS.** Digital IDs are not supported because of an Apple restriction. The SDK hides the option. - **Desktop.** Not all credential types are available on desktop. See the per-region pages for details. - **Selective disclosure.** Incode requests only the attributes required by your flow configuration. You control the minimum data set. ## Provider registration Certain credential types require you to register as a relying party with the scheme operator. Incode Support guides you through this process and, where applicable, completes the registration on your behalf. Contact your Incode Representative to get started. ## Retrieving results All digital ID methods return attributes via `GET /omni/get/ocr-data/v2` under the `ocrData` object. Two fields identify the credential source on every digital ID session: - `documentSubmissionMethod` is always `IMPORTED_CREDENTIAL` - `credentialsProvider` identifies the specific method (for example, `apple_wallet`, `mitid`, `singpass`) Portrait photos, where available, are retrieved via `/omni/get/images`. --- - Path: `general-reference/supported-digital-ids-asia` - URL: https://developer.incode.com/general-reference/supported-digital-ids-asia/ - Markdown: https://developer.incode.com/general-reference/supported-digital-ids-asia.md # Asia Incode supports several digital identity schemes across Asia. To enable methods for a flow, go to **ID Capture Module** > **Digital IDs** in the Dashboard. Contact your Incode Representative to enable support for specific countries. ## Available methods | Method | SDK ID | Country | | ---------- | ------------ | ------------------------- | | Singpass | `singpass` | Singapore (SG) | | DigiLocker | `digilocker` | India (IN) | | UAE Pass | `uae_pass` | United Arab Emirates (AE) | ## Available attributes by method All attributes are returned via `GET /omni/get/ocr-data/v2` under the `ocrData` object. Two fields identify the credential: - `documentSubmissionMethod` is always `IMPORTED_CREDENTIAL` for digital ID sessions - `credentialsProvider` identifies the specific scheme (for example, `singpass`, `digilocker`, `uae_pass`) ### Singpass: Singapore | Attribute | `ocrData` field | | --------------- | -------------------------- | | Family name | `name.paternalLastName` | | Full name | `name.fullName` | | Date of birth | `birthDate` | | Nationality | `nationality` | | Gender | `gender` | | Phone number | `phone` | | Street | `addressFields.street` | | Postal code | `addressFields.postalCode` | | Country | `issuingCountry` | | Document type | `typeOfId` | | Document number | `documentNumber` | | Expiry date | `expireAt` | ### DigiLocker: India | Attribute | `ocrData` field | | ----------------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | Gender | `gender` | | Full address | `address` | | Aadhaar number (masked) | `documentNumber` | | Portrait photo | via `/omni/get/images` | ### UAE Pass: United Arab Emirates | Attribute | `ocrData` field | | ------------------ | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | Emirates ID number | `documentNumber` | | Expiry date | `expireAt` | | Portrait photo | via `/omni/get/images` | --- - Path: `general-reference/supported-digital-ids-europe` - URL: https://developer.incode.com/general-reference/supported-digital-ids-europe/ - Markdown: https://developer.incode.com/general-reference/supported-digital-ids-europe.md # Europe Incode supports more than 20 identity schemes across Europe. To enable methods for a flow, go to **ID Capture Module** > **Digital IDs** > **Europe** in the Dashboard. Methods are grouped by country. When multiple methods are enabled, users see the highest-adoption method for their detected location first. Contact your Incode Representative to enable support for specific countries. ## Available methods | Method | SDK ID | Country | | --------------------- | --------------- | ----------------------------------------------------------------- | | MitID | `mitid` | Denmark (DK) | | BankID Norway | `bankid_norway` | Norway (NO) | | BankID Sweden | `bankid_sweden` | Sweden (SE) | | Finnish Trust Network | `ftn` | Finland (FI) | | SPID | `spid` | Italy (IT) | | Audkenni | `audkenni` | Iceland (IS) | | OneID | `oneid` | United Kingdom (GB) | | Ukrainian DIIA | `ukraine_diia` | Ukraine (UA) | | iDIN | `idin` | Netherlands (NL) | | itsme | `itsme` | Belgium, Luxembourg, Netherlands (BE, LU, NL) | | SwissID | `swissid` | Switzerland (CH) | | Smart-ID | `smart_id` | Belgium, Estonia, Finland, Latvia, Lithuania (BE, EE, FI, LV, LT) | | Mobile ID | `mobile_id` | Estonia, Lithuania (EE, LT) | | Evrotrust | `evrotrust` | Bulgaria (BG) | | MojeID Poland | `mojeid_poland` | Poland (PL) | | eDO app | `edo_app` | Poland (PL) | | Czech Bank iD | `czech_bank_id` | Czech Republic (CZ) | | MojeID Czech | `mojeid_czech` | Czech Republic (CZ) | | eParaksts Mobile | `eparaksts` | Latvia (LV) | | Digidentity | `digidentity` | Netherlands, United Kingdom (NL, GB) | | Verimi | `verimi` | Germany (DE) | | Freja eID | `freja_eid` | Sweden (SE) | ## Available attributes by method All attributes are returned via `GET /omni/get/ocr-data/v2` under the `ocrData` object. Two fields identify the credential: - `documentSubmissionMethod` is always `IMPORTED_CREDENTIAL` for digital ID sessions - `credentialsProvider` identifies the specific scheme (for example, `mitid`, `bankid_sweden`, `itsme`) ### MitID: Denmark | Attribute | `ocrData` field | | ------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | ### BankID Norway: Norway | Attribute | `ocrData` field | | ------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Full name | `name.fullName` | | Date of birth | `birthDate` | ### BankID Sweden: Sweden | Attribute | `ocrData` field | | ------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Full name | `name.fullName` | | Date of birth | `birthDate` | | Gender | `gender` | ### Finnish Trust Network: Finland | Attribute | `ocrData` field | | ------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | ### SPID: Italy | Attribute | `ocrData` field | | -------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | Gender | `gender` | | Phone | `phone` | | ID card number | `documentNumber` | ### Audkenni: Iceland | Attribute | `ocrData` field | | ------------------ | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | National ID number | `documentNumber` | ### OneID: United Kingdom | Attribute | `ocrData` field | | -------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | Street address | `addressFields.street` | ### Ukrainian DIIA: Ukraine | Attribute | `ocrData` field | | --------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | Document number | `documentNumber` | | Portrait photo | via `/omni/get/images` | ### iDIN: Netherlands | Attribute | `ocrData` field | | ------------- | -------------------------- | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | Gender | `gender` | | Street | `addressFields.street` | | City | `addressFields.city` | | Postal code | `addressFields.postalCode` | | Country | `issuingCountry` | | Phone number | `phone` | ### itsme: Belgium, Luxembourg, Netherlands | Attribute | `ocrData` field | | ------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | ### SwissID: Switzerland | Attribute | `ocrData` field | | ------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | ### Smart-ID: Belgium, Estonia, Finland, Latvia, Lithuania | Attribute | `ocrData` field | | ------------------ | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | National ID number | `documentNumber` | ### Mobile ID: Estonia, Lithuania | Attribute | `ocrData` field | | ------------------ | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | National ID number | `documentNumber` | ### Evrotrust: Bulgaria | Attribute | `ocrData` field | | --------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | Document number | `documentNumber` | ### MojeID Poland: Poland | Attribute | `ocrData` field | | ------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | ### eDO app: Poland | Attribute | `ocrData` field | | --------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | Document number | `documentNumber` | ### Czech Bank iD: Czech Republic | Attribute | `ocrData` field | | -------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | Street address | `addressFields.street` | ### MojeID Czech: Czech Republic | Attribute | `ocrData` field | | ------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | ### eParaksts Mobile: Latvia | Attribute | `ocrData` field | | ------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | ### Digidentity: Netherlands, United Kingdom | Attribute | `ocrData` field | | ------------- | -------------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Middle name | `name.middleName` | | Date of birth | `birthDate` | | Phone number | `phone` | | Street | `addressFields.street` | | Postal code | `addressFields.postalCode` | | Country | `issuingCountry` | | Gender | `gender` | ### Verimi: Germany | Attribute | `ocrData` field | | ------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | ### Freja eID: Sweden | Attribute | `ocrData` field | | --------------- | ----------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | Personal number | `documentNumber` | --- - Path: `general-reference/supported-digital-ids-united-states` - URL: https://developer.incode.com/general-reference/supported-digital-ids-united-states/ - Markdown: https://developer.incode.com/general-reference/supported-digital-ids-united-states.md # United States **Credential type:** Mobile Driver's License (mDL) **Standard:** ISO 18013-5 (proximity) / ISO 18013-7 (online/remote) US mDLs are state-issued driving licenses provisioned into a device wallet and cryptographically signed by the issuing state DMV. Incode supports three wallets. All three expose the same attribute set with selective disclosure. In Dashboard, configure which fields to request per flow from the ID Capture module under **Digital IDs** > **United States**. ## Available methods | Method | SDK ID | | -------------- | ---------------- | | Apple Wallet | `apple_wallet` | | Google Wallet | `google_wallet` | | Samsung Wallet | `samsung_wallet` | ## Available attributes All attributes are selectable. Configure which attributes to request for each flow in the Dashboard. | Attribute | `ocrData` field | | ------------------------------------ | -------------------------- | | Given name | `name.givenName` | | Family name | `name.paternalLastName` | | Date of birth | `birthDate` | | Gender | `gender` | | Height | `height` | | Nationality | `nationality` | | Age 18+ confirmation (no DOB shared) | `ageOver18` | | Age 21+ confirmation (no DOB shared) | `ageOver21` | | License number | `documentNumber` | | Issue date | `issuedAt` | | Expiry date | `expireAt` | | Issuing country | `issuingCountry` | | Issuing authority | `issuingAuthority` | | Driving privileges | `drivingPrivileges` | | Full address | `address` | | City | `addressFields.city` | | State / Province | `addressFields.state` | | Postal code | `addressFields.postalCode` | | Portrait photo | via `/omni/get/images` | Attributes are returned via `GET /omni/get/ocr-data/v2` under the `ocrData` object. Two fields identify the credential: - `documentSubmissionMethod` is always `IMPORTED_CREDENTIAL` for digital ID sessions - `credentialsProvider` identifies the specific wallet: `apple_wallet`, `google_wallet`, or `samsung_wallet` ## Selective disclosure and data minimization Unlike physical document capture, mDL presentation is attribute-by-attribute. The wallet only releases the fields you explicitly request. Anything not requested never leaves the device. The Dashboard pre-selects all available attributes when you first enable a wallet method. Configure each flow to request only what you actually need. ### Recommended attribute sets by use case | Use case | Request | | --------------------- | --------------------------------------------------------------------------- | | Age gate | `ageOver18` or `ageOver21` only, no DOB shared | | Identity verification | `name.givenName`, `name.paternalLastName`, `birthDate`, portrait | | KYC / account opening | Add `documentNumber`, `issuedAt`, `expireAt`, `issuingAuthority` | | Address verification | Add `addressFields.city`, `addressFields.state`, `addressFields.postalCode` | | Driving eligibility | Add `drivingPrivileges` | `height`, `nationality`, `gender`, and `drivingPrivileges` should only be requested when directly relevant. Several US states with mDL programs restrict what relying parties may request. Request the minimum your use case requires. ## Provider registration Apple Wallet web support requires the relying-party domain to be approved for wallet presentation. Coordinate with your Incode representative before going live with Apple Wallet. Incode is an approved Google Verifier registrar and handles Google Wallet registration on your behalf. You provide basic verifier details (company name, logo, terms of service), and your Incode representative takes care of the rest. The user must still be on Android Chrome with a compatible digital ID in Google Wallet. Contact your Incode Support representative to get started. --- - Path: `general-reference/supported-ids` - URL: https://developer.incode.com/general-reference/supported-ids/ - Markdown: https://developer.incode.com/general-reference/supported-ids.md # Supported IDs Supported IDs are identification documents that Incode can classify and extract information from. This section contains all supported ID documents organized by geographic area of origin: - [Africa](/general-reference/supported-ids-africa/) - [Asia](/general-reference/supported-ids-asia/) - [Caribbean](/general-reference/supported-ids-caribbean/) - [Central America](/general-reference/supported-ids-central-america/) - [Europe](/general-reference/supported-ids-europe/) - [North America](/general-reference/supported-ids-north-central-america/) - [Oceania](/general-reference/supported-ids-oceania/) - [South America](/general-reference/supported-ids-south-america/) --- - Path: `general-reference/supported-ids-africa` - URL: https://developer.incode.com/general-reference/supported-ids-africa/ - Markdown: https://developer.incode.com/general-reference/supported-ids-africa.md The following table lists supported identification documents for Africa, organized by country. ## Algeria (DZA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2020 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2016 | Identification Card | | ALL | MedicalCard | SOCIAL_SECURITY_CARD | 2024 | Social Security Card | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Passport | ## Angola (AGO) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :---------------------------------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2011 | Carta de Condução (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2017 | Bilhete de Identidade de Cidadão Nacional (Identity Card of National Citizen) | | ALL | IdentificationCard | REFUGEE_IDENTIFICATION_CARD | 2025 | Refugee Identification Card | | ALL | Passport | NATIONAL_PASSPORT | 2000 | Passaporte / Passport | | ALL | Visa | VISA | 2024 | Visa | | ALL | TravelDocument | CONSULAR_CARD | 2023 | Consular Card | ## Benin (BEN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :---------------------------------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2022 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | Carte Nationale D'Identite (National I.D. Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2017 | Carte D'Identité Cedeao / ECOWAS Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Certificat D'Identification Personnelle (Personal Identification Certificate) | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Passeport (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2021 | Passeport (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2024 | Passeport (Passport) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2023 | Carte de Resident (Residence Permit) | | ALL | TravelDocument | CONSULAR_CARD | 2019 | Carte D'Identite Consulaire (Consular Card) | | ALL | TravelDocument | CONSULAR_CARD | 2020 | Carte D'Identite Consulaire (Consular Card) | | ALL | TravelDocument | CONSULAR_CARD | 2021 | Carte D'Identite Consulaire (Consular Card) | | ALL | TravelDocument | CONSULAR_CARD | 2022 | Carte Consulaire / Consular Card | | ALL | TravelDocument | CONSULAR_CARD | 2023 | Carte D'Identite Consulaire (Consular Card) | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Carte D'Identite Consulaire / Consular Card | ## Botswana (BWA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :----------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2020 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | National Identity Card | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2023 | Permanent Residence Card | | ALL | Passport | NATIONAL_PASSPORT | 2009 | National Passport | | ALL | Visa | VISA | 2022 | Visa | ## Burkina Faso (BFA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :------------------------------------------------------------ | | ALL | DriversLicense | DRIVERS_LICENSE | 2017 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2012 | Carte Nationale D'Identite Burkinabe (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2026 | Identification Card | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Passeport (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Passeport (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2024 | Passport | | ALL | TravelDocument | CONSULAR_CARD | 2020 | Carte Consulaire (Consular Card) | ## Burundi (BDI) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :-------------------------- | :------ | :---------------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2016 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | REFUGEE_IDENTIFICATION_CARD | 2020 | Carte d'Identité Pour Réfugié (Refugee Identification Card) | | ALL | Passport | NATIONAL_PASSPORT | 2014 | Passeport (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Passeport (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2022 | Passeport (Passport) | ## Cameroon (CMR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :-------------------------- | :------ | :-------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2009 | Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2020 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2008 | Carte Nationale D'Identite (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2016 | Carte Nationale D'Identite (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2025 | Carte Nationale D'Identite (Identity Card) | | ALL | IdentificationCard | REFUGEE_IDENTIFICATION_CARD | 2022 | Refugee Identification Card | | ALL | TravelDocument | CONSULAR_CARD | 2021 | Consular Card | | ALL | TravelDocument | CONSULAR_CARD | 2022 | Consulate Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Passeport (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2021 | Passeport (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passeport (Passport) | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2020 | Carte D'Electeur (Voter's Card) | | ALL | TravelDocument | CONSULAR_CARD | 2023 | Carte D'identite Consulaire (Consular Card) | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Consular Identity Card | | ALL | TravelDocument | CONSULAR_CARD | 2025 | Consular Card | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2026 | Carte de Sejour (Residence Permit) | ## Cape Verde (CPV) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :---------------------------------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2013 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2012 | Bilhete de Identidade de Cidadão Nacional (Identity Card of National Citizen) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2018 | Cartão Nacional de Identificação (National Identity Card) | | ALL | Passport | NATIONAL_PASSPORT | 2005 | Passaporte / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passaporte / Passport | | ALL | TravelDocument | CONSULAR_CARD | 2020 | Cartão de Identificação (Consular Card) | ## Central African Republic (CAF) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :---------------- | :------ | :--------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2010 | Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2020 | Permis de Conduire (Driver's License) | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Passeport (Passport) | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Carte D'Identite Consulaire / Consular Identity Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2020 | Voter Identification Card | ## Comoros (COM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :-------------------------------------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | Carte Nationale D'Identite (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Carte Nationale D'Identite (National Identity Card) | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Passeport (Passport) | | ALL | TravelDocument | CONSULAR_CARD | 2021 | Carte Consulaire / Consular Card | | ALL | Visa | VISA | 2023 | Visa | ## Congo (COG) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------------ | :------ | :-------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2016 | Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2023 | Permis de Conduire / Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2019 | Carte Nationale D'Identite (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2024 | Identity Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2024 | Carte D'Electeur (Voter Identification Card) | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Passeport Ordinaire / Ordinary Passport | | ALL | Passport | NATIONAL_PASSPORT | 2019 | Passeport (Passport) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2020 | Carte de Resident / Residence Permit | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Carte Consulaire / Consular Card | ## Democratic Republic of the Congo (COD) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------------- | :------ | :--------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2017 | Permis de Conduire National (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2020 | Permis de Conduire / Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2021 | Permis de Conduire (Driving Licence) | | ALL | DriversLicense | DRIVERS_LICENSE | 2022 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2023 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2024 | Driving License | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2022 | Carte de Residence Pour Etrangers (Residence Permit) | | ALL | IdentificationCard | POLICE_IDENTIFICATION_CARD | 2019 | Police Identification Card | | ALL | Military | MILITARY_CARD | 2020 | Carte d'Identite Militaire (Military Card) | | ALL | Permit | WORK_PERMIT | 2023 | Carte de Travail Pour Etranger (Work Permit) | | ALL | Passport | NATIONAL_PASSPORT | 2009 | Passeport (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2015 | Passeport (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2025 | Passeport / Passport | | ALL | TravelDocument | CONSULAR_IDENTITY_CARD | 2020 | Consular Identity Card | | ALL | TravelDocument | CONSULAR_IDENTITY_CARD | 2022 | Carte Consulaire / Consular Identity Card | | ALL | TravelDocument | CONSULAR_IDENTITY_CARD | 2023 | Carte Consulaire / Consular Card | | ALL | TravelDocument | CONSULAR_IDENTITY_CARD | 2024 | Carte Consulaire / Consular Card | | ALL | TravelDocument | CONSULAR_IDENTITY_CARD | 2025 | Carte Consulaire / Consular Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2010 | Carte D'Electeur (Voter's Card) | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2022 | Carte D'Electeur (Voter's Card) | ## Djibouti (DJI) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :--------- | :---------------- | :------ | :------------------- | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passeport (Passport) | ## Egypt (EGY) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :--------------------------- | :------ | :---------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2012 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2022 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2023 | Driving License | | ALL | DriversLicense | INTERNATIONAL_DRIVING_PERMIT | 2021 | International Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2000 | Identity Card | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2021 | Foreign Residence Card | | ALL | Passport | NATIONAL_PASSPORT | 2008 | Passport | | ALL | Visa | VISA | 2017 | Visa | ## Equatorial Guinea (GNQ) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :---------------------------------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Documento de Identidad Personal (Identity Card) | | ALL | DriversLicense | DRIVERS_LICENSE | 2017 | Permiso de Conducción / Driving License | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Pasaporte (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2020 | Pasaporte (Passport) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2024 | Permiso de Residencia (Residence Permit) | ## Eritrea (ERI) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :------------ | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passport | ## Eswatini (SWZ) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2007 | Driver's License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2011 | National Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passport | ## Ethiopia (ETH) | State | Type of ID | Subtype of ID | Version | Description | | :---------- | :----------------- | :-------------------------- | :------ | :-------------------------------- | | ADDIS_ABABA | IdentificationCard | IDENTIFICATION_CARD | 2020 | Addis Ababa City Resident ID Card | | ALL | DriversLicense | DRIVERS_LICENSE | 2004 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2010 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2011 | Driving License | | ALL | IdentificationCard | DIGITAL_IDENTIFICATION_CARD | 2023 | Ethiopian Digital ID Card | | ALL | IdentificationCard | DIGITAL_IDENTIFICATION_CARD | 2024 | Ethiopian Digital ID Card | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2025 | Passport | | ALL | TravelDocument | CONSULAR_CARD | 2020 | Consular Card | | ALL | Visa | VISA | 2024 | Visa | ## Gabon (GAB) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------------------------------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2011 | Carte Nationale D'Identite (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Carte nationale d'identité (identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Carte D'Identite Consulaire (Consular Identity Card) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2020 | Residence Permit | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Carte D'Identite Consulaire / Consular Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2009 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2022 | Passeport / Passport | | ALL | Visa | VISA | 2014 | Visa | ## Ghana (GHA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :----------------------------- | :------ | :------------------------------------------------ | | ALL | DriversLicense | DRIVERS_LICENSE | 2008 | Driver License | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Driver License | | ALL | DriversLicense | LEARNERS_PERMIT | 2018 | Learner's Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | National Identity Card | | ALL | IdentificationCard | ECOWAS | 2019 | ECOWAS Identity Card | | ALL | IdentificationCard | REFUGEE_IDENTIFICATION_CARD | 2024 | Refugee ID Card | | ALL | IdentificationCard | DIPLOMATIC_IDENTIFICATION_CARD | 2024 | Diplomatic Identification Card | | ALL | MedicalCard | MEDICAL_CARD | 2015 | Medical Card | | ALL | MedicalCard | MEDICAL_CARD | 2020 | Medical Card | | ALL | MedicalCard | VOTER_MEDICAL_CARD | 2016 | NHIS Membership Identification Card | | ALL | MedicalCard | SSNIT_CARD | 2020 | Social Security and National Insurance Trust Card | | ALL | Passport | NATIONAL_PASSPORT | 2007 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2010 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2025 | Passeport / Passport | | ALL | Visa | VISA | 2024 | Visa | | ALL | TravelDocument | CONSULAR_CARD | 2022 | Carte Consulaire (Consular Card) | | ALL | TravelDocument | CONSULAR_CARD | 2023 | Carte Consulaire (Consular Card) | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Carte D'Identite Consulaire (Consular Card) | | ALL | TravelDocument | CONSULAR_CARD | 2025 | Carte Consulaire / Consular Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2010 | Voter Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2020 | Voter Card | ## Guinea (GIN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------------------------------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2018 | Carte Nationale d'Identite (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | ECOWAS Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2007 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2014 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Passport | | ALL | TravelDocument | CONSULAR_CARD | 2022 | Carte D'identite Consulaire (Consular Identity Card) | | ALL | TravelDocument | CONSULAR_CARD | 2023 | Carte D'Identite Consulaire (Consular Card) | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Carte D'Identite Consulaire (Consular Card) | | ALL | Visa | VISA | 2021 | Visa | ## Guinea-Bissau (GNB) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------------ | :------ | :-------------------------------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Ecowas Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2021 | Passport | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2020 | Cartão de Eleitor (Voter Identification Card) | ## Ivory Coast (CIV) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2000 | Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2014 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2009 | Carte Nationale D'Identite (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Carte Nationale D'Identite (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Attestation D'Identite (Identity Card) | | ALL | TravelDocument | CONSULAR_CARD | 2018 | Carte D'Identite Consulaire (Consular Identity Card) | | ALL | TravelDocument | CONSULAR_CARD | 2020 | Carte Consulaire / Consular Card | | ALL | TravelDocument | CONSULAR_CARD | 2021 | Carte D'Identite Consulaire (Consular Card) | | ALL | TravelDocument | CONSULAR_CARD | 2022 | Carte D'Identite Consulaire / Consular Card | | ALL | TravelDocument | CONSULAR_CARD | 2023 | Carte D'Identite Consulaire (Consular Card) | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Carte D'Identite Consulaire / Consular Card | | ALL | TravelDocument | CONSULAR_CARD | 2025 | Carte Consulaire / Consular Card | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2018 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2024 | Resident Permit | | ALL | MedicalCard | MEDICAL_CARD | 2023 | Carte D'Assure (Medical Card) | | ALL | MedicalCard | MEDICAL_CARD | 2024 | Medical Card | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Passeport / Passport | | ALL | Permit | WORK_PERMIT | 2025 | Work Permit | ## Kenya (KEN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :----------------------------- | :------ | :-------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2019 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2020 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2024 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2011 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | National Identity Card | | ALL | IdentificationCard | REFUGEE_IDENTIFICATION_CARD | 2016 | Refugee ID Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2023 | National Identity Card | | ALL | IdentificationCard | DIPLOMATIC_IDENTIFICATION_CARD | 2023 | Diplomatic Identity Card | | ALL | IdentificationCard | POLICE_IDENTIFICATION_CARD | 2018 | Police Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2023 | Disability Identification Card | | ALL | MedicalCard | MEDICAL_CARD | 2018 | Medical Card | | ALL | Passport | NATIONAL_PASSPORT | 1997 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2007 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2008 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2015 | Passeport / Passport | | ALL | Passport | TRAVEL_DOCUMENT | 2024 | Titre de Voyage / Travel Document | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2021 | Foreigner Certificate | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2010 | Electors Card | | ALL | Military | MILITARY_CARD | 2023 | Defence Forces Identity Card | | ALL | Military | MILITARY_CARD | 2024 | National Youth Service ID Card | | ALL | Military | MILITARY_CARD | 2025 | Veteran Identity Card | ## Lesotho (LSO) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2012 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2018 | National Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Passeport / Passport | ## Liberia (LBR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :------------------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | National Identification Card | | ALL | DriversLicense | DRIVERS_LICENSE | 2022 | Driver’s License | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2020 | Passeport / Passport | | ALL | Permit | WORK_PERMIT | 2024 | Work Permit | | ALL | TravelDocument | CONSULAR_CARD | 2023 | Carte Consulaire / Consular Card | ## Libya (LBY) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :--------- | :------------------ | :------ | :------------------ | | ALL | Passport | NATIONAL_PASSPORT | 2014 | Passport | | ALL | Passport | DIPLOMATIC_PASSPORT | 2020 | Diplomatic Passport | ALL | Passport | DIPLOMATIC_PASSPORT | 2023 | Diplomatic Passport | ## Madagascar (MDG) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :----------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2021 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2016 | Kara Panondrom Pirenena (National Identity Card) | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Pasipaoro (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Pasipaoro (Passport) | ## Malawi (MWI) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :-------------------------- | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2021 | Passeport / Passport | | ALL | DriversLicense | DRIVERS_LICENSE | 2015 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2022 | Traffic Register Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2017 | Citizen Identification Card | ## Mali (MLI) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------------------------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2023 | Carte D'Identite Cedeao (ECOWAS Identity Card) | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2025 | Passport | ## Mauritania (MRT) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :------------------------------------- | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2021 | Passeport / Passport | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2015 | Carte D'Identification (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Carte D'Identification (Identity Card) | | ALL | ResidenceDocument | RESIDENCE_CARD | 2023 | Residence Card | ## Mauritius (MUS) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2013 | National Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2025 | National Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Passeport / Passport | ## Morocco (MAR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :-------------------------------------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2000 | Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVER_LICENSE | 2001 | Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVER_LICENSE | 2020 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2008 | Carte Nationale D'Identite (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Carte Nationale D'Identite (National Identity Card) | | ALL | Passport | NATIONAL_PASSPORT | 2009 | Passeport / Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2023 | Residence Permit | ## Mozambique (MOZ) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------------ | :------ | :------------------------------------ | | ALL | DriversLicense | DRIVERS_LICENSE | 2015 | Carta de Condução (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2021 | Carta de Condução (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2015 | Bilhete de Identidade (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2019 | Bilhete de Identidade (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Bilhete de Identidade (Identity Card) | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Passaporte / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2020 | Passaporte / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2022 | Passport | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2010 | Cartão de Eleitor (Voter Card) | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2023 | Cartão de Eleitor (Voter Card) | | ALL | ResidenceDocument | ASYLUM_SEEKER_CARD | 2021 | Asylum Seeker Card | | ALL | TravelDocument | CONSULAR_CARD | 2025 | Consular Card | | ALL | Visa | VISA | 2010 | Visto / Visa | ## Namibia (NAM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------------ | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2017 | Carta de Condução (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2022 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2006 | National Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2014 | Ordinary Passport | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Ordinary Passport | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2014 | Voter Card | ## Niger (NER) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :---------------- | :------ | :----------------------------------- | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passeport / Passport | | ALL | DriversLicense | DRIVER_LICENSE | 2020 | Permis de Conduire (Driving License) | | ALL | Military | MILITARY_CARD | 2020 | Military Card | | ALL | TravelDocument | CONSULAR_CARD | 2020 | Consular Card | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Carte Consulaire / Consular Card | ## Nigeria (NGA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :---------------------------- | :------ | :--------------------------------------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2019 | National Driver's License | | ALL | DriversLicense | INTERNATIONAL_DRIVERS_LICENSE | 2022 | International Driving Permit | | ALL | DriversLicense | INTERNATIONAL_DRIVERS_LICENSE | 2024 | International Driver's License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 1995 | National Identification Number Slip (NINS) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 1996 | National Identification Number (NIN) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2003 | National Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2005 | National Identification Number Slip | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | National Identification Number Slip (NINS) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2011 | National Identification Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2013 | National Identification Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2015 | National Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2016 | National Identification Number (NIN) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2019 | National Identification Number Slip | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2022 | National Identification Number (NIN) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2023 | National Identification Number Slip | | ALL | IdentificationCard | REFUGEE_IDENTIFICATION_CARD | 2019 | Refugee Identity Card | | ALL | Military | MILITARY_IDENTIFICATION_CARD | 2023 | Military Identification Card | | ALL | Passport | NATIONAL_PASSPORT | 2019 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2020 | Passeport / Passport | | ALL | VoterIdentification | VOTER_IDENTIFICATION | 2014 | Voter's Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION | 2018 | Voter's Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION | 2020 | Cartão de Eleitor (Voter Identification Card) | | ALL | VoterIdentification | VOTER_IDENTIFICATION | 2024 | Nigerian Voter's Card | | LAGOS | ResidenceDocument | RESIDENCE_CARD | 2015 | Lagos State Resident Card | | LAGOS | ResidenceDocument | RESIDENCE_CARD | 2020 | Lagos Residence Card | | ALL | TravelDocument | CONSULAR_CARD | 2017 | Carte D'Identite Consulaire / Consular Identity Card | | ALL | TravelDocument | CONSULAR_CARD | 2019 | Consular Identity Card | | ALL | TravelDocument | CONSULAR_CARD | 2021 | Consular Identity Card | | ALL | TravelDocument | CONSULAR_CARD | 2023 | Consular Card | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Carte Consulaire Du Nigeria Au Mali / Consular Card | | ALL | TravelDocument | CONSULAR_CARD | 2025 | Consular Identity Card | | ALL | Visa | VISA | 2024 | Visa | ## Republic of Chad (TCD) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------------ | :------ | :------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2017 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2019 | Carte Nationale D'Identite (Identity Card) | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2024 | Carte d'Electeur / Voter Identification Card | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2020 | Passeport / Passport | ## Rwanda (RWA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :-------------------------- | :------ | :--------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2008 | Uruhushya Rwo Gutwara Ibinyabiziga (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2019 | Indangamuntu (National Identity Card) | | ALL | ResidenceDocument | RESIDENCE_CARD | 2024 | Resident Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2019 | Pasiporo (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2020 | Passeport / Passport | | ALL | TravelDocument | LAISSEZ_PASSER | 2023 | Laissez - Passer | | ALL | TravelDocument | REFUGEE_TRAVEL_DOCUMENT | 2024 | Refugee Travel Document | | ALL | IdentificationCard | REFUGEE_IDENTIFICATION_CARD | 2022 | Refugee Identity Card | | ALL | Visa | VISA | 2024 | Visa | ## Sao Tome and Principe (STP) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :--------- | :---------------- | :------ | :-------------------------------- | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Passeport / Passport / Passaporte | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Passeport / Passport | ## Senegal (SEN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------------ | :------ | :-------------------------------------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | Carte Nationale D'Identite (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2017 | Carte D'Identite Cedeao (ECOWAS Identity Card) | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Permis de Conduire (Driving License) | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2024 | Carte d'Electeur / Voter Identification Card | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Carte D'Identite Consulaire / Consular Card | | ALL | Passport | NATIONAL_PASSPORT | 2014 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2025 | Passeport / Passport | ## Seychelles (SYC) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :--------------------------- | :------ | :--------------------- | | ALL | IdentificationCard | NATIONAL_IDENTIFICATION_CARD | 2010 | National Identity Card | | ALL | DriversLicense | DRIVERS_LICENSE | 2016 | Driving Licence | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passeport / Passport | ## Sierra Leone (SLE) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------- | :------ | :---------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Motor Driver's License | | ALL | DriversLicense | DRIVERS_LICENSE | 2023 | Motor Driver's License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | National Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passeport / Passport | | ALL | VoterIdentification | VOTER_IDENTIFICATION | 2010 | Voter ID Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION | 2020 | Voter Registration Card | ## Somalia (SOM) | State | Type of ID | Subtype of ID | Version | Description | | :--------- | :----------------- | :---------------------------- | :------ | :-------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2015 | Driver License | | ALL | DriversLicense | INTERNATIONAL_DRIVERS_LICENSE | 2023 | International Driver's License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2016 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2023 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2007 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2010 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Passport | | SOMALILAND | IdentificationCard | IDENTIFICATION_CARD | 2024 | Somaliland National Identity Card | | SOMALILAND | IdentificationCard | IDENTIFICATION_CARD | 2026 | Identification Card | ## South Africa (ZAF) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :--------------------------- | :------ | :---------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2005 | Carta de Conducao (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 1996 | National Identity Card | | ALL | IdentificationCard | NATIONAL_IDENTIFICATION_CARD | 2015 | National Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2007 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2009 | Passeport / Passport | | ALL | Visa | WORK_VISA | 2010 | Zimbabwean Exemption Permit (ZEP) | ## South Sudan (SSD) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :---------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2023 | Driving Licence | | ALL | DriversLicense | DRIVERS_LICENSE | 2024 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2014 | Nationality Certificate | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2024 | National ID Card | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Passport | | ALL | Visa | VISA | 2013 | Visa | ## Sudan (SDN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :------------------ | | ALL | DriversLicense | DRIVERS_LICENSE | 2017 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | Identification Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2015 | Identification Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2025 | Identification Card | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Passport | ## Tanzania (TZA) | State | Type of ID | Subtype of ID | Version | Description | | :------- | :------------------ | :----------------------------- | :------ | :-------------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2017 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2014 | Citizen Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2015 | Citizen Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Citizen Identity Card | | ALL | IdentificationCard | POLICE_IDENTIFICATION_CARD | 2024 | Police Identity Card | | ALL | IdentificationCard | DIPLOMATIC_IDENTIFICATION_CARD | 2024 | Diplomatic Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2005 | Pasipoti (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Pasipoti (Passport) | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2015 | Kadi Ya Mpiga Kura (Voter's Card) | | ALL | MedicalCard | MEDICAL_CARD | 2011 | Medical Card | | ALL | MedicalCard | MEDICAL_CARD | 2013 | Membership Identity Card (National Health Insurance Fund) | | ALL | MedicalCard | MEDICAL_CARD | 2019 | Medical Card | | ALL | Other | CABIN_CREW_CERTIFICATE | 2024 | Cabin Crew Certificate | | ZANZIBAR | DriversLicense | DRIVERS_LICENSE | 2021 | Zanzibar Driver's License | | ZANZIBAR | IdentificationCard | IDENTIFICATION_CARD | 2013 | Identification Card | ## The Gambia (GMB) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------- | :------ | :--------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2022 | Driver License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2019 | Carte D'Identite Cedeao (ECOWAS Identity Card) | | ALL | VoterIdentification | VOTER_IDENTIFICATION | 2020 | Voter ID Card | | ALL | Passport | NATIONAL_PASSPORT | 2002 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Passeport / Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2023 | Resident Permit - ''B'' Ecowas | ## Togo (TGO) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------------ | :------ | :-------------------------------------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Carte Nationale D'Identite (National Identity Card) | | ALL | DriversLicense | DRIVERS_LICENSE | 2020 | Permis de Conduire (Driving License) | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2024 | Carte d'Electeur / Voter Identification Card | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2023 | Residence Permit | | ALL | TravelDocument | CONSULAR_CARD | 2021 | Carte D'Identite Consulaire / Consular Card | | ALL | TravelDocument | CONSULAR_CARD | 2022 | Carte D'Identite Consulaire (Consular Card) | | ALL | TravelDocument | CONSULAR_CARD | 2023 | Carte D'Identite Consulaire (Consular Card) | | ALL | TravelDocument | CONSULAR_CARD | 2025 | Carte Consulaire (Consular Card) | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passeport / Passport | ## Trinidad and Tobago (TTO) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :-------------- | :------ | :-------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 1998 | Driver's Permit | ## Tunisia (TUN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2002 | Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2012 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2008 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2003 | Passport | ## Uganda (UGA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :-------------------------- | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2015 | Permis de Conduire / Driving Permit | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Permis de Conduire / Driving Permit | | ALL | DriversLicense | DRIVERS_LICENSE | 2021 | Permis de Conduire / Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2014 | National ID Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2025 | National ID Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2020 | Voter Identification Card | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2024 | Residential Card | | ALL | Military | MILITARY_CARD | 2022 | Uganda People's Defence Forces Card | | ALL | Other | REFUGEE_IDENTIFICATION_CARD | 2018 | Refugee Identity Card | | ALL | Other | REFUGEE_IDENTIFICATION_CARD | 2022 | Refugee Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2003 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passeport / Passport | | ALL | Visa | VISA | 2024 | Visa | ## Zambia (ZMB) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------------------ | :------ | :-------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2020 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2024 | Driving License | | ALL | IdentificationCard | COMMON_WEALTH_REGISTRATION_CARD | 2019 | Commonwealth Registration Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2019 | National Registration Card | | ALL | IdentificationCard | REFUGEE_IDENTIFICATION_CARD | 2024 | Refugee Identity Card | | ALL | MedicalCard | MEDICAL_CARD | 2023 | The National Health Insurance Membership Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2020 | Voter's Card | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Diplomatic Permit | | ALL | Passport | NATIONAL_PASSPORT | 2008 | Passeport / Passport | ## Zimbabwe (ZWE) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :---------------------------- | :------ | :----------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2000 | Driver's License | | ALL | DriversLicense | DRIVERS_LICENSE | 2024 | Driving License | | ALL | DriversLicense | INTERNATIONAL_DRIVERS_LICENSE | 2022 | International Driver's License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | National Registration Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2011 | National Registration Card | | ALL | Passport | NATIONAL_PASSPORT | 2011 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2022 | Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2025 | Residence Permit | --- - Path: `general-reference/supported-ids-asia` - URL: https://developer.incode.com/general-reference/supported-ids-asia/ - Markdown: https://developer.incode.com/general-reference/supported-ids-asia.md The following tables list supported identification documents for Asia, organized by country. The tables for India and the Philippines are further divided by ID type or state. ## Afghanistan (AFG) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | National Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Diplomatic Passport | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passport | ## Armenia (ARM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :----------------------- | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2013 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2014 | ID Card | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2015 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2021 | Travel Document / Passport | | ALL | ResidenceDocument | RESIDENCE_CARD | 2010 | Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 2023 | Residence Card | | ALL | ResidenceDocument | TEMPORARY_RESIDENCE_CARD | 2024 | Temporary Residence Card | ## Azerbaijan (AZE) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2013 | Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2021 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2005 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2019 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 1998 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2023 | Permit for Temporary Residence | ## Bahrain (BHR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2015 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2019 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2025 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2010 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2024 | Passport | | ALL | Passport | RESIDENCE_DOCUMENT | 2010 | Residence Permit | | ALL | Passport | RESIDENCE_DOCUMENT | 2021 | Residence Permit | ## Bangladesh (BGD) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :-------------------------- | :------ | :--------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2012 | Motor Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2017 | Professional Motor Driving License | | ALL | DriversLicense | PROVISIONAL_DRIVERS_LICENSE | 2024 | Non Professional E-Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2006 | National ID Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2016 | National ID Card | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2019 | Official Passport | | ALL | Visa | VISA | 2017 | Visa | ## Bhutan (BTN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2017 | Citizenship Card | | ALL | DriversLicense | DRIVERS_LICENSE | 2022 | Driving License | | ALL | Passport | NATIONAL_PASSPORT | 2006 | Passport | ## Brunei (BRN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :------------------------------ | | ALL | DriversLicense | DRIVERS_LICENSE | 2015 | Lesen Memandu / Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2017 | Lesen Memandu / Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2016 | Identity Card | | ALL | Military | MILITARY_CARD | 2020 | Armed Forces Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2008 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2019 | Certificate of Identity | ## Cambodia (KHM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2010 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2019 | Driver's License | | ALL | DriversLicense | DRIVERS_LICENSE | 2022 | Driver's License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2016 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2021 | Passport | | ALL | Passport | TRAVEL_DOCUMENT | 2023 | Travel Document | ## China (CHN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :-------------------------- | :------ | :---------------------------------------------------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2001 | Driving License of the People's Republic of China | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2004 | Domestic Identity Card | | ALL | Other | HUKOU_CARD | 2010 | Hukou Card | | ALL | Passport | NATIONAL_PASSPORT | 2007 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Passport | | ALL | Passport | DIPLOMATIC_PASSPORT | 2023 | Diplomatic Passport | | ALL | Passport | SERVICE_PASSPORT | 2022 | Service Passport | | ALL | Passport | SERVICE_PASSPORT | 2024 | Passport for Public Affairs | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2017 | Residence Permit | | ALL | TravelDocument | HOME_RETURN_PERMIT | 2012 | Mainland Travel Permit | | ALL | Visa | VISA | 2002 | Visa | | ALL | Visa | VISA | 2024 | Visa | | MACAU | DriversLicense | DRIVER_LICENSE | 2000 | Carta de condução de Macau (Driving License) | | MACAU | Passport | NATIONAL_PASSPORT | 2009 | Macau Passport | | MACAU | Passport | NATIONAL_PASSPORT | 2019 | Macau Passport | | MACAU | ResidenceDocument | PERMANENT_RESIDENT_IDENTITY | 2002 | Bilhete de Identidade de Residente Permanente de Macau (Macau Permanent Resident Identity Card) | | MACAU | ResidenceDocument | PERMANENT_RESIDENT_IDENTITY | 2013 | Bilhete de Identidade de Residente Permanente de Macau (Macau Permanent Resident Identity Card) | ## East Timor (TLS) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :----------------------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2018 | Bilhete de Identidade (Citizen Card) | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passaporte / Passport | ## Hong Kong (HKG) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :---------------- | :-------------------------- | :------ | :---------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2000 | Driving License | | ALL | Passport | NATIONAL_PASSPORT | 2007 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2019 | Passport | | ALL | ResidenceDocument | PERMANENT_RESIDENT_IDENTITY | 2003 | Permanent Identity Card | | ALL | ResidenceDocument | PERMANENT_RESIDENT_IDENTITY | 2018 | Permanent Identity Card | ## India (IND) ### National IDs | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :----------------------------- | :------ | :----------------------------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2003 | Union of India Driving License | | ALL | DriversLicense | DRIVER_LICENSE | 2007 | Indian Driving License | | ALL | DriversLicense | DRIVER_LICENSE | 2011 | Indian Union Driving License | | ALL | DriversLicense | DRIVER_LICENSE | 2024 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2005 | Aadhaar Card (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | Aadhaar Card (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2015 | Identification Card | | ALL | IdentificationCard | DIPLOMATIC_IDENTIFICATION_CARD | 2023 | Diplomatic Identity Card | | ALL | IdentificationCard | PENSIONERS_IDENTITY_CARD | 2024 | Pensioner's Identity Card | | ALL | IdentificationCard | AIRFORCE_IDENTIFICATION_CARD | 2023 | Retired Officers Identity Card | | ALL | IdentificationCard | AIRFORCE_IDENTIFICATION_CARD | 2024 | Air force Identification Card | | ALL | IdentificationCard | MASKED_IDENTIFICATION_CARD | 2005 | Masked Identification Card | | ALL | IdentificationCard | MASKED_IDENTIFICATION_CARD | 2015 | Masked Identification Card | | ALL | MedicalCard | MEDICAL_CARD | 2020 | Medical Card | | ALL | MedicalCard | MEDICAL_CARD | 2024 | Medical Card | | ALL | Military | MILITARY_CARD | 2020 | Retired Officer's Identity Card | | ALL | Military | MILITARY_CARD | 2021 | Indian Armed Forces Identity Card | | ALL | Military | PENSIONERS_IDENTITY_CARD | 2020 | Pensioner's Identity Card | | ALL | Military | PENSIONERS_IDENTITY_CARD | 2021 | Military Pensioner's Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2005 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2019 | Passport | | ALL | TaxIdentification | TAX_DEPARTMENT | 2000 | Tax Identification Card | | ALL | TaxIdentification | TAX_DEPARTMENT | 2010 | Tax Identification Card | | ALL | TaxIdentification | TAX_DEPARTMENT | 2015 | Tax Identification Card | | ALL | TaxIdentification | TAX_DEPARTMENT | 2019 | Tax Identification Card | | ALL | TaxIdentification | TAX_DEPARTMENT | 2020 | Tax Identification Card | | ALL | Visa | VISA | 2000 | Visa | | ALL | Visa | VISA | 2001 | Visa | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2000 | Elector Photo Identity Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2009 | Voter Identification Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2010 | Election Commission of India Identity Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2015 | Voter Identification Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2022 | Voter Identification Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2023 | Voter Identification Card | | ALL | TravelDocument | CERTIFICATE_OF_REGISTRATION_OCI | 2018 | Certificate of Registration OCI | ### Andaman and Nicobar | State | Type of ID | Subtype of ID | Version | Description | | :------------------ | :------------- | :-------------- | :------ | :---------------------------------- | | ANDAMAN_AND_NICOBAR | DriversLicense | DRIVERS_LICENSE | 2024 | Andaman and Nicobar Driving License | ### Andhra Pradesh | State | Type of ID | Subtype of ID | Version | Description | | :------------- | :------------- | :-------------- | :------ | :-------------------------------------------- | | ANDHRA_PRADESH | DriversLicense | DRIVERS_LICENSE | 2010 | Andhra Pradesh - Indian Union Driving License | | ANDHRA_PRADESH | DriversLicense | DRIVERS_LICENSE | 2011 | Andhra Pradesh - Indian Union Driving License | | ANDHRA_PRADESH | DriversLicense | DRIVERS_LICENSE | 2020 | Andhra Pradesh - Indian Union Driving License | | ANDHRA_PRADESH | DriversLicense | DRIVERS_LICENSE | 2021 | Andhra Pradesh - Indian Union Driving License | ### Arunachal Pradesh | State | Type of ID | Subtype of ID | Version | Description | | :---------------- | :------------- | :-------------- | :------ | :-------------------------------- | | ARUNACHAL_PRADESH | DriversLicense | DRIVERS_LICENSE | 2020 | Arunachal Pradesh Driving License | | ARUNACHAL_PRADESH | DriversLicense | DRIVERS_LICENSE | 2023 | Arunachal Pradesh Driving License | ### Assam | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :-------------- | :------ | :------------------------------------------------- | | ASSAM | DriversLicense | DRIVERS_LICENSE | 2010 | Government of Assam - Indian Union Driving License | | ASSAM | DriversLicense | DRIVERS_LICENSE | 2021 | Assam Driving License | | ASSAM | DriversLicense | DRIVERS_LICENSE | 2022 | Assam Driving License | ### Bihar | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :-------------- | :------ | :------------------------------------------------- | | BIHAR | DriversLicense | DRIVERS_LICENSE | 2016 | Government of Bihar - Indian Driving License | | BIHAR | DriversLicense | DRIVERS_LICENSE | 2022 | Indian Union Driving License - Government of Bihar | ### Chandigarh | State | Type of ID | Subtype of ID | Version | Description | | :--------- | :------------- | :-------------- | :------ | :--------------------------------- | | CHANDIGARH | DriversLicense | DRIVERS_LICENSE | 2008 | Driving License - Chandigarh State | ### Chhattisgarh | State | Type of ID | Subtype of ID | Version | Description | | :----------- | :------------- | :-------------- | :------ | :-------------------------------------------------------- | | CHHATTISGARH | DriversLicense | DRIVERS_LICENSE | 2008 | Indian Union Driving License - Chhattisgarh State | | CHHATTISGARH | DriversLicense | DRIVERS_LICENSE | 2009 | Indian Union Driving License - Government of Chhattisgarh | | CHHATTISGARH | DriversLicense | DRIVERS_LICENSE | 2023 | Chhattisgarh Driving License | ### Dadra and Nagar Haveli | State | Type of ID | Subtype of ID | Version | Description | | :--------------------- | :------------- | :-------------- | :------ | :------------------------------------- | | DADRA_AND_NAGAR_HAVELI | DriversLicense | DRIVERS_LICENSE | 2016 | Dadra and Nagar Haveli Driving License | ### Delhi | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :-------------- | :------ | :---------------------------------------------------------------- | | DELHI | DriversLicense | DRIVERS_LICENSE | 2002 | Delhi Driving License | | DELHI | DriversLicense | DRIVERS_LICENSE | 2003 | Indian Union Driving License - Transport Department GNCT of Delhi | | DELHI | DriversLicense | DRIVERS_LICENSE | 2009 | Driving License - Transport Department Government of NCT of Delhi | | DELHI | DriversLicense | DRIVERS_LICENSE | 2019 | Driving License - Transport Department Government of NCT of Delhi | | DELHI | DriversLicense | DRIVERS_LICENSE | 2021 | Indian Union Driving License - Transport Department GNCT of Delhi | ### Goa | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :-------------- | :------ | :--------------------------------------- | | GOA | DriversLicense | DRIVERS_LICENSE | 2017 | Indian Union Driving License - Goa State | ### Gujarat | State | Type of ID | Subtype of ID | Version | Description | | :------ | :------------- | :-------------- | :------ | :--------------------------------------------------- | | GUJARAT | DriversLicense | DRIVERS_LICENSE | 2005 | Union of India Driving License - Gujarat State | | GUJARAT | DriversLicense | DRIVERS_LICENSE | 2008 | Gujarat Driving License | | GUJARAT | DriversLicense | DRIVERS_LICENSE | 2014 | Gujarat State Driving License | | GUJARAT | DriversLicense | DRIVERS_LICENSE | 2020 | Indian Union Driving License - Government of Gujarat | ### Gurgaon | State | Type of ID | Subtype of ID | Version | Description | | :------ | :------------- | :-------------- | :------ | :---------------------- | | GURGAON | DriversLicense | DRIVERS_LICENSE | 2017 | Gurgaon Driving License | ### Haryana | State | Type of ID | Subtype of ID | Version | Description | | :------ | :------------- | :-------------- | :------ | :--------------------------------------------- | | HARYANA | DriversLicense | DRIVERS_LICENSE | 2006 | Indian Driving License - Government of Haryana | | HARYANA | DriversLicense | DRIVERS_LICENSE | 2016 | Haryana Driving License | ### Himachal Pradesh | State | Type of ID | Subtype of ID | Version | Description | | :--------------- | :------------- | :-------------- | :------ | :------------------------------------------------------------ | | HIMACHAL_PRADESH | DriversLicense | DRIVERS_LICENSE | 2013 | Indian Union Driving License - Government of Himachal Pradesh | | HIMACHAL_PRADESH | DriversLicense | DRIVERS_LICENSE | 2024 | Himachal Pradesh Driving License | ### Jammu and Kashmir | State | Type of ID | Subtype of ID | Version | Description | | :---------------- | :------------- | :-------------- | :------ | :----------------------------------------------------------- | | JAMMU_AND_KASHMIR | DriversLicense | DRIVERS_LICENSE | 2010 | Indian Union Driving License - Government of Jammu & Kashmir | | JAMMU_AND_KASHMIR | DriversLicense | DRIVERS_LICENSE | 2014 | Indian Union Driving License - Government of Jammu & Kashmir | | JAMMU_AND_KASHMIR | DriversLicense | DRIVERS_LICENSE | 2024 | Jammu and Kashmir Driving License | ### Jharkhand | State | Type of ID | Subtype of ID | Version | Description | | :-------- | :------------- | :-------------- | :------ | :--------------------------------------------- | | JHARKHAND | DriversLicense | DRIVERS_LICENSE | 2014 | Indian Union Driving License - Jharkhand State | | JHARKHAND | DriversLicense | DRIVERS_LICENSE | 2017 | Indian Union Driving License - Jharkhand State | ### Karnataka | State | Type of ID | Subtype of ID | Version | Description | | :-------- | :------------- | :-------------- | :------ | :--------------------------------------------------- | | KARNATAKA | DriversLicense | DRIVERS_LICENSE | 2005 | Indian Union Motor Driving License - Karnataka State | | KARNATAKA | DriversLicense | DRIVERS_LICENSE | 2010 | Driving License - Karnataka State | ### Kerala | State | Type of ID | Subtype of ID | Version | Description | | :----- | :------------- | :-------------- | :------ | :------------------------------------------ | | KERALA | DriversLicense | DRIVERS_LICENSE | 2016 | Indian Union Driving License - Kerala State | | KERALA | DriversLicense | DRIVERS_LICENSE | 2018 | Kerala Driving License | | KERALA | DriversLicense | DRIVERS_LICENSE | 2019 | Indian Union Driving License - Kerala State | ### Madhya Pradesh | State | Type of ID | Subtype of ID | Version | Description | | :------------- | :------------- | :-------------- | :------ | :----------------------------- | | MADHYA_PRADESH | DriversLicense | DRIVERS_LICENSE | 2020 | Madhya Pradesh Driving License | ### Maharashtra | State | Type of ID | Subtype of ID | Version | Description | | :---------- | :----------------- | :----------------------- | :------ | :----------------------------------------------------------- | | MAHARASHTRA | DriversLicense | DRIVER_LICENSE | 2000 | Maharashtra State Motor Driving License - The Union of India | | MAHARASHTRA | DriversLicense | DRIVER_LICENSE | 2005 | Maharashtra Driving License | | MAHARASHTRA | DriversLicense | DRIVER_LICENSE | 2023 | Maharashtra Driving License | | MAHARASHTRA | IdentificationCard | PENSIONERS_IDENTITY_CARD | 2024 | Maharashtra Pensioner's Identity Card | ### Manipur | State | Type of ID | Subtype of ID | Version | Description | | :------ | :------------- | :-------------- | :------ | :--------------------------------------------------- | | MANIPUR | DriversLicense | DRIVERS_LICENSE | 2019 | Indian Union Driving License - Government of Manipur | ### Mizoram | State | Type of ID | Subtype of ID | Version | Description | | :------ | :------------- | :-------------- | :------ | :---------------------- | | MIZORAM | DriversLicense | DRIVERS_LICENSE | 2022 | Mizoram Driving License | ### Nagaland | State | Type of ID | Subtype of ID | Version | Description | | :------- | :------------- | :-------------- | :------ | :----------------------- | | NAGALAND | DriversLicense | DRIVERS_LICENSE | 2018 | Nagaland Driving License | | NAGALAND | DriversLicense | DRIVERS_LICENSE | 2020 | Nagaland Driving License | ### Odisha | State | Type of ID | Subtype of ID | Version | Description | | :----- | :------------- | :-------------- | :------ | :------------------------------------------ | | ODISHA | DriversLicense | DRIVERS_LICENSE | 2019 | Indian Union Driving License - Odisha State | | ODISHA | DriversLicense | DRIVERS_LICENSE | 2020 | Indian Union Driving License - Odisha State | ### Punjab | State | Type of ID | Subtype of ID | Version | Description | | :----- | :------------- | :-------------- | :------ | :------------------------------------------ | | PUNJAB | DriversLicense | DRIVERS_LICENSE | 2000 | Indian Union Driving License - Punjab State | | PUNJAB | DriversLicense | DRIVERS_LICENSE | 2021 | Indian Union Driving License - Punjab State | | PUNJAB | DriversLicense | DRIVERS_LICENSE | 2023 | Punjab Driving License | | PUNJAB | DriversLicense | DRIVERS_LICENSE | 2024 | Punjab Driving License | ### Rajasthan | State | Type of ID | Subtype of ID | Version | Description | | :-------- | :------------- | :-------------- | :------ | :---------------------------------------- | | RAJASTHAN | DriversLicense | DRIVERS_LICENSE | 2012 | Driving License - Government of Rajasthan | | RAJASTHAN | DriversLicense | DRIVERS_LICENSE | 2015 | Driving License - Government of Rajasthan | | RAJASTHAN | DriversLicense | DRIVERS_LICENSE | 2024 | Rajasthan International Driving Permit | ### Sikkim | State | Type of ID | Subtype of ID | Version | Description | | :----- | :------------- | :-------------- | :------ | :--------------------- | | SIKKIM | DriversLicense | DRIVERS_LICENSE | 2020 | Sikkim Driving License | | SIKKIM | DriversLicense | DRIVERS_LICENSE | 2021 | Sikkim Driving License | ### Tamil Nadu | State | Type of ID | Subtype of ID | Version | Description | | :--------- | :------------- | :-------------- | :------ | :------------------------------------------------------ | | TAMIL_NADU | DriversLicense | DRIVERS_LICENSE | 2000 | India Driving License - Tamil Nadu | | TAMIL_NADU | DriversLicense | DRIVERS_LICENSE | 2003 | Union of India Driving License - Tamil Nadu | | TAMIL_NADU | DriversLicense | DRIVERS_LICENSE | 2005 | India Driving License - Tamil Nadu | | TAMIL_NADU | DriversLicense | DRIVERS_LICENSE | 2020 | Indian Driving License - Tamil Nadu | | TAMIL_NADU | DriversLicense | DRIVERS_LICENSE | 2023 | Indian Union Driving License - Government of Tamil Nadu | ### Telangana | State | Type of ID | Subtype of ID | Version | Description | | :-------- | :----------------- | :---------------------------- | :------ | :----------------------------------------------------------------- | | TELANGANA | DriversLicense | CERTIFICATE_OF_TRANSPORTATION | 2005 | Certificate of Registration - Telangana State Transport Department | | TELANGANA | DriversLicense | DRIVERS_LICENSE | 2014 | Indian Union Driving License - Telangana State | | TELANGANA | DriversLicense | DRIVERS_LICENSE | 2021 | Indian Union Driving License - Telangana State | | TELANGANA | DriversLicense | DRIVERS_LICENSE | 2022 | Telangana Driving License | | TELANGANA | DriversLicense | INTERNATIONAL_DRIVING_PERMIT | 2020 | Telangana International Driving Permit | | TELANGANA | IdentificationCard | POLICE_IDENTIFATION_CARD | 2020 | Telangana Police Identification Card | ### Tripura | State | Type of ID | Subtype of ID | Version | Description | | :------ | :------------- | :-------------- | :------ | :---------------------- | | TRIPURA | DriversLicense | DRIVERS_LICENSE | 2020 | Tripura Driving License | | TRIPURA | DriversLicense | DRIVERS_LICENSE | 2024 | Tripura Driving License | ### Uttarakhand | State | Type of ID | Subtype of ID | Version | Description | | :---------- | :------------- | :-------------- | :------ | :--------------------------------------------------------- | | UTTARAKHAND | DriversLicense | DRIVERS_LICENSE | 2013 | Indian Union Driving License - Government of Uttarakhand | | UTTARAKHAND | DriversLicense | DRIVERS_LICENSE | 2016 | Union of India Driving License - Government of Uttarakhand | ### Uttar Pradesh | State | Type of ID | Subtype of ID | Version | Description | | :------------ | :------------- | :-------------- | :------ | :------------------------------------------- | | UTTAR_PRADESH | DriversLicense | DRIVERS_LICENSE | 2019 | Indian Union Driving License - Uttar Pradesh | | UTTAR_PRADESH | DriversLicense | DRIVERS_LICENSE | 2020 | Uttar Pradesh Driving License | ### West Bengal | State | Type of ID | Subtype of ID | Version | Description | | :---------- | :------------- | :-------------- | :------ | :------------------------------------------------------------- | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2000 | West Bengal Driving License | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2002 | West Bengal Driving License | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2003 | West Bengal Driving License | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2006 | Indian Union Driving License - West Bengal State | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2007 | West Bengal Driving License | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2008 | Indian Union Driving License - Government of West Bengal State | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2012 | Indian Union Driving License - West Bengal State | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2013 | Indian Union Driving License - Government of West Bengal State | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2014 | Indian Union Driving License - Government of West Bengal State | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2015 | Indian Union Driving License - West Bengal State | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2018 | West Bengal Driving License | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2019 | West Bengal Driving License | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2020 | Indian Union Driving License - Government of West Bengal State | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2023 | West Bengal Driving License | | WEST_BENGAL | DriversLicense | DRIVERS_LICENSE | 2024 | West Bengal Driving License | ## Indonesia (IDN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2000 | Driving License | | ALL | DriversLicense | DRIVER_LICENSE | 2019 | Driving License | | ALL | DriversLicense | DRIVER_LICENSE | 2023 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2000 | Kartu Tanda Penduduk (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Kartu Identitas Anak (Identity Card) | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Paspor / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2015 | Paspor / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2022 | Paspor / Passport | | ALL | Passport | DIPLOMATIC_PASSPORT | 2024 | Diplomatic Passport | ## Iran (IRN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :-------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2010 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2012 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2011 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2007 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2011 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2014 | Passport | | ALL | Visa | VISA | 2018 | Visa | ## Iraq (IRQ) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :------------------ | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | Identification Card | | ALL | IdentificationCard | REFUGEE_IDENTIFICATION_CARD | 2025 | Refugee Identification Card | | ALL | Military | MILITARY_CARD | 2026 | Military Card | | ALL | Passport | NATIONAL_PASSPORT | 2011 | Passport | | ALL | DriversLicense | DRIVERS_LICENSE | 2023 | Driving License | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passport | | ALL | ResidenceDocument | RESIDENCE_CARD | 2021 | Residence Card | ## Israel (ISR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :-------------------------------- | :------ | :-------------------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2009 | Driving License | | ALL | DriversLicense | DRIVER_LICENSE | 2018 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2000 | Domestic Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2013 | Domestic Identity Card | | ALL | Military | MILITARY_CARD | 2024 | Military Card | | ALL | Passport | NATIONAL_PASSPORT | 2011 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Passport | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Consular Card | | ALL | TravelDocument | TEMPORARY_IMMIGRATION_CERTIFICATE | 2010 | Temporary Immigration Certificate | ## Japan (JPN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------------- | :------ | :------------------------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2000 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2006 | Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2016 | Residence Card | | ALL | ResidenceDocument | SPECIAL_PERMANENT_RESIDENT_CERTIFICATE | 2024 | Special Permanent Resident Certificate | | ALL | Visa | VISA | 2000 | Visa | | ALL | Visa | VISA | 2001 | Visa | | ALL | Visa | VISA | 2002 | Visa | | ALL | Visa | VISA | 2024 | Visa | ## Jordan (JOR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :--------------------------- | :------ | :--------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 1996 | Driving License | | ALL | DriversLicense | INTERNATIONAL_DRIVING_PERMIT | 2020 | International Driving Permit | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2012 | ID Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2025 | Identification Card | | ALL | Passport | NATIONAL_PASSPORT | 2008 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Passport | | ALL | Military | MILITARY_CARD | 2022 | Military Card | | ALL | Military | MILITARY_CARD | 2023 | Military Card | | ALL | Military | MILITARY_CARD | 2024 | Military Card | | ALL | Other | INVESTOR_CARD | 2020 | Investor Card | ## Kazakhstan (KAZ) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :------------------ | | ALL | DriversLicense | DRIVERS_LICENSE | 2005 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2016 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2008 | Identification Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2009 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2015 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2009 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2021 | Passport | ## Kuwait (KWT) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2004 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2014 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2011 | Civil ID Card | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2019 | Civil ID Card | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2022 | Residence Permit | ## Kyrgyzstan (KGZ) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :---------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2019 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2020 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2021 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2005 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2017 | Identity Card | | ALL | Passport | DIPLOMATIC_PASSPORT | 2021 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2011 | National Passport | | ALL | Passport | NATIONAL_PASSPORT | 2021 | Passport | ## Laos (LAO) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :--------- | :---------------- | :------ | :---------- | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Passport | ## Lebanon (LBN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :---------------------------- | :------ | :------------------------------------------ | | ALL | DriversLicense | DRIVERS_LICENSE | 2010 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Permis de Conduire (Driving License) | | ALL | DriversLicense | INTERNATIONAL_DRIVERS_LICENSE | 2020 | International Driving Permit | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2015 | Identity Card | | ALL | Military | MILITARY_DRIVERS_LICENSE | 2017 | Military Driver License | | ALL | Military | MILITARY_IDENTIFICATION_CARD | 2025 | Military Identification Card | | ALL | TravelDocument | CONSULAR_CARD | 2021 | Carte D'Identite Consulaire / Consular Card | | ALL | Passport | NATIONAL_PASSPORT | 2010 | Passeport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passeport / Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2023 | Residence Permit | ## Malaysia (MYS) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------- | :------ | :------------------------------------------------------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2000 | Driving License | | ALL | DriversLicense | LEARNERS_PERMIT | 2000 | Lesen Belajar Memandu Malaysia (Malaysian Learner's Driving License) | | ALL | DriversLicense | DRIVER_LICENSE | 2025 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2012 | Identity Card | | ALL | IdentificationCard | DIPLOMATIC_IDENTIFICATION_CARD | 2024 | Diplomatic Identification Card | | ALL | Military | MILITARY_CARD | 2020 | Military Card | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2020 | Residence Pass - Talent | | ALL | IdentificationCard | POLICE_IDENTIFICATION_CARD | 2020 | Police Identification Card | | ALL | Passport | NATIONAL_PASSPORT | 2008 | Pasport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Pasport / Passport | | ALL | Visa | VISA | 2022 | Multiple Entry Visa | | ALL | Permit | WORK_PERMIT | 2023 | Employment Pass | | ALL | ResidenceDocument | STUDENT_PASS | 2020 | Student Pass | | ALL | Other | PROFESSIONAL_IDENTIFICATION_CARD | 2020 | Malaysian Vocational License | ## Maldives (MDV) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | National Identity Card | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2023 | Driving License | | ALL | Permit | WORK_PERMIT | 2020 | Work Permit | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Passport | ## Mongolia (MNG) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :-------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2014 | Mongolian Driver's License | | ALL | DriversLicense | DRIVERS_LICENSE | 2022 | Driver's License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2013 | Citizen Identity Card of Mongolia | | ALL | Passport | NATIONAL_PASSPORT | 2007 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passport | ## Myanmar (MMR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :---------------- | :------ | :-------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2006 | Driving License | | ALL | Passport | NATIONAL_PASSPORT | 2014 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passport | | ALL | Passport | TRAVEL_DOCUMENT | 2025 | Travel Document | | ALL | Visa | VISA | 2014 | Visa | ## Nepal (NPL) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :--------------------------- | :------ | :--------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2007 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2015 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2021 | Driving License | | ALL | DriversLicense | PROBATIONARY_DRIVERS_LICENSE | 2022 | Probationary Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2023 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2018 | National Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2024 | National Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2010 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2022 | Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2010 | Citizenship Certificate | ## Oman (OMN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :---------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2015 | Vehicle Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2006 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2025 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2014 | Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2010 | Resident Card | ## Pakistan (PAK) | State | Type of ID | Subtype of ID | Version | Description | | :--------------------- | :----------------- | :---------------------------- | :------ | :----------------------------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2002 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2012 | National Identity Card | | ALL | DriversLicense | DRIVERS_LICENSE | 2020 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2021 | National Driving Permit | | ALL | DriversLicense | INTERNATIONAL_DRIVING_PERMIT | 2022 | International Driving Permit | | ALL | DriversLicense | INTERNATIONAL_DRIVING_PERMIT | 2023 | International Driving Permit | | ALL | DriversLicense | INTERNATIONAL_DRIVING_PERMIT | 2024 | International Driving Permit | | ALL | DriversLicense | INTERNATIONAL_DRIVING_PERMIT | 2025 | International Driving Permit | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passport | | ALL | TravelDocument | TRAVEL_IDENTIFICATION_CARD | 2014 | National Identity Card Overseas Pakistanis | | AZAD_JAMMU_AND_KASHMIR | DriversLicense | DRIVERS_LICENSE | 2023 | Azad Jammu & Kashmir Driving License | | BALOCHISTAN | DriversLicense | DRIVERS_LICENSE | 2024 | Balochistan Driver License | | ISLAMABAD | DriversLicense | DRIVERS_LICENSE | 2015 | Islamabad Driving License | | ISLAMABAD | DriversLicense | DRIVERS_LICENSE | 2020 | Islamabad Driving License / Permit | | KHYBER_PAKHTUNKHWA | DriversLicense | DRIVERS_LICENSE | 2024 | Khyber Pakhtunkhwa Driver's License | | KHYBER_PAKHTUNKHWA | DriversLicense | INTERNATIONAL_DRIVERS_LICENSE | 2021 | International Driving License | | KHYBER_PAKHTUNKHWA | DriversLicense | DRIVERS_LICENSE | 2023 | Khyber Pakhtunkhwa Driver's License | | PUNJAB | DriversLicense | DRIVERS_LICENSE | 2007 | Punjab Driving License | | SINDH | DriversLicense | DRIVERS_LICENSE | 2006 | Sindh Driving License | | SINDH | DriversLicense | DRIVERS_LICENSE | 2016 | Sindh Driving License | | SINDH | DriversLicense | LEARNERS_PERMIT | 2024 | Sindh Driving License | ## Palestine (PSE) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :-------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2010 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2011 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2016 | Identity Card | | ALL | DriversLicense | DRIVERS_LICENSE | 2010 | Driving License | | ALL | Passport | NATIONAL_PASSPORT | 2009 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passport | ## Philippines (PHL) ### National IDs | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :----------------------------------- | :------ | :--------------------------------------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2000 | Non-Professional Driver's License | | ALL | DriversLicense | DRIVER_LICENSE | 2017 | Non-Professional Driver's License | | ALL | DriversLicense | DRIVER_LICENSE | 2023 | Driver's License | | ALL | IdentificationCard | CITIZENCARD | 2021 | Philippine Identification Card | | ALL | IdentificationCard | DIPLOMATIC_IDENTIFICATION_CARD | 2025 | Diplomatic Identification Card | | ALL | IdentificationCard | EPHIL_CARD | 2023 | Philippine Identification | | ALL | IdentificationCard | EPHIL_CARD_PDF | 2023 | Ephil Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Philippine Identification Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Philippine Identification Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2022 | Philippine Identification Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2023 | Philippine National ID | | ALL | IdentificationCard | POLICE_CLEARANCE_IDENTIFICATION_CARD | 2010 | Parañaque City Police Clearance Card | | ALL | IdentificationCard | POLICE_CLEARANCE_IDENTIFICATION_CARD | 2011 | Police Clearance ID Card | | ALL | IdentificationCard | POLICE_CLEARANCE_IDENTIFICATION_CARD | 2012 | Online Police Clearance Card | | ALL | IdentificationCard | POLICE_CLEARANCE_IDENTIFICATION_CARD | 2013 | Police Clearance Identification Card | | ALL | IdentificationCard | POLICE_CLEARANCE_IDENTIFICATION_CARD | 2014 | Police Clearance Card | | ALL | IdentificationCard | POLICE_CLEARANCE_IDENTIFICATION_CARD | 2017 | Caloocan City Police Clearance Identification Card | | ALL | IdentificationCard | POLICE_CLEARANCE_IDENTIFICATION_CARD | 2019 | Police Clearance Data Card | | ALL | IdentificationCard | POLICE_CLEARANCE_IDENTIFICATION_CARD | 2020 | Police Identification Card | | ALL | IdentificationCard | POLICE_CLEARANCE_IDENTIFICATION_CARD | 2021 | Valenzuela City Police Clearance Identification Card | | ALL | IdentificationCard | POLICE_CLEARANCE_IDENTIFICATION_CARD | 2022 | Manila City Clearance Data Card | | ALL | IdentificationCard | POLICE_CLEARANCE_IDENTIFICATION_CARD | 2023 | Cebu City Police Clearance Identification Card | | ALL | IdentificationCard | POLICE_CLEARANCE_IDENTIFICATION_CARD | 2024 | Police Clearance Identity Card | | ALL | IdentificationCard | POLICE_IDENTIFICATION_CARD | 2022 | Makati City Police Clearance Identification Card | | ALL | IdentificationCard | POLICE_IDENTIFICATION_CARD | 2023 | Police Identity Card | | ALL | IdentificationCard | POLICE_IDENTIFICATION_CARD | 2024 | Police Identification Card | | ALL | IdentificationCard | PROFESSIONAL_IDENTIFICATION_CARD | 2024 | Professional License ID | | ALL | IdentificationCard | UMID_CARD | 2000 | Unified Multi-Purpose ID | | ALL | IdentificationCard | UMID_CARD | 2001 | Unified Multi-Purpose ID | | ALL | IdentificationCard | UMID_CARD | 2002 | Unified Multi-Purpose ID | | ALL | MedicalCard | MEDICAL_CARD | 2009 | PhilHealth Insurance Card | | ALL | MedicalCard | MEDICAL_CARD | 2010 | PhilHealth Insurance Card | | ALL | MedicalCard | MEDICAL_CARD | 2012 | PhilHealth Insurance Card | | ALL | MedicalCard | MEDICAL_CARD | 2013 | Medical Card | | ALL | Military | MILITARY_CARD | 2019 | Military Card | | ALL | Military | MILITARY_CARD | 2022 | Military Card | | ALL | Military | MILITARY_CARD | 2023 | Military Card | | ALL | Military | MILITARY_CARD | 2024 | Military Card | | ALL | Military | MILITARY_CARD | 2025 | Military Card | | ALL | Other | COAST_GUARD | 2020 | Cost Guard Card | | ALL | Other | FIRE_PROTECTION_BUREAU_ID | 2022 | Fire Protecation BUREAU ID | | ALL | Other | GSIS_ECARD_PLUS | 2020 | GSIS eCard Plus | | ALL | Other | MARITIME_INDUSTRY_AUTHORITY | 2020 | Maritime Industry Authority Card | | ALL | Other | MARITIME_INDUSTRY_AUTHORITY | 2021 | Maritime Industry Authority Card | | ALL | Other | MARITIME_INDUSTRY_AUTHORITY | 2022 | Maritime Industry Authority Card | | ALL | Other | NBI_CLEARANCE | 2020 | National Bureau Investigation Clearance | | ALL | Other | PHILPOST | 2015 | Postal Identity Card - PHLPOST | | ALL | Other | PHILPOST | 2018 | Postal Identity Card - PHLPOST | | ALL | Other | PHILPOST | 2020 | Postal Identity Card - PHLPOST | | ALL | Other | PROFESSIONAL_REGULATION_COMMISSION | 2000 | Professional Identification Card | | ALL | Other | PROFESSIONAL_REGULATION_COMMISSION | 2010 | Professional Identification Card | | ALL | Other | PROFESSIONAL_REGULATION_COMMISSION | 2026 | Professional Identification Card | | ALL | Other | SOCIAL_SECURITY_CARD | 2011 | Social Security System Number | | ALL | Other | SOCIAL_SECURITY_CARD | 2024 | Social Security Card | | ALL | Passport | NATIONAL_PASSPORT | 2010 | Pasaporte / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Pasaporte / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Pasaporte / Passport | | ALL | ResidenceDocument | ALIEN_CERTIFICATE_OF_REGISTRATION | 2020 | Alien Certificate of Registration | | ALL | ResidenceDocument | SPECIAL_INVESTOR_RESIDENT_VISA | 2020 | Special Investor's Resident Visa | | ALL | TaxIdentification | TAX_IDENTIFICATION | 2017 | TIN (Taxpayer Identification Number) ID | | ALL | TaxIdentification | TAX_IDENTIFICATION | 2020 | TIN (Taxpayer Identification Number) ID | | ALL | TaxIdentification | TAX_IDENTIFICATION | 2021 | TIN (Taxpayer Identification Number) ID | | ALL | TaxIdentification | TAX_IDENTIFICATION | 2022 | TIN (Taxpayer Identification Number) ID | | ALL | Visa | VISA | 2016 | Visa | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2010 | Voter's ID | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2011 | Voter's ID | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2022 | Voter Identification Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2024 | Voter's Certification | ### Local Disability Identification Cards | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :----------------------------- | :------ | :------------------------------------------------------------ | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1938 | City of Lipa Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1939 | City of Caloocan Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1940 | City Government of Valenzuela Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1941 | City of Cauayan Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1943 | City of Santa Rosa Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1944 | Municipality of Concepcion Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1945 | City of Santa Rosa Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1946 | San Antonio Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1947 | Naga City Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1948 | Municipality of Bulalacao Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1949 | Municipality of Tanza Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1950 | Province of Capiz Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1951 | Tuguegarao City Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1952 | City of Liliw Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1953 | Municipality of Dinalupihan Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1954 | City of Bacoor Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1955 | City of Talisay Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1956 | Municipality of Rizal Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1957 | City of Santiago Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1958 | City of Pasay Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1959 | City of Makati Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1960 | City Government of Tanauan Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1961 | Municipality of Marilao Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1962 | Municipality of Tapaz Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1963 | City of Himamaylan Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1964 | Municipality of Los Baños Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1965 | Municipality of Subic Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1966 | Municipality of Daraga Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1967 | Municipality of Jaro Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1968 | City Government of Pasig Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1969 | Municipality of Santa Barbara Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1970 | Municipality of Pateros Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1973 | City of Tagaytay Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1974 | City of Navotas Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1975 | Municipality of Cabatuan Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1976 | Province of Batangas Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1978 | Municipality of Kalibo Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1979 | Iloilo City Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1980 | City of Caloocan Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1983 | City of Imus Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1984 | City of Davao Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1985 | City of San Juan Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1987 | City of Parañaque Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1989 | Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1993 | City of Bacoor Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1995 | City of Paranaque Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1997 | City of Cotabato Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1998 | Province of Rizal Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 1999 | City of General Trias Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2000 | City of Malolos Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2001 | City of Antipolo Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2002 | Victoria, Laguna Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2003 | Province of Pampanga Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2004 | City of Muntinlupa Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2005 | Las Pinas City Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2006 | Cebu City Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2007 | Municipality of Balete Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2008 | Municipality of GAMU Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2009 | Bacolod City Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2010 | Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2011 | Province of Bulacan Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2012 | Municipality of Talavera Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2013 | Municipality of Oton Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2015 | City of Manila Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2016 | City of Binan Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2017 | City Government of Calamba Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2018 | Marikina City Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2019 | City Government of Pasig Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2020 | City of San Pedro Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2021 | Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2022 | Municipality of La Paz, Tarlac Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2023 | Municipality of Liliw Disability Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2024 | Municipality of Cataingan Disability Identification Card | ### Local Senior Identification Cards | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------- | :------ | :-------------------------------------------------------------- | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1928 | Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1929 | Bacolod City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1930 | Municipality of Concepcion Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1931 | City of Surigao Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1932 | Municipality of Tubod Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1934 | City of Bacoor Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1935 | City of Valenzuela Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1936 | Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1937 | City of Iloilo Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1938 | Municipality of Tangcal Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1940 | Cebu City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1941 | City of Santa Rosa Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1942 | City Government of Digos Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1943 | Municipality of Plaridel Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1944 | Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1945 | Baguio City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1946 | Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1947 | Province of Batangas Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1948 | City of Santa Rosa Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1949 | Tacloban City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1951 | Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1952 | Municipality of Silang Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1953 | Las Piñas City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1954 | City of Mandaluyong Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1955 | Municipality of Irosin Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1956 | City of San Fernando Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1958 | Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1959 | City of San Juan Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1960 | Siquijor Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1961 | Municipality of Lucban Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1962 | City of Antipolo Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1965 | Cebu Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1971 | Cagayan de Oro City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1972 | San Juan, Batangas Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1975 | BAC Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1976 | City of Taguig Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1977 | Municipality of Taytay Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1979 | City of San Carlos Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1980 | Pasig City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1981 | Guihulngan City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1985 | Bataan Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1987 | Cavinti City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1989 | Cagayan de Oro City Senior Citizens Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1990 | City of Manila Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1992 | City of Silay Senior Citizen's Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1993 | City of Caloocan Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1994 | Cainta Rizal Senior Citizens Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1995 | City Government of Makati Senior Citizen's Blu Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1996 | City Government of Tacloban Senior Citizens Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1997 | City of San Jose del Monte Senior Citizens Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1998 | City of Manila Senior Citizens Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 1999 | Province of Quezon Senior Citizens Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2001 | City Government of Mabalacat Senior Citizen's Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2002 | Las Piñas Senior Citizens Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2003 | Marikina City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2004 | Municipality of Angono Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2005 | Las Pinas City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2006 | Municipality of Taytay Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2007 | Municipality of Baliwag Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2009 | City of Mandaluyong Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2010 | Senior Citizen / Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2011 | City of Malolos Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2012 | Municipality of Carmen Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2013 | Quezon Province Senior Citizen / Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2014 | Province of Zamboanga del Norte Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2015 | City of Surigao Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2016 | Quezon City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2017 | Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2020 | Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2021 | Legazpi City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2022 | Dipolog City Senior Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2023 | Municipality of Naic Senior Citizens Identification Card | | ALL | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2024 | Cebu City Senior Identification Card | ### Local Residence Cards | State | Type of ID | Subtype of ID | Version | Description | | :---- | :---------------- | :------------- | :------ | :------------------------------------------------- | | ALL | ResidenceDocument | RESIDENCE_CARD | 1800 | Municipality of Gandara Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1801 | Municipality of Bulan Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1802 | Barangay San Antonio Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1803 | Barangay Platero Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1804 | Barangay San Matias Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1805 | City of Marikina Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1806 | Barangay Malanday Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1807 | City of Gapan Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1808 | Barangay Lalakay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1809 | City of Marikina Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1810 | Imus City Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1811 | Barangay Talangan Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1812 | City of Manila Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1813 | Barangay San Isidro Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1814 | Barangay Malusak Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1815 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1818 | Barangay Dela Paz Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1819 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1820 | Barangay Canlalay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1821 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1822 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1823 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1824 | Province of Zambales Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1825 | City of Manila Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1826 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1827 | Municipality of Binangonan Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1828 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1829 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1830 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1831 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1832 | Municipality of Abuyog Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1833 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1834 | Municipality of Bulusan Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1835 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1836 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1837 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1839 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1840 | Barangay San Rafael Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1841 | City of Manila Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1849 | Barangay Malaban Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1850 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1851 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1852 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1853 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1854 | Barangay Yapak Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1855 | City of Passi Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1856 | Barangay Muzon Proper Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1857 | Barangay Manggahan Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1858 | Barangay Santo Cristo Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1859 | Barangay Sicsican Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1860 | Barangay Fort Bonifacio Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1861 | Barangay Dila Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1862 | Barangay Ibayo Tipas Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1865 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1866 | City of Sorsogon Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1867 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1868 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1869 | Municipality of Gen. Mariano Alvarez Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1886 | Barangay Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1890 | Barangay Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1894 | Barangay Bayan Luma 7 Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1895 | Barangay San Jose Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1897 | Barangay Baliwasan Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1904 | Barangay Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1905 | City of Caloocan Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1908 | Payatas Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1911 | Barangay Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1912 | Barangay Camino Nuevo Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1918 | City of Sorsogon Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1919 | Barangay Isio Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1921 | Barangay Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1922 | City of Cabanatuan Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1931 | Barangay Santo Niño Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1932 | Barangay Upper Bicutan Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1933 | Barangay Cupang Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1934 | Barangay Marikina Heights Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1939 | Barangay Sampaloc Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1942 | Barangay San Dionisio Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1943 | Barangay Santo Cristo Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1947 | Barangay San Bartolome Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1949 | Barangay Talaba 1 Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1950 | Barangay East Poblacion Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1954 | Barangay Sabutan Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1957 | Barangay Anabu Ii- c Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1958 | Barangay Tungkong Mangga Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1968 | City of Antipolo Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1970 | Barangay Malanday Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1977 | Barangay Mariblo Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1978 | Barangay Tandang Sora Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1979 | Barangay Tambo Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1980 | Barangay Sauyo Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1981 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1982 | Barangay Santiago Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1983 | City of Quezon Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1984 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1985 | City of Parañaque Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1986 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1987 | Barangay Culiat Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1988 | Barangay San Isidro Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1989 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1990 | City of Tagaytay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1991 | Barangay Muzon South Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1992 | Barangay Muzon Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1994 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1995 | Old Capitol Site Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1996 | Barangay Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1997 | Barangay Batasan Hills Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1998 | Barangay Resident's Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 1999 | Barangay San Jose Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 2000 | Barangay Resident Identification Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 2001 | Barangay Identification Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 2002 | Barangay Identification Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 2003 | Barangay Resident Identification Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 2004 | Barangay Resident Identification Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 2005 | Municipality of Magallanes Resident Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 2006 | Barangay Resident Identification Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 2007 | Barangay Timugan Identification Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 2008 | Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 2009 | Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 2010 | Residence Card | | ALL | ResidenceDocument | RESIDENCE_CARD | 2023 | Alien Certificate of Registration | ## Qatar (QAT) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2013 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | ID Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2011 | ID Card | | ALL | Passport | NATIONAL_PASSPORT | 2008 | Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2010 | Residency Permit | ## Russia (RUS) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :---------------------------- | :------ | :---------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2011 | Driver's License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2008 | Identity Card | | ALL | IdentificationCard | TEMPORARY_IDENTIFICATION_CARD | 2024 | Temporary Identification Card | | ALL | Passport | NATIONAL_PASSPORT | 2000 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2008 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2010 | Passport | | ALL | Visa | VISA | 2021 | Viza / Visa | ## Saudi Arabia (SAU) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :--------------------------- | :------ | :--------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2012 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2013 | Driving License | | ALL | DriversLicense | INTERNATIONAL_DRIVING_PERMIT | 2023 | International Driving Permit | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | National ID Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2013 | National ID Card | | ALL | Military | MILITARY_CARD | 2020 | Military Card | | ALL | Passport | DIPLOMATIC_PASSPORT | 2003 | Diplomatic Passport | | ALL | Passport | NATIONAL_PASSPORT | 2007 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2022 | Saudi Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2015 | Resident Identity Card | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2020 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2024 | Premium Resident Identity | | ALL | TravelDocument | CONSULAR_CARD | 2020 | Consular Card | | ALL | TravelDocument | CONSULAR_CARD | 2021 | Consular Identity Card | ## Singapore (SGP) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :--------------------------- | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2002 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2001 | Identity Card | | ALL | Military | MILITARY_IDENTIFICATION_CARD | 2010 | Singapore Armed Forces Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2005 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passport | | ALL | Permit | WORK_PERMIT | 2000 | Work Permit | | ALL | Permit | WORK_PERMIT | 2001 | Work Permit | | ALL | Permit | WORK_PERMIT | 2019 | Work Permit | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2005 | Identity Card | | ALL | TravelDocument | LONG_TERM_VISIT_PASS | 2023 | Long-Term Visit Pass | ## South Korea (KOR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :---------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2000 | Driver's License | | ALL | DriversLicense | DRIVER_LICENSE | 2020 | Driver's License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2000 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2008 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2022 | Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2018 | Alien Registration Card | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2023 | Residence Card | ## Sri Lanka (LKA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2006 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2011 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2023 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2018 | National Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2022 | Identification Card | | ALL | Passport | NATIONAL_PASSPORT | 2015 | Passport | ## Syrian Arab Republic (SYR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :---------------------------- | :------ | :--------------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2000 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2024 | Identification Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2025 | Identification Card | | ALL | DriversLicense | DRIVERS_LICENSE | 2019 | Driving License | | ALL | DriversLicense | INTERNATIONAL_DRIVERS_LICENSE | 2019 | International Driving Permit | | ALL | Military | MILITARY_CARD | 2014 | Military Card | | ALL | Passport | NATIONAL_PASSPORT | 2010 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passport | ## Taiwan (TWN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :----------------------------- | :------ | :----------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2015 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2019 | Driving License | | ALL | DriversLicense | INTERNATIONAL_DRIVING_PERMIT | 2020 | International Driving Permit | | ALL | IdentificationCard | MEDICAL_CARD | 2012 | Nationa Health Insurance Card | | ALL | IdentificationCard | NATIONAL_IDENTIFICATION_CARD | 2005 | National Identity Card | | ALL | IdentificationCard | DIPLOMATIC_IDENTIFICATION_CARD | 2024 | Diplomatic Identification Card | | ALL | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2020 | Disability Identification Card | | ALL | Passport | NATIONAL_PASSPORT | 2008 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2020 | Resident Certificate | | ALL | TravelDocument | HOME_RETURN_PERMIT | 2024 | Home Return Permit | | ALL | Visa | VISA | 2023 | Visa | ## Tajikistan (TJK) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :-------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2014 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2015 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Passport | | ALL | Visa | VISA | 2025 | Visa | ## Thailand (THA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :--------------------------------- | :------ | :--------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2010 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2013 | Private Car Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2001 | Thai National ID Card | | ALL | IdentificationCard | IDENTIFICATION_CARD_FOR_FOREIGNERS | 2025 | Identification Card for Foreigners | | ALL | IdentificationCard | IDENTIFICATION_CARD_FOR_FOREIGNERS | 2026 | Identification Card for Foreigners | | ALL | TravelDocument | CONSULAR_CARD | 2020 | Consular Card | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2020 | Passport | | ALL | Passport | EMERGENCY_PASSPORT | 2023 | Emergency Passport | ## Turkey (TUR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------------- | :------ | :-------------------------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2010 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2016 | Driving License | | ALL | DriversLicense | DRIVERS_LICENSE | 2022 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2006 | Türkiye Cumhuriyeti Kimlik Kartı (Turkish Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2007 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2017 | Republic of Turkey Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2024 | Identification Card (Blue Card) | | ALL | Other | TEMPORARY_PROTECTION_IDENTITY_DOCUMENT | 2014 | Geçici Koruma Kimlik Belgesi (Temporary Protection Identity Document) | | ALL | Permit | WORK_PERMIT | 2023 | Work Permit | | ALL | Permit | WORK_PERMIT | 2024 | Fixed Term Work Permit | | ALL | Permit | WORK_PERMIT | 2025 | Work Permit | | ALL | Passport | NATIONAL_PASSPORT | 2010 | Pasaport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Pasaport / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2022 | Pasaport / Passport | | ALL | Passport | TEMPORARY_PASSPORT | 2024 | Temporary Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2010 | Residence Permit Document | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2021 | Residence Permit Document | ## Turkish Republic of Northern Cyprus (XCT) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------- | :------ | :------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2020 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2022 | Identity Card | | ALL | IdentificationCard | POLICE_IDENTIFICATION_CARD | 2013 | Police Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2021 | Pasaport / Passport | ## Turkmenistan (TKM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :---------------- | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2003 | Permis de Conduire / Driving License | | ALL | Passport | NATIONAL_PASSPORT | 1998 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2015 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2025 | Passport | ## United Arab Emirates (ARE) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :---------------------------- | :------ | :--------------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2001 | Driving License | | ALL | DriversLicense | DRIVER_LICENSE | 2002 | Driving License | | ALL | DriversLicense | DRIVER_LICENSE | 2003 | Driving License | | ALL | DriversLicense | INTERNATIONAL_DRIVERS_LICENSE | 2020 | International Driving Permit | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2011 | Identity Card | | ALL | MedicalCard | MEDICAL_CARD | 2018 | Health Card | | ALL | Passport | NATIONAL_PASSPORT | 2011 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passport | | ALL | Passport | DIPLOMATIC_PASSPORT | 2022 | Diplomatic Passport | | ALL | Visa | VISA | 2020 | Residence Permit | | ALL | ResidenceDocument | GOLDEN_CARD | 2022 | Golden Card | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2000 | Resident Identity Card | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2021 | Resident Identity Card | ## Uzbekistan (UZB) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :-------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2006 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2019 | Passport | ## Vietnam (VNM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :----------------------------- | :------ | :----------------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2000 | Driver's License | | ALL | DriversLicense | DRIVER_LICENSE | 2003 | Driver's License | | ALL | DriversLicense | DRIVER_LICENSE | 2025 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 1999 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2000 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2024 | Identity Card | | ALL | IdentificationCard | DIPLOMATIC_IDENTIFICATION_CARD | 2025 | Diplomatic Identification Card | | ALL | Passport | NATIONAL_PASSPORT | 2005 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2022 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passport | ## Yemen (YEM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :-------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2019 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2015 | Identity Card | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Passport | --- - Path: `general-reference/supported-ids-caribbean` - URL: https://developer.incode.com/general-reference/supported-ids-caribbean/ - Markdown: https://developer.incode.com/general-reference/supported-ids-caribbean.md The following tables list supported identification documents for the Caribbean, organized by country. ## Antigua and Barbuda (ATG) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :---------------------- | :------ | :------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2020 | Driver's License | | ALL | DriversLicense | LEARNERS\_PERMIT | 2025 | Learner's Permit | | ALL | MedicalCard | SOCIAL\_SECURITY\_BOARD | 2022 | Social Security Board Card | | ALL | MedicalCard | SOCIAL\_SECURITY\_BOARD | 2024 | Social Security Board Card | | ALL | Passport | NATIONAL\_PASSPORT | 2016 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2017 | Passport | ## Anguilla (AIA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :--------------- | :------ | :------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2021 | Driver License | ## Aruba (ABW) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :---------------------------------------- | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2019 | Cedula di Identidad (Identification Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2022 | Identity Card | | ALL | DriversLicense | DRIVERS\_LICENSE | 2015 | Rijbewijs (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2020 | Rijbewijs (Driving License) | | ALL | Visa | VISA | 2023 | Visa | ## Barbados (BRB) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :------------------ | | ALL | DriversLicense | DRIVERS\_LICENSE | 2015 | Driving License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2009 | Identification Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2023 | Identification Card | | ALL | Passport | NATIONAL\_PASSPORT | 2016 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2023 | Passport | ## Bermuda (BMU) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :-------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2014 | Driving License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2024 | Bermuda Identification Card | | ALL | Passport | NATIONAL\_PASSPORT | 2004 | Passport | ## Bonaire (BES) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :--------------- | :------ | :-------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2018 | Rijbewijs (Driving License) | ## Cayman Islands (CYM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :--------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2018 | Driver's License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2020 | Identity Card | | ALL | Passport | NATIONAL\_PASSPORT | 2008 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2015 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2020 | Passport | ## Cuba (CUB) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :----------------------------------- | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2019 | Carné de Identidad (Identity Card) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2003 | Permis de Conduire (Driving License) | | ALL | Passport | NATIONAL\_PASSPORT | 2016 | Pasaporte (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2013 | Pasaporte / Passport | ## Curaçao (CUW) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2017 | Rijbewijs (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2023 | Identiteitskaart (Identity Card) | ## Dominica (DMA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :--------- | :----------------- | :------ | :---------- | | ALL | Passport | NATIONAL\_PASSPORT | 2016 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2022 | Passport | ## Dominican Republic (DOM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------- | :------ | :--------------------------------------------------------------------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 2000 | Licencia de Conducir (Driving License) | | ALL | DriversLicense | DRIVER\_LICENSE | 2022 | Licencia Motocicletas (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2024 | Permiso de Aprendizaje (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2026 | Licencia de Conducir (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2001 | Cédula de Identidad y Electoral (Identity and Electoral Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2026 | Cédula de Identidad y Electoral (Identity and Electoral Card) | | ALL | IdentificationCard | DIPLOMATIC\_IDENTIFICATION\_CARD | 2024 | Carnet de Identificación Diplomática / Diplomatic Identification Card | | ALL | IdentificationCard | INTERNATIONAL\_IDENTITY\_CARD | 2020 | International Identity Card | | ALL | IdentificationCard | POLICE\_IDENTIFICATION\_CARD | 2022 | Policia Carnet de Identidad / Police Identification Card | | ALL | IdentificationCard | POLICE\_IDENTIFICATION\_CARD | 2023 | Policia Nacional Dominicana Carnet de Identidad / Police Identification Card | | ALL | IdentificationCard | POLICE\_IDENTIFICATION\_CARD | 2024 | Policia Carnet de Identidad / Police Identification Card | | ALL | IdentificationCard | POLICE\_IDENTIFICATION\_CARD | 2025 | Police Identity Card | | ALL | MedicalCard | SOCIAL\_SECURITY\_CARD | 2024 | Social Security Card | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2022 | Residencia Permanente / Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2023 | Residencia Temporal / Residence Permit | | ALL | Permit | WORK\_PERMIT | 2022 | Permiso Temporal de Trabajo / Work Permit | | ALL | Military | MILITARY\_CARD | 2023 | Military Card | | ALL | Military | MILITARY\_CARD | 2024 | Military Card | | ALL | Military | MILITARY\_CARD | 2025 | Military Card | | ALL | TravelDocument | CONSULAR\_CARD | 2022 | Consular Card | | ALL | TravelDocument | CONSULAR\_CARD | 2024 | Consular Card | | ALL | Passport | NATIONAL\_PASSPORT | 2009 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2014 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2015 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2016 | Passport | | ALL | Visa | VISA | 2019 | Visa | | ALL | Visa | VISA | 2022 | Visa | ## Grenada (GRD) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :----------------- | :------ | :--------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2019 | Driver's License | | ALL | Passport | NATIONAL\_PASSPORT | 2001 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2019 | Passport | ## Haiti (HTI) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :-------------------------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2015 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2005 | Carte D'Identification Nationale (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2019 | Carte D'Identification Nationale (National Identity Card) | | ALL | Passport | NATIONAL\_PASSPORT | 2013 | Passeport / Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2017 | Passeport / Passport | ## Jamaica (JAM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :-------------------------- | :------ | :--------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2017 | Driver's License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2021 | Elector Registration Identification Card | | ALL | Other | FIREARMS\_LICENSE | 2025 | Firearms License | | ALL | Passport | NATIONAL\_PASSPORT | 2010 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2013 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2023 | Passport | | ALL | VoterIdentification | VOTER\_IDENTIFICATION\_CARD | 2010 | Elector Registration Identification Card | ## Puerto Rico (PRI) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :-------------------------- | :------ | :------------------------------------------------------------------ | | ALL | DriversLicense | DRIVERS\_LICENSE | 2008 | Licencia de Conducir (Driver's License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2018 | Driver's License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2019 | Licencia de Conducir (Driver's License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2018 | Tarjeta de identificación (Identification Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2019 | Identification Card | | ALL | VoterIdentification | VOTER\_IDENTIFICATION\_CARD | 2015 | Tarjeta De Identificacion Electoral (Electoral Identification Card) | | ALL | Other | FISHERMAN\_LICENSE | 2020 | Fisherman License | | ALL | Other | FIREARMS\_LICENSE | 2020 | Firearm License | ## Saint Kitts and Nevis (KNA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :--------------------------- | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2015 | National Identification Card | | ALL | DriversLicense | DRIVERS\_LICENSE | 2019 | Drivers' License | | ALL | Passport | NATIONAL\_PASSPORT | 2010 | Passport | ## Saint Lucia (LCA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :---------------- | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2015 | National ID Card | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Driver's License | | ALL | Passport | NATIONAL\_PASSPORT | 2013 | Official Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2023 | Passport | ## Sint Maarten (Dutch part) (SXM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :--------------- | :------ | :--------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2015 | Driver's License | ## Saint Vincent and the Grenadines (VCT) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :--------------------- | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2022 | National Identity Card | | ALL | DriversLicense | DRIVERS\_LICENSE | 2024 | Drivers License | | ALL | Passport | NATIONAL\_PASSPORT | 2016 | Passport | ## The Bahamas (BHS) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :------------------ | | ALL | DriversLicense | DRIVERS\_LICENSE | 2021 | Driver's License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2011 | Identification Card | | ALL | Passport | NATIONAL\_PASSPORT | 2010 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2017 | Passport | ## Trinidad and Tobago (TTO) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :--------------------------- | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2021 | National Identification Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2011 | National Identification Card | | ALL | DriversLicense | DRIVERS\_LICENSE | 2006 | Driver's License | | ALL | Passport | NATIONAL\_PASSPORT | 2007 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2016 | Passport | | ALL | Permit | WORK\_PERMIT | 2024 | Work Permit | ## US Virgin Islands (VIR) | Type of ID | Subtype of ID | Version | Description | | :------------------ | :-------------------------- | :------ | :----------------------------------------- | | DriversLicense | DRIVERS\_LICENSE | 2018 | Driver's License | | DriversLicense | DRIVER\_LICENSE\_UNDER21 | 2019 | Driver's License Under 21 | | DriversLicense | DRIVERS\_LICENSE | 2023 | Virgin Islands Driver License | | DriversLicense | DRIVER\_LICENSE\_UNDER21 | 2025 | Virgin Islands Driver's License (Under 21) | | DriversLicense | DRIVERS\_LICENSE | 2025 | Virgin Islands Driver's License | | IdentificationCard | IDENTIFICATION\_CARD | 2018 | Identification Card | | VoterIdentification | VOTER\_IDENTIFICATION\_CARD | 2020 | Virgin Islands Voter Identification Card | --- - Path: `general-reference/supported-ids-central-america` - URL: https://developer.incode.com/general-reference/supported-ids-central-america/ - Markdown: https://developer.incode.com/general-reference/supported-ids-central-america.md The following tables list supported identification documents for Central America, organized by country. ## Belize (BLZ) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :------------------------- | :------ | :------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2016 | Belize Driver's License | | ALL | DriversLicense | DRIVERS_LICENSE | 2021 | Belize Driver's License | | ALL | DriversLicense | DRIVERS_LICENSE | 2022 | Belize Driver's License | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Passport | | ALL | MedicalCard | SOCIAL_SECURITY_BOARD_CARD | 2020 | Social Security Board Card | ## Costa Rica (CRI) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------ | :------ | :-------------------------------------------------------------------------------------------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2000 | Licencia de Conducir (Driver License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 1999 | Cedula de Identidad (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2016 | Cedula de Identidad (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2025 | Cedula de Identidad (Identity Card) | | ALL | IdentificationCard | TARJETA_DE_IDENTIDAD_DE_MENORES | 2010 | Tarjeta de Identidad de Menores de Edad / Identity Card for Minors | | ALL | IdentificationCard | TARJETA_DE_IDENTIDAD_DE_MENORES | 2026 | Tarjeta de Identidad de Menores de Edad / Identity Card for Minors | | ALL | Passport | NATIONAL_PASSPORT | 2015 | Pasaporte (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2022 | Pasaporte (Passport) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2005 | Documento de Identidad Migratorio para Extranjeros - DIMEX (Immigration Identity Document for Foreigners) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2023 | Documento de Identidad Migratorio para Extranjeros - DIMEX (Immigration Identity Document for Foreigners) | | ALL | ResidenceDocument | RESIDENCE_PERMIT_PDF | 2023 | Documento de Identidad Migratorio para Extranjeros - DIMEX (Digital Immigration Identity Document for Foreigners) | | ALL | TravelDocument | CONSULAR_CARD | 2024 | Consular Card | | ALL | Permit | WORK_PERMIT | 2024 | Work Permit | ## El Salvador (SLV) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :------------------------------------------------------ | | ALL | DriversLicense | DRIVER_LICENSE | 2000 | Licencia de Conducir (Driver License) | | ALL | DriversLicense | DRIVER_LICENSE | 2017 | Licencia de Conducir / Driver License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2000 | Documento Unico de Identidad (Unique Identity Document) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2014 | Documento Unico de Identidad (Unique Identity Document) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2015 | Documento Unico de Identidad (Unique Identity Document) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2017 | Documento Unico de Identidad (Unique Identity Document) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Documento de Identidad Personal / Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2022 | Documento Unico de Identidad (Unique Identity Document) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2023 | Carnet de Identificación Personal / Identification Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2026 | Carnet de Identificación Personal / Identification Card | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2010 | Carné de Residencia / Residence Permit | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2024 | Residencia Definitiva / Residence Permit | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Pasaporte (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2024 | Pasaporte / Passport | ## Guatemala (GTM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------------------------------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2011 | Licencia de Conducir (Driver License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2017 | Licencia de Conducir (Driver License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2020 | Licencia de Conducir (Driver License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2009 | Documento Personal de Identificacion (Personal Identification Document) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2025 | Documento Personal de Identificación / Identity Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2016 | Documento Personal de Identificacion (Personal Identification Document) | | ALL | Passport | NATIONAL_PASSPORT | 2016 | Pasaporte (Passport) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2000 | Documento Personal de Identificacion - Extranjero Domiciliado (Residence Document) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2011 | Documento Personal de Identificacion - Extranjero Domiciliado (Residence Document) | | ALL | TravelDocument | CONSULAR_CARD | 2017 | Identificacion Consular (Consular ID Card) | | ALL | TravelDocument | CONSULAR_CARD | 2020 | Cédula Diplomática / Consular Card | ## Honduras (HND) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :--------------------------- | :------ | :---------------------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2019 | Licencia de Conducir (Driver License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2022 | Permiso de Conducir (Driver License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2023 | Permiso de Conducir (Driver License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2024 | Permiso de Conducir / Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2009 | Tarjeta de Identidad (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Documento Nacional de Identificacion (National Identity Document) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2015 | Carnet de Extranjero Residente / Residence Permit | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2020 | Residence Permit / Carnet de Extranjero Residente | | ALL | Passport | NATIONAL_PASSPORT | 2015 | Pasaporte (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2022 | Pasaporte (Passport) | | ALL | TravelDocument | CONSULAR_IDENTIFICATION_CARD | 2018 | Matricula Consular (Consular ID) | | ALL | TravelDocument | CONSULAR_IDENTIFICATION_CARD | 2025 | Matricula Consular / Consular ID Card | ## Nicaragua (NIC) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :-------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2021 | Licencia de Conducir (Driver License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | Cedula de Identidad (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2018 | Cedula de Identidad (Identity Card) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2010 | Cedula de Residencia / Residence Permit | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Pasaporte (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2019 | Pasaporte (Passport) | | ALL | TravelDocument | CONSULAR_CARD | 2020 | Carnet Consular / Consular Card | | ALL | TravelDocument | CONSULAR_CARD | 2025 | Carnet de Servicio / Consular Card | ## Panama (PAN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------ | :------ | :--------------------------------------------------------------- | | ALL | DriversLicense | DRIVER_LICENSE | 2001 | Licencia de Conducir (Driving License) | | ALL | DriversLicense | DRIVER_LICENSE | 2025 | Licencia de Conducir / Driver's License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2010 | Cedula de Identidad (Domestic Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2016 | Cedula de Identidad (Domestic Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2023 | Documento de Identidad (Identity Card) | | ALL | IdentificationCard | YOUTH_IDENTIFICATION_CARD | 2018 | Cedula Juvenil (Youth ID) | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Pasaporte / Passport | | ALL | Passport | NATIONAL_PASSPORT | 2019 | Pasaporte / Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2000 | Permiso de Residencia Provisional (Provisional Residence Permit) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2015 | Carné de Residente Permanente (Permanent Resident Card) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2021 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2023 | Carné de Residente Permanente (Permanent Resident Card) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2024 | Residence Permit | | ALL | ResidenceDocument | PERMANENT_RESIDENCE_CARD | 2000 | Residente Permanente / Residence Permit | | ALL | TravelDocument | CONSULAR_CARD | 2020 | Consular Card | | ALL | Permit | WORK_PERMIT | 2019 | Permiso de Trabajo / Work Permit | --- - Path: `general-reference/supported-ids-europe` - URL: https://developer.incode.com/general-reference/supported-ids-europe/ - Markdown: https://developer.incode.com/general-reference/supported-ids-europe.md The following tables list supported identification documents for Europe, organized by country. The table for the United Kingdom is further divided by state. ## Albania (ALB) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------- | :------ | :------------------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2005 | Leje Drejtimi (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2015 | Certifikatë Aftësimi Profesional (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2019 | Leje Drejtimi (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2013 | Letërnjoftim ID (Identity Card) | | ALL | IdentificationCard | DIPLOMATIC\_IDENTIFICATION\_CARD | 2025 | Diplomatic Identification Card | | ALL | Passport | NATIONAL\_PASSPORT | 2010 | Pasaportë (Passport) | ## Andorra (AND) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :---------------- | :----------------- | :------ | :---------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 1990 | Permis de Conduir (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2025 | Driving License | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2024 | Residence Permit | | ALL | Passport | NATIONAL\_PASSPORT | 2005 | Passaport (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2007 | Passaport (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2017 | Passaport (Passport) | ## Austria (AUT) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------- | :------ | :----------------------------------------------------------------------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 2010 | Führerschein Republik Österreich (Driving license for the Republic of Austria) | | ALL | DriversLicense | DRIVER\_LICENSE | 2013 | Führerschein (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2014 | Identity Card of the Republic of Austria | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2021 | Identity Card | | ALL | IdentificationCard | DISABILITY\_IDENTIFICATION\_CARD | 2020 | Identity Card for Disabled Persons | | ALL | MedicalCard | MEDICAL\_CARD | 2020 | Medical Card | | ALL | Passport | NATIONAL\_PASSPORT | 2014 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2024 | Passport | | ALL | ResidenceDocument | RESIDENCE\_DOCUMENT | 2012 | Aufenthaltskarte (Residence Card) | | ALL | ResidenceDocument | RESIDENCE\_DOCUMENT | 2017 | Legitimation Card Republic of Austria - Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_DOCUMENT | 2021 | Aufenthaltsberechtigungskarte (Residence Permit Card) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2011 | Aufenthaltstitel (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Aufenthaltstitel (Residence Permit) | | ALL | Visa | VISA | 2020 | Visum / Visa | ## Belarus (BLR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :--------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2012 | Driving License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2021 | Identity Card | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2021 | Residence Permit | | ALL | Passport | NATIONAL\_PASSPORT | 2010 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2021 | Passport | ## Belgium (BEL) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :---------------------------- | :------ | :---------------------------------------------------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 2010 | Rijbewijs / Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVER\_LICENSE | 2013 | Rijbewijs / Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVER\_CARD | 2020 | Driver Card | | ALL | DriversLicense | PROVISIONAL\_DRIVERS\_LICENSE | 2013 | Provisional Driving License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2014 | Identiteitskaart / Carte D'Identite (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2020 | Identiteitskaart / Carte D'Identite (Identity Card) | | ALL | Passport | NATIONAL\_PASSPORT | 2014 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2022 | Passport | | ALL | Passport | TRAVEL\_DOCUMENT | 2024 | Travel Document | | ALL | ResidenceDocument | RESIDENCE\_DOCUMENT | 2013 | Verblijfstitel (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_DOCUMENT | 2015 | E Kaart / E Card (Residence Document) | | ALL | ResidenceDocument | RESIDENCE\_DOCUMENT | 2021 | Document de Sejour / Verblijfsdocument (Residence Document) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2021 | Aufenthaltstitel (Residence Permit) | | ALL | ResidenceDocument | SPECIAL\_IDENTITY\_CARD | 2013 | Special Identity Card | | ALL | Visa | VISA | 2019 | Visa | ## Bosnia and Herzegovina (BIH) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :-------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2015 | Vozacka Dozvola (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2003 | Licna Karta (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2013 | Licna Karta (Identity Card) | | ALL | Passport | NATIONAL\_PASSPORT | 2014 | Pasos (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2015 | Pasos (Passport) | ## Bulgaria (BGR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :---------------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Driving License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2014 | Driver Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2010 | Licna Karta (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2024 | Licna Karta (Identity Card) | | ALL | Passport | NATIONAL\_PASSPORT | 2010 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2019 | Passport | | ALL | ResidenceDocument | RESIDENCE\_DOCUMENT | 2015 | Certificate for EU Citizen (Residence Document) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2019 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2024 | Residence Permit | | ALL | Visa | VISA | 2023 | Visa | ## Croatia (HRV) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 1994 | Vozacka Dozvola (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2013 | Vozacka Dozvola (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2024 | Vozacka Dozvola (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2003 | Osobna Iskaznica (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2015 | Osobna Iskaznica (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Osobna Iskaznica (Identity Card) | | ALL | Passport | NATIONAL_PASSPORT | 2009 | Putovnica (Passport) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2020 | Dozvola boravka (Residence Permit) | | ALL | Visa | VISA | 2023 | Viza / Visa | ## Cyprus (CYP) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------- | :------ | :----------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2014 | Driving License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2014 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2015 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2020 | Identity Card | | ALL | IdentificationCard | DIPLOMATIC\_IDENTIFICATION\_CARD | 2025 | Diplomatic Identity Card | | ALL | Passport | NATIONAL\_PASSPORT | 2010 | Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2014 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Residence Permit | ## Czech Republic (CZE) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :------------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2004 | Řidičský Průkaz (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2012 | Občanský Průkaz (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2021 | Občanský Průkaz (National Identity Card) | | ALL | Passport | NATIONAL\_PASSPORT | 2009 | Cestovní Pas (Passport) | | ALL | Passport | EMERGENCY\_PASSPORT | 2024 | Emergency Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2006 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2013 | Povolení k Pobytu (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2015 | Identity Card and Long Term Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Povolení k Pobytu (Residence Permit) | | ALL | Visa | VISA | 2022 | Visa | ## Denmark (DNK) | State | Type of ID | Subtype of ID | Version | Description | | :------------- | :---------------- | :------------------ | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 1997 | Kørekort (Driving License) | | ALL | DriversLicense | DRIVER\_LICENSE | 2013 | Kørekort (Driving License) | | ALL | DriversLicense | DRIVER\_LICENSE | 2018 | Kørekort (Driving License) | | ALL | DriversLicense | DRIVER\_LICENSE | 2025 | Driving License | | ALL | MedicalCard | MEDICAL\_CARD | 2014 | Sundhedskort (Health Card) | | ALL | Passport | NATIONAL\_PASSPORT | 2012 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2021 | Passport | | ALL | ResidenceDocument | RESIDENCE\_DOCUMENT | 2018 | Opholdskort (Residence Card) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 1998 | Opholdstilladelse (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2010 | Opholdstilladelse (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2018 | Opholdstilladelse (Residence Permit) | | FAROE\_ISLANDS | DriversLicense | DRIVERS\_LICENSE | 2020 | Faroe Islands Driving License | | GREENLAND | DriversLicense | DRIVERS\_LICENSE | 2010 | Kalaallit Nunaat Driver License | | GREENLAND | DriversLicense | DRIVERS\_LICENSE | 2024 | Greenland Driving License | ## Estonia (EST) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------- | :------ | :----------------------------------------------------------------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Juhiluba (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2020 | Juhiluba (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2011 | Isikutunnistus (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2018 | Isikutunnistus (Identity Card) | | ALL | IdentificationCard | DIPLOMATIC\_IDENTIFICATION\_CARD | 2022 | Diplomatic Identity Card | | ALL | Passport | NATIONAL\_PASSPORT | 2010 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2014 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2021 | Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2016 | Rahvusvahelise Kaitse Taotleja Tunnistus (Certificate of Applicant for International Protection) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2018 | Elamisluba (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Elamisluba (Residence Permit) | ## Finland (FIN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :-------------------------- | :------ | :---------------------------------------------------------------------------- | | ALAND | DriversLicense | DRIVERS\_LICENSE | 2015 | Aland Körkort (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2000 | Ajokortti Körkort (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Ajokortti Körkort (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2019 | Ajokortti Körkort (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2024 | Driving License / Permis de Conduire | | ALL | DriversLicense | DRIVER\_QUALIFICATION\_CARD | 2022 | Driver Qualification Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2011 | Identitetskort (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2017 | Identitetskort (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2021 | Identitetskort (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2023 | Identitetskort (Identity Card) | | ALL | IdentificationCard | MINORS\_ID | 2024 | Minor's Identity Card | | ALL | MedicalCard | MEDICAL\_CARD | 2025 | Medical Card | | ALL | Passport | NATIONAL\_PASSPORT | 2000 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2006 | Passi / Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2012 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2017 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2025 | Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2012 | Finnish Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2017 | Identitetskort (Identity Card) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Identitetskort /Identity Card (this document authorizes residence in Finland) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2023 | Residence Permit | | ALL | Visa | VISA | 2019 | Viisumi (Visa) | | ALL | Visa | VISA | 2022 | Viisumi (Visa) | | ALL | MedicalCard | MEDICAL\_CARD | 2024 | Health Insurance Card | ## France (FRA) | State | Type of ID | Subtype of ID | Version | Description | | :------------- | :----------------- | :--------------------------------- | :------ | :------------------------------------------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 1999 | Permis de Conduire (Driver's License) | | ALL | DriversLicense | DRIVER\_LICENSE | 2013 | Permis de Conduire (Driver's License) | | ALL | DriversLicense | DRIVER\_QUALIFICATION\_CARD | 2020 | Driver Qualification Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 1994 | Carte Nationale D'Identite (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2021 | Carte Nationale D'Identite (Identity Card) | | ALL | IdentificationCard | PROFESSIONAL\_IDENTIFICATION\_CARD | 2024 | Professional Identification Card | | ALL | Military | MILITARY\_ID | 2009 | Carte D'identité Militaire (Military Card) | | ALL | Military | MILITARY\_ID | 2020 | Carte D'Identite Militaire (Military ID Card) | | ALL | Passport | DIPLOMATIC\_PASSPORT | 2008 | Passeport Diplomatique (Diplomatic Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2008 | Passeport (Passport) | | ALL | Passport | EMERGENCY\_PASSPORT | 2023 | Passeport D'urgence / Emergency Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2001 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2011 | Titre de Séjour (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Titre de Séjour (Residence Permit) | | ALL | Visa | VISA | 2010 | Visa | | ALL | Visa | VISA | 2020 | Visa | | ALL | MedicalCard | MEDICAL\_CARD | 2023 | Medical Card | | ALL | MedicalCard | MEDICAL\_CARD | 2024 | Medical Card | | NEW\_CALEDONIA | DriversLicense | DRIVER\_LICENSE | 2024 | New Caledonia Permis de Conduire (Driving License) | ## Georgia (GEO) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :----------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2006 | Driving License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Driving License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2012 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2025 | Identity Card | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2021 | Temporary Residence Card | | ALL | Passport | NATIONAL\_PASSPORT | 2010 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2016 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2025 | Passport | ## Germany (DEU) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :--------------------- | :------ | :---------------------------------------------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 2011 | Führerschein (Driver's License) | | ALL | DriversLicense | DRIVER\_LICENSE | 2013 | Führerschein (Driver's License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2007 | Personalausweis (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2010 | Personalausweis (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2021 | Personalausweis (Identity Card) | | ALL | IdentificationCard | TEMP\_GERMAN\_IDCARD | 2004 | Vorlaufiger Personalausweis (Temporary Identity Card) | | ALL | IdentificationCard | DIPLOMATIC\_IDENTIFICATION\_CARD | 2025 | Diplomatic Identification Card | | ALL | Passport | NATIONAL\_PASSPORT | 2007 | Reisepass (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2017 | Reisepass (Passport) | | ALL | Passport | TEMPORARY\_PASSPORT | 2014 | Vorläufiger Reisepass (Temporary Passport) | | ALL | ResidenceDocument | FICTIONAL\_CERTIFICATE | 2020 | Fictional Certificate | | ALL | ResidenceDocument | FICTIONAL\_CERTIFICATE | 2024 | Fiktionsbescheinigung (Fictional Certificate) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2011 | Aufenthaltstitel (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2019 | Aufenthaltstitel (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2021 | Residence Permit | | ALL | Visa | VISA | 2018 | Visum (Visa) | | ALL | MedicalCard | MEDICAL\_CARD | 2024 | Medical Card | ## Gibraltar (GIB) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------ | :------ | :------------------------------- | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2020 | Identity Card / Carte D'Identite | | ALL | Other | CIVIL\_REGISTRATION\_CARD | 2020 | Civilian Registration Card | | ALL | DriversLicense | DRIVERS\_LICENSE | 2023 | Driving License | ## Greece (GRC) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :-------------------------------- | :------ | :------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2009 | Driver's License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Driver's License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2023 | Driver's License | | ALL | IdentificationCard | DOMESTIC\_IDENTIFICATION\_CARD | 2016 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2016 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2023 | Identity Card | | ALL | IdentificationCard | POLICE\_IDENTIFICATION\_CARD | 2020 | Police Identification Card | | ALL | IdentificationCard | POLICE\_IDENTIFICATION\_CARD | 2025 | Police Identification Card | | ALL | Military | MILITARY\_ID | 2022 | Military ID Card | | ALL | Passport | DIPLOMATIC\_PASSPORT | 2006 | Diplomatic Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2020 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2024 | Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2013 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Residence Permit | | ALL | ResidenceDocument | ASYLUM\_SEEKER\_CARD | 2020 | Asylum Seeker Card | | ALL | Other | FIREFIGHTER\_IDENTIFICATION\_CARD | 2024 | Firefighter Identity Card | ## Hungary (HUN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------------ | :------ | :------------------------------------------ | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Vezetői Engedély (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2012 | Személyazonosító Igazolvány (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2016 | Személyazonosító Igazolvány (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2022 | Temporary Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD\_FOR\_FOREIGNERS | 2016 | ID Card for foreigners | | ALL | Passport | NATIONAL\_PASSPORT | 2012 | Útlevél (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2023 | Útlevél (Passport) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2018 | Tartózkodási Engedély (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2019 | Permanent Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Tartózkodási Engedély (Residence Permit) | ## Iceland (ISL) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :----------------- | :------ | :----------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 1997 | Ökuskírteini (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2002 | Ökuskírteini (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2016 | Ökuskírteini (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2024 | Ökuskírteini (Driving License) | | ALL | Passport | NATIONAL\_PASSPORT | 2013 | Vegabréf (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2018 | Vegabréf (Passport) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Residence Permit | ## Interpol (XPO) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :---------------------------------------------------- | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2014 | Interpol Identification Card (Carte D'Identification) | | ALL | Passport | PASSPORT | 2013 | Interpol Passport / Passeport | ## Ireland (IRL) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :-------------------------- | :------ | :--------------------------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 2013 | Ceadúnas Tiomána (Driving License) | | ALL | DriversLicense | LEARNER\_PERMIT | 2013 | Cead Foghlamor (Learner's Permit) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2015 | Passport Card | | ALL | IdentificationCard | AGE\_CARD | 2020 | Age Card | | ALL | Other | PUBLIC\_SERVICES | 2013 | Public Services Card | | ALL | Other | PUBLIC\_SERVICES | 2014 | Public Services Card | | ALL | Passport | NATIONAL\_PASSPORT | 2006 | Pas / Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2013 | Pas / Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2026 | Passport | | ALL | Passport | PASSPORT\_CARD | 2026 | Passport Card | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2001 | Certificate of Registration | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2017 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Residence Permit | | ALL | VoterIdentification | VOTER\_IDENTIFICATION\_CARD | 2020 | Electoral Identity Card | ## Italy (ITA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------- | :------ | :---------------------------------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 2000 | Patente di Guida (Driver's License) | | ALL | DriversLicense | DRIVER\_LICENSE | 2013 | Patente di Guida (Driver's License) | | ALL | IdentificationCard | DOMESTIC\_DOCUMENT\_OF\_IDENTITY | 2000 | Carta di Identità (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2004 | Carta di Identità (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2016 | Carta di Identità (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2023 | Carta di Identità (Identity Card) | | ALL | MedicalCard | HEALTH\_CARD | 2022 | Tessera Sanitaria (Health Insurance Card) | | ALL | MedicalCard | HEALTH\_CARD | 2025 | Health Card | | ALL | Passport | NATIONAL\_PASSPORT | 2005 | Passaporto (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2010 | Passaporto (Passport) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2011 | Permesso di Soggiorno (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2013 | Permesso di Soggiorno (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2021 | Permesso di Soggiorno (Residence Permit) | | ALL | TravelDocument | CONSULAR\_CARD | 2023 | Consular Card | | ALL | Visa | VISA | 2005 | Visto (Visa) | | ALL | Visa | VISA | 2019 | Visto (Visa) | ## Jersey (JEY) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :-------------- | :------ | :-------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 2014 | Driving License | ## Kosovo (RKS) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :-------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2008 | Driving License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2021 | Driving License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2024 | Driving License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2008 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2013 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2024 | Identity Card | | ALL | Passport | NATIONAL\_PASSPORT | 2011 | Passaporte / Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2013 | Passaporte / Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2024 | Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2021 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2025 | Residence Permit | ## Latvia (LVA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2014 | Vadītāja Apliecība (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2012 | Personas Apliecība (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2019 | Personas Apliecība (Identity Card) | | ALL | Passport | NATIONAL\_PASSPORT | 2012 | Pase (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2015 | Pase (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2024 | Pase (Passport) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2021 | Permanent Residence Card | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2024 | Residence Permit | ## Liechtenstein (LIE) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :---------------- | :----------------- | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2018 | Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2022 | Driving License | | ALL | Passport | NATIONAL\_PASSPORT | 2016 | Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Aufenthaltskarte (Residence Card) | ## Lithuania (LTU) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------- | :------ | :--------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2000 | Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2010 | Vairuotojo Pazymejimas (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2011 | Vairuotojo Pazymejimas (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Vairuotojo Pazymejimas (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2017 | Vairuotojo Pazymejimas (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2010 | Personal Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2012 | Personal Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2021 | Identity Card | | ALL | IdentificationCard | PENSIONERS\_IDENTITY\_CARD | 2024 | Pensioner certificate | | ALL | Passport | NATIONAL\_PASSPORT | 2019 | Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2012 | Leidimas Gyventi (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Leidimas Gyventi (Residence Permit) | | ALL | Visa | VISA | 2020 | Viza / Visa | ## Luxembourg (LUX) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Permis de Conduire (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2008 | Identity Card / Carte D'Identite | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2014 | Identity Card / Carte D'Identite | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2021 | Identity Card / Carte D'Identite | | ALL | Passport | NATIONAL\_PASSPORT | 2015 | Pass / Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2013 | Titre de Sejour (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Titre de Sejour (Residence Permit) | | ALL | TravelDocument | CONSULAR\_CARD | 2024 | Consular Card | ## Malta (MLT) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :--------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Driving License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2020 | Driving License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2014 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2020 | Identity Card | | ALL | Passport | NATIONAL\_PASSPORT | 2008 | Passaport (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2021 | Passaport (Passport) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Permess Ta 'Residenza (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2025 | Residence Permit | ## Moldova (MDA) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :---------------------------------------- | :------ | :------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2015 | Permis de Conducere (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2007 | Buletin de Identitate (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2014 | Buletin de Identitate (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2015 | Buletin de Identitate (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2025 | Buletin de Identitate (Identity Card) | | ALL | Other | TEMPORARY\_PROTECTION\_IDENTITY\_DOCUMENT | 2023 | Temporary Protection Identity Document | | ALL | Passport | NATIONAL\_PASSPORT | 2014 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2023 | Passport | ## Monaco (MCO) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :-------------------------------- | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2009 | Identity Card / Carte D'Identite | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2018 | Carte D'identité (Identity Card) | | ALL | Passport | NATIONAL\_PASSPORT | 2005 | Passeport / Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2017 | Carte de Resident (Resident Card) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2023 | Residence Permit | ## Montenegro (MNE) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :------------------------------------------------------------------------ | | ALL | DriversLicense | DRIVERS\_LICENSE | 2008 | Vozacka Dozvola (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2020 | Vozacka Dozvola (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2008 | Licna Karta (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2020 | Licna Karta (Identity Card) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2022 | Permanent Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2023 | Dozvola za privremeni boravak i rad (Temporary residence and work permit) | | ALL | Passport | NATIONAL\_PASSPORT | 2008 | Pasos (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2020 | Pasos (Passport) | ## Netherlands (NLD) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------- | :------ | :----------------------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 2006 | Driving License | | ALL | DriversLicense | DRIVER\_LICENSE | 2013 | Driving License | | ALL | DriversLicense | DRIVER\_LICENSE | 2018 | Driving License | | ALL | DriversLicense | DRIVER\_LICENSE | 2025 | Driving License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2014 | Identity Card | | ALL | IdentificationCard | DIPLOMATIC\_IDENTIFICATION\_CARD | 2016 | Diplomatic Identification Card | | ALL | Passport | NATIONAL\_PASSPORT | 2006 | Paspoort (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2014 | Paspoort (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2024 | Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2014 | Dutch Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2022 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2026 | Residence Permit | | ALL | Visa | VISA | 2023 | Visa | ## Norway (NOR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :--------------------------- | :------ | :------------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 1989 | Driving License | | ALL | DriversLicense | DRIVER\_LICENSE | 2007 | Driving License | | ALL | DriversLicense | DRIVER\_LICENSE | 2013 | Driving License | | ALL | DriversLicense | DRIVER\_LICENSE | 2018 | Driving License | | ALL | DriversLicense | DRIVER\_LICENSE | 2023 | Driving License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2015 | Handelsbanken BankID | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2020 | Identity Card | | ALL | MilitaryCard | MILITARY\_CARD | 2024 | Military Card | | ALL | Passport | NATIONAL\_PASSPORT | 2011 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2021 | Passport | | ALL | Passport | IMMIGRATION\_PASSPORT | 2023 | Immigration Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Residence Card | | ALL | ResidenceDocument | TEMPORARY\_RESIDENCE\_PERMIT | 2012 | Residence Permit | | ALL | ResidenceDocument | ASYLUM\_SEEKER\_CARD | 2023 | Asylum Seeker Card | ## Poland (POL) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------------------ | :------ | :--------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2000 | Prawo Jazdy (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2001 | Permis de Conduire (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2002 | Prawo Jazdy (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Prawo Jazdy (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2013 | Dowód Osobisty (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2015 | Dowód Osobisty (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2019 | Dowód Osobisty (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2022 | Karta Polaka (Pole's Card) | | ALL | Passport | NATIONAL\_PASSPORT | 2011 | Paszport (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2018 | Paszport (Passport) | | ALL | Passport | TEMPORARY\_PASSPORT | 2024 | Temporary Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2018 | Karta Pobytu (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Karta Pobytu (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2024 | Residence Permit | | ALL | ResidenceDocument | SPECIAL\_IDENTITY\_CARD | 2010 | Special Identity Card | | ALL | ResidenceDocument | TEMPORARY\_FOREIGNER\_IDENTITY\_CERTIFICATE | 2024 | Temporary Foreigner Identity Certificate | | ALL | ResidenceDocument | TEMPORARY\_FOREIGNER\_IDENTITY\_CERTIFICATE | 2025 | Temporary Foreigner Identity Certificate | | ALL | Military | MILITAR\_IDENTIFICATION\_CARD | 2025 | Military Identification Card | ## Portugal (PRT) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------------ | :------ | :-------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 1999 | Carta de Condução (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Carta de Condução (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2014 | Carta de Condução (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2015 | Cartão de Cidadão (Citizen Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2024 | Cartão de Cidadão (Identity Card) | | ALL | IdentificationCard | DIPLOMATIC\_IDENTIFICATION\_CARD | 2025 | Diplomatic Identification Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD\_FOR\_FOREIGNERS | 2024 | Identification Card for Foreigners | | ALL | Passport | NATIONAL\_PASSPORT | 2009 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2018 | Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2008 | Título de Residência (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Título de Residência (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2023 | Permanent Residence Certificate | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2024 | Residence Permit | | ALL | ResidenceDocument | ASYLUM\_SEEKER\_CARD | 2020 | Asylum Seeker Card | | ALL | Visa | VISA | 2010 | Visto (Visa) | | ALL | Visa | VISA | 2019 | Visto (Visa) | ## Republic of North Macedonia (MKD) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :---------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2007 | Vozacka Dozvola (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2007 | Licna Karta (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2008 | Licna Karta (Identity Card) | | ALL | Passport | NATIONAL\_PASSPORT | 2015 | Pasos (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2017 | Pasos (Passport) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2019 | Permanent Residence Permit for Foreigners | ## Romania (ROU) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------- | :------ | :------------------------------------ | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Permis de Conducere (Driving License) | | ALL | DriversLicense | DRIVER\_QUALIFICATION\_CARD | 2022 | Driver Qualification Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2015 | Carte de Identitate (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2022 | Carte de Identitate (Identity Card) | | ALL | IdentificationCard | DIPLOMATIC\_IDENTIFICATION\_CARD | 2025 | Diplomatic Identification Card | | ALL | Passport | NATIONAL\_PASSPORT | 2008 | Pasaport/Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2019 | Pasaport/Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2024 | Pasaport/Passport | | ALL | Passport | TEMPORARY\_PASSPORT | 2020 | Pasaport/Passport | | ALL | Passport | TEMPORARY\_PASSPORT | 2023 | Pasaport/Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2013 | Permis de ședere (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Permis de ședere (Residence Permit) | ## Saint Martin (French part) (MAF) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :--------------- | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2019 | Permis de Conduire (Driving License) | ## San Marino (SMR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :------------------------------- | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2017 | Carta D'identità / Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2024 | Carta D'identità / Identity Card | | ALL | DriversLicense | DRIVERS\_LICENSE | 2021 | Driving License | | ALL | Passport | NATIONAL\_PASSPORT | 2015 | Passaporto (Passport) | ## Serbia (SRB) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------------ | :------ | :-------------------------------------------------------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 2011 | Vozacka Dozvola (Driving License) | | ALL | DriversLicense | DRIVER\_QUALIFICATION\_CARD | 2025 | Driver Qualification Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2008 | Licna Karta (Identity Card) | | ALL | IdentificationCard | DIPLOMATIC\_IDENTIFICATION\_CARD | 2020 | Diplomatic Identification Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD\_FOR\_FOREIGNERS | 2022 | Licna karta za strance / Identification Card for Foreigners | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2011 | Dozvola za privremeni boravak i rad (Residence and work permit) | | ALL | Passport | NATIONAL\_PASSPORT | 2008 | Pasos (Passport) | ## Slovakia (SVK) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :--------------------------------------------------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2008 | Vodičský Preukaz (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Vodičský Preukaz (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2015 | Vodičský Preukaz (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2013 | Občiansky Preukaz (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2022 | Občiansky Preukaz (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2023 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2025 | Občiansky Preukaz (Identity Card) | | ALL | Passport | NATIONAL\_PASSPORT | 2008 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2024 | Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2019 | Povolenie Na Pobyt (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Pobyt rodinného príslušníka občana EÚ (Residence Card of EU Citizen Family Member) | ## Slovenia (SVN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :------------------------------------ | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Voznisko Dovoljenje (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2015 | Voznisko Dovoljenje (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 1998 | Osebna Iskaznica (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2022 | Osebna Iskaznica (Identity Card) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2021 | Residence Permit | | ALL | Passport | NATIONAL\_PASSPORT | 2006 | Potni List (Passport) | ## Spain (ESP) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------- | :------ | :---------------------------------------------------------------------------------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 2004 | Permiso de Conduccion (Driver's License) | | ALL | DriversLicense | DRIVER\_LICENSE | 2013 | Permiso de Conduccion (Driver's License) | | ALL | DriversLicense | DRIVER\_CARD | 2020 | Tarjeta de Conductor / Driver Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2006 | Documento Nacional de Identidad (National Identity Document) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2010 | Identification Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2015 | Documento Nacional de Identidad (National Identity Document) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2021 | Documento Nacional de Identidad (National Identity Document) | | ALL | IdentificationCard | CITIZENCARD | 2020 | Citizen Card | | ALL | Military | MILITARY\_CARD | 2020 | Military Card | | ALL | Military | MILITARY\_DRIVERS\_LICENSE | 2025 | Military Driving License | | ALL | Passport | NATIONAL\_PASSPORT | 2008 | Pasaporte (Passport) | | ALL | Passport | NATIONAL\_PASSPORT | 2015 | Pasaporte (Passport) | | ALL | ResidenceDocument | RESIDENCE\_DOCUMENT | 2017 | Certificado de Registro de Ciudadano de la Union (Union Citizen Registration Certificate) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2010 | Tarjeta de Identidad de Extranjero (Foreigner Identity Card) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2011 | Permiso de Residencia (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Permiso de Residencia (Residence Permit) | | ALL | TravelDocument | CONSULAR\_CARD | 2020 | Consular Card | | ALL | TravelDocument | CONSULAR\_CARD | 2021 | Consular Card | | ALL | TravelDocument | CONSULAR\_CARD | 2023 | Consular Card | | ALL | Visa | VISA | 2019 | Visado (Visa) | | ALL | Visa | VISA | 2021 | Visado (Visa) | ## Sweden (SWE) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :------------------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2007 | Körkort Sverige (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2013 | Körkort Sverige (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2016 | Körkort Sverige (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2024 | Driving License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2025 | Driving License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2007 | Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2012 | National Identity Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2013 | Identitetskort (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2017 | Identitetskort (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2021 | Nationellt Identitetskort (National Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2022 | Identitetskort (Identity Card) | | ALL | Passport | NATIONAL\_PASSPORT | 2012 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2022 | Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2011 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2021 | Residence Permit | ## Switzerland (CHE) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------------- | :------ | :---------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2003 | Führerausweise (Driving License) | | ALL | DriversLicense | DRIVERS\_LICENSE | 2023 | Führerausweise (Driving License) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2003 | Identitatskarte (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2023 | Identitatskarte (Identity Card) | | ALL | IdentificationCard | DIPLOMATIC\_IDENTIFICATION\_CARD | 2024 | Diplomatic Identification Card | | ALL | IdentificationCard | DIPLOMATIC\_IDENTIFICATION\_CARD | 2025 | Diplomatic Identification Card | | ALL | Passport | NATIONAL\_PASSPORT | 2010 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2022 | Passport | | ALL | Passport | TEMPORARY\_PASSPORT | 2024 | Temporary Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2016 | Aufenthaltstitel (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2019 | Aufenthaltstitel (Residence Permit) | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2020 | Aufenthaltstitel (Residence Permit) | | ALL | Visa | VISA | 2022 | Visa | | ALL | Visa | VISA | 2023 | Visa / Visum | ## Ukraine (UKR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :--------------------------- | :------ | :------------------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 1996 | Permis de Conduire / Driving License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2005 | Driving License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2014 | Driving License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2021 | Driving License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2016 | Passport of the Citizen of Ukraine (Identity Card) | | ALL | IdentificationCard | PENSIONERS\_IDENTITY\_CARD | 2024 | Pensioner's Identity Card | | ALL | Passport | NATIONAL\_PASSPORT | 2007 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2015 | Passport | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2005 | Permanent Residence Permit | | ALL | ResidenceDocument | RESIDENCE\_PERMIT | 2018 | Permanent Residence Permit | | ALL | ResidenceDocument | TEMPORARY\_RESIDENCE\_PERMIT | 2018 | Temporary Residence Permit | ## United Kingdom (GBR) ### All States | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------- | :------ | :------------------------------ | | DriversLicense | DRIVER\_LICENSE | 2006 | Driving License | | DriversLicense | DRIVER\_LICENSE | 2007 | Driving License | | DriversLicense | DRIVER\_LICENSE | 2013 | Driving License | | DriversLicense | DRIVER\_LICENSE | 2015 | Driving License | | DriversLicense | DRIVER\_LICENSE | 2019 | Driver Qualification Card | | DriversLicense | DRIVER\_LICENSE | 2022 | Driving License | | DriversLicense | DRIVER\_CARD | 2018 | Driver Card | | DriversLicense | DRIVER\_QUALIFICATION\_CARD | 2022 | Driver Qualification Card | | DriversLicense | PROVISIONAL\_DRIVER\_LICENSE | 2007 | Provisional Driving License | | DriversLicense | PROVISIONAL\_DRIVER\_LICENSE | 2013 | Provisional Driving License | | DriversLicense | PROVISIONAL\_DRIVER\_LICENSE | 2015 | Provisional Driving License | | DriversLicense | PROVISIONAL\_DRIVER\_LICENSE | 2021 | Provisional Driving License | | DriversLicense | INTERNATIONAL\_DRIVERS\_LICENSE | 2023 | International Drivers License | | DriversLicense | INTERNATIONAL\_DRIVERS\_LICENSE | 2024 | International Drivers License | | IdentificationCard | CITIZENCARD | 2010 | CitizenCard - Proof of Age Card | | IdentificationCard | CITIZENCARD | 2011 | CitizenCard - Proof of Age Card | | IdentificationCard | CITIZENCARD | 2012 | CitizenCard - Proof of Age Card | | IdentificationCard | CITIZENCARD | 2015 | CitizenCard - Proof of Age Card | | IdentificationCard | CITIZENCARD | 2021 | CitizenCard - Proof of Age Card | | IdentificationCard | CITIZENCARD | 2025 | CitizenCard - Proof of Age Card | | IdentificationCard | IDENTIFICATION\_CARD | 2009 | National Identity Card | | IdentificationCard | DIPLOMATIC\_IDENTIFICATION\_CARD | 2024 | Diplomatic Identity Card | | IdentificationCard | DISABILITY\_IDENTIFICATION\_CARD | 2020 | UK Disabled ID | | IdentificationCard | DISABILITY\_IDENTIFICATION\_CARD | 2024 | National Disability Card | | Military | MILITAR\_IDENTIFICATION\_CARD | 2017 | British Army Identity Card | | Military | MILITAR\_IDENTIFICATION\_CARD | 2024 | Military Identity Card | | Military | MILITAR\_IDENTIFICATION\_CARD | 2025 | British Army Identity Card | | Passport | NATIONAL\_PASSPORT | 2006 | Passport | | Passport | NATIONAL\_PASSPORT | 2010 | Passport / Passeport | | Passport | NATIONAL\_PASSPORT | 2015 | Passport / Passeport | | Passport | NATIONAL\_PASSPORT | 2020 | Passport / Passeport | | Passport | NATIONAL\_PASSPORT | 2023 | Passport | | Passport | NATIONAL\_PASSPORT | 2025 | Passport | | Passport | TRAVEL\_DOCUMENT | 2020 | Travel Document | | ResidenceDocument | RESIDENCE\_PERMIT | 2004 | Residence Permit | | ResidenceDocument | RESIDENCE\_PERMIT | 2008 | Residence Permit | | ResidenceDocument | RESIDENCE\_PERMIT | 2021 | Residence Permit | | Visa | VISA | 2010 | Entry Clearance (Visa) | | Visa | VISA | 2020 | Visa | ### Falkland Islands | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :------------------------------- | | DriversLicense | DRIVER\_LICENSE | 2020 | Falkland Islands Driving License | ### Guernsey | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :----------------------- | | DriversLicense | DRIVER\_LICENSE | 2013 | Guernsey Driving License | ### Isle of Man | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :-------------------------- | | DriversLicense | DRIVER\_LICENSE | 2006 | Isle of Man Driving License | | DriversLicense | DRIVER\_LICENSE | 2022 | Isle of Man Driving License | ### Montserrat | Type of ID | Subtype of ID | Version | Description | | :------------- | :--------------- | :------ | :-------------------------- | | DriversLicense | DRIVERS\_LICENSE | 2022 | Montserrat Driver's License | ### Scotland | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------ | :------ | :------------------------------------------------ | | IdentificationCard | CITIZENCARD | 2020 | Scotland National Entitlement Card (Saltire card) | ### Wales | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :-------------------- | | DriversLicense | DRIVER\_LICENSE | 2007 | Wales Driving License | | DriversLicense | DRIVER\_LICENSE | 2013 | Wales Driving Licence | ## Vatican City (VAT) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :--------- | :----------------- | :------ | :-------------------- | | ALL | Passport | NATIONAL\_PASSPORT | 2010 | Passaporto / Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2013 | Passaporte / Passport | --- - Path: `general-reference/supported-ids-north-central-america` - URL: https://developer.incode.com/general-reference/supported-ids-north-central-america/ - Markdown: https://developer.incode.com/general-reference/supported-ids-north-central-america.md The following tables list supported identification documents for North America, organized by country, then state. ## Canada (CAN) ### All States | Type of ID | Subtype of ID | Version | Description | | :------------------- | :---------------------------- | :------ | :----------------------------------------------------- | | IdentificationCard | IDENTIFICATION_CARD | 2013 | Identification Card | | IdentificationCard | CANADIAN_CITIZENSHIP_CARD | 2002 | Certificate of Canadian Citizenship | | IdentificationCard | CERTIFICATE_OF_INDIAN_STATUS | 2010 | Certificate of Indian Status | | IdentificationCard | CERTIFICATE_OF_INDIAN_STATUS | 2012 | Certificate of Indian Status | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2022 | Citizenship Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2023 | Métis Nation - Saskatchewan Tribal Identification Card | | DriversLicense | DRIVERS_LICENSE | 2023 | Driver's License | | Military | MILITARY_CARD | 2010 | Canadian Forces Identification Card | | Military | TEMPORARY_IDENTIFICATION_CARD | 2020 | Temporary Identification Card | | Other | FIREARMS_LICENSE | 2010 | Firearms License | | Other | FIREARMS_LICENSE | 2020 | Firearms License | | Other | INDIAN_STATUS_CERTIFICATE | 2007 | Certificate of Indian Status | | Other | INDIAN_STATUS_CERTIFICATE | 2008 | Certificate of Indian Status | | Other | INDIAN_STATUS_CERTIFICATE | 2009 | Certificate of Indian Status | | Passport | NATIONAL_PASSPORT | 2007 | Passport | | Passport | NATIONAL_PASSPORT | 2013 | Passport | | Passport | NATIONAL_PASSPORT | 2023 | Passport | | Passport | TEMPORARY_PASSPORT | 2023 | Temporary Passport / Passeport Provisoire | | ResidenceDocument | RESIDENCE_PERMIT | 2009 | Permanent Resident Card | | ResidenceDocument | RESIDENCE_PERMIT | 2013 | Permanent Resident Card | | ResidenceDocument | RESIDENCE_PERMIT | 2021 | Permanent Resident Card | | Visa | VISA | 2019 | Visa | ### Alberta | Type of ID | Subtype of ID | Version | Description | | :----------------- | :--------------------------- | :------ | :----------------------------------- | | DriversLicense | DRIVER_LICENSE | 2009 | Alberta Operator's Licence | | DriversLicense | DRIVER_LICENSE | 2018 | Alberta Driver's Licence | | DriversLicense | DRIVER_LICENSE | 2026 | Alberta Driver's Licence | | IdentificationCard | IDENTIFICATION_CARD | 2015 | Alberta Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2020 | Alberta Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2026 | Alberta Identification Card | | IdentificationCard | ENHANCED_IDENTIFICATION_CARD | 2023 | Alberta Enhanced Identification Card | ### British Columbia | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------- | :------ | :-------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2020 | British Columbia Driver's Licence | | DriversLicense | DRIVERS_LICENSE | 2022 | British Columbia Driver's Licence and Services Card | | DriversLicense | DRIVERS_LICENSE | 2025 | British Columbia Driver's Licence | | DriversLicense | ENHANCED_DRIVERS_LICENSE | 2009 | British Columbia Enhanced Driver's Licence | | DriversLicense | LEARNERS_DRIVERS_LICENSE | 2020 | British Columbia Learner Driver Licence | | DriversLicense | LEARNERS_DRIVERS_LICENSE | 2022 | British Columbia Learner Driver Licence | | IdentificationCard | IDENTIFICATION_CARD | 2016 | British Columbia Identity Card | | IdentificationCard | IDENTIFICATION_CARD | 2020 | British Columbia Services Card | | IdentificationCard | IDENTIFICATION_CARD | 2021 | British Columbia Identity Card | | IdentificationCard | IDENTIFICATION_CARD | 2025 | British Columbia Identity Card | | MedicalCard | MEDICAL_CARD | 2010 | British Columbia Care Card | | MedicalCard | SERVICES_CARD | 2022 | British Columbia Services Card | | Other | SERVICES_CARD | 2010 | British Columbia Services Card | | Other | SERVICES_CARD | 2022 | British Columbia Services Card | | Other | TRIBAL_IDENTIFICATION_CARD | 2015 | British Columbia Citizenship & ID Card | ### Manitoba | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------ | :------ | :--------------------------- | | DriversLicense | DRIVERS_LICENSE | 2009 | Manitoba Driver's Licence | | IdentificationCard | IDENTIFICATION_CARD | 2018 | Manitoba Identification Card | ### Newfoundland | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------ | :------ | :-------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2007 | Newfoundland and Labrador Driver Licence | | DriversLicense | DRIVERS_LICENSE | 2018 | Newfoundland and Labrador Driver Licence | | IdentificationCard | IDENTIFICATION_CARD | 2017 | Newfoundland and Labrador Identification Card | | MedicalCard | MEDICAL_CARD | 2010 | Newfoundland and Labrador Medical Care Plan | ### New Brunswick | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------ | :------ | :----------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2009 | New Brunswick Driver Licence | | DriversLicense | DRIVERS_LICENSE | 2017 | New Brunswick Driver Licence | | IdentificationCard | IDENTIFICATION_CARD | 2021 | New Brunswick Identification Card | | MedicalCard | MEDICAL_CARD | 2010 | New Brunswick Medicare Assurance - maladie | ### Northwest Territories | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------ | :------ | :----------------------------------------------- | | DriversLicense | DRIVER_LICENSE | 2008 | Northwest Territories Driver's Licence | | DriversLicense | DRIVER_LICENSE | 2020 | Northwest Territories Driver's Licence | | DriversLicense | TEMPORARY_DRIVERS_LICENSE | 2024 | Northwest Territories Temporary Driver's License | | IdentificationCard | IDENTIFICATION_CARD | 2010 | Northwest Territories Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2020 | Northwest Territories Identification Card | ### Nova Scotia | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------- | :------ | :------------------------------------ | | DriversLicense | DRIVERS_LICENSE | 2010 | Nova Scotia Driver Licence | | DriversLicense | DRIVERS_LICENSE | 2017 | Nova Scotia Driver Licence | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2010 | Nova Scotia Driver License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2017 | Nova Scotia Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2018 | Nova Scotia Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2025 | Nova Scotia Identification Card | | MedicalCard | MEDICAL_CARD | 2010 | Nova Scotia Health Card | ### Nunavut | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------ | :------ | :-------------------------- | | DriversLicense | DRIVER_LICENSE | 2008 | Nunavut Driver's Licence | | IdentificationCard | IDENTIFICATION_CARD | 2010 | Nunavut Identification Card | | MedicalCard | MEDICAL_CARD | 2010 | Nunavut Health Card | ### Ontario | Type of ID | Subtype of ID | Version | Description | | :----------------- | :----------------------- | :------ | :-------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2011 | Ontario Driver's Licence | | DriversLicense | ENHANCED_DRIVERS_LICENSE | 2010 | Ontario Enhanced Driver's License | | IdentificationCard | IDENTIFICATION_CARD | 2011 | Ontario Photo Card | | MedicalCard | MEDICAL_CARD | 2020 | Ontario Health Card | | Other | BIRTH_CERTIFICATE | 2010 | Ontario Birth Certificate | ### Prince Edward Island | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------ | :------ | :--------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2007 | Prince Edward Island Driver Licence | | DriversLicense | DRIVERS_LICENSE | 2017 | Prince Edward Island Driver Licence | | IdentificationCard | IDENTIFICATION_CARD | 2010 | Prince Edward Island Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2017 | Prince Edward Island Identification Card | | MedicalCard | MEDICAL_CARD | 2010 | Prince Edward Island Health Card | ### Quebec | Type of ID | Subtype of ID | Version | Description | | :------------- | :------------- | :------ | :------------------------------------------------ | | DriversLicense | DRIVER_LICENSE | 2009 | Quebec Permis de conduire (Driver Licence) | | DriversLicense | DRIVER_LICENSE | 2015 | Quebec Permis de conduire (Driver Licence) | | MedicalCard | MEDICAL_CARD | 2010 | Quebec Regie de L'assurance maladie (Health Card) | | MedicalCard | MEDICAL_CARD | 2018 | Quebec Regie de L'assurance maladie (Health Card) | ### Saskatchewan | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------ | :------ | :------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2016 | Saskatchewan Driver's Licence | | IdentificationCard | IDENTIFICATION_CARD | 2017 | Saskatchewan Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2019 | Saskatchewan Identification Card | | Military | MILITARY_CARD | 2024 | Saskatchewan Military Card | ### Yukon | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------ | :------ | :-------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2010 | Yukon Operator's Licence | | DriversLicense | DRIVERS_LICENSE | 2024 | Permis de Conduire (Operator's License) | | IdentificationCard | IDENTIFICATION_CARD | 2016 | Yukon General Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2024 | Yukon General Identification Card | ## Mexico (MEX) ### All States | Type of ID | Subtype of ID | Version | Description | | :------------------ | :------------------------------------------ | :------ | :--------------------------------------------------------------------------------------------------------------- | | IdentificationCard | IDENTIFICATION_CARD | 2000 | Cédula Profesional | | IdentificationCard | IDENTIFICATION_CARD | 2015 | Cédula Profesional | | IdentificationCard | DIGITAL_IDENTIFICATION_CARD | 2020 | Digital Cédula Profesional | | IdentificationCard | AIRFORCE_IDENTIFICATION_CARD | 2021 | Licencia Federal de Técnico Aeronáutico (Federal Aeronautical Technician License - Airforce Identification Card) | | IdentificationCard | AIRFORCE_IDENTIFICATION_CARD | 2024 | Airforce Identification Card | | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2009 | Tarjeta INAPAM | | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2010 | Tarjeta INAPAM | | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2011 | Tarjeta INAPAM | | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2013 | Tarjeta INAPAM | | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2014 | Tarjeta INAPAM | | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2015 | Tarjeta INAPAM | | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2020 | Tarjeta INAPAM | | IdentificationCard | SENIOR_IDENTIFICATION_CARD | 2023 | Tarjeta INAPAM | | MedicalCard | MEDICAL_CARD | 2010 | Tarjera IMSS | | Military | MILITARY_CARD | 2010 | Military Card | | Military | MILITARY_CARD | 2018 | Tarjeta de Identidad Militar / Military Card | | Military | MILITARY_CARD | 2019 | Tarjeta de Identidad Militar (Military Card) | | Military | MILITARY_CARD | 2021 | Credencial de Identidad Militar | | Military | MILITARY_CARD | 2022 | Credencial de Identidad Militar | | Military | MILITARY_CARD | 2024 | Tarjeta de Identidad Militar / Military Card | | Military | MILITARY_CARD | 2025 | Military Card | | Passport | NATIONAL_PASSPORT | 2000 | Passport | | Passport | NATIONAL_PASSPORT | 2002 | Passport | | Passport | NATIONAL_PASSPORT | 2008 | Passport | | Passport | NATIONAL_PASSPORT | 2012 | Passport | | Passport | NATIONAL_PASSPORT | 2015 | Passport | | Passport | NATIONAL_PASSPORT | 2022 | Passport | | ResidenceDocument | PERMANENT_RESIDENCE_CARD | 2000 | Credencial de Residente Permanente | | ResidenceDocument | PERMANENT_RESIDENCE_CARD | 2001 | Credencial de Residente Permanente | | ResidenceDocument | PERMANENT_RESIDENCE_CARD | 2012 | Credencial de Residente Permanente | | ResidenceDocument | PERMANENT_RESIDENCE_CARD | 2020 | Credencial de Residente Permanente | | ResidenceDocument | PERMANENT_RESIDENCE_CARD | 2022 | Credencial de Residente Permanente | | ResidenceDocument | RESIDENCE_PERMIT | 2010 | Credencial de Inmigrado | | ResidenceDocument | TEMPORARY_RESIDENCE_CARD | 2000 | Credencial de Residente Temporal | | ResidenceDocument | TEMPORARY_RESIDENCE_CARD | 2012 | Credencial de Residente Temporal | | ResidenceDocument | TEMPORARY_RESIDENCE_CARD | 2022 | Credencial de Residente Temporal | | ResidenceDocument | VISITORS_PERMIT | 2020 | Credencial de Visitante | | ResidenceDocument | VISITORS_PERMIT | 2022 | Credencial de Visitante | | TravelDocument | MATRICULA_CONSULAR | 2011 | Matricula Consular / Consular ID Card | | TravelDocument | MATRICULA_CONSULAR | 2019 | Consular ID Card | | TravelDocument | MATRICULA_CONSULAR | 2023 | Consular ID Card | | TravelDocument | MATRICULA_CONSULAR | 2024 | Matricula Consular (Consular Card) | | Visa | VISA | 2021 | Visa | | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2002 | Credencial para Votar | | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2008 | Credencial para Votar | | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2013 | Credencial para Votar | | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2014 | Credencial para Votar | | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2019 | Credencial para Votar | | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2026 | Voter Identification Card | | Other | BIRTH_CERTIFICATE | 2020 | Acta de Nacimiento / Birth Certificate | | Other | DIGITAL_CURP_CERTIFICATE_FOR_FOREIGNERS_PDF | 2026 | Digital CURP Cerificate for Foreigners | | DriversLicense | FEDERAL_DRIVERS_LICENSE | 2015 | Nationwide Drivers License | | DriversLicense | FEDERAL_DRIVERS_LICENSE | 2018 | Nationwide Drivers License | | DriversLicense | FEDERAL_DRIVERS_LICENSE | 2019 | Nationwide Drivers License | | DriversLicense | DIGITAL_FEDERAL_DRIVERS_LICENSE_PDF | 2025 | Digital Federal Driver License | | MedicalCard | MEDICAL_CARD | 2022 | Credencial del Instituto de Seguridad Social de Estado de México y Municipios | ### Aguascalientes | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :----------------------------- | | DriversLicense | DRIVERS_LICENSE | 2014 | Aguascalientes Drivers License | | DriversLicense | DRIVERS_LICENSE | 2017 | Aguascalientes Drivers License | | DriversLicense | DRIVERS_LICENSE | 2019 | Aguascalientes Drivers License | | DriversLicense | DRIVERS_LICENSE | 2022 | Aguascalientes Drivers License | ### Baja California | Type of ID | Subtype of ID | Version | Description | | :----------------- | :----------------------------- | :------ | :--------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2014 | Baja California Drivers License | | DriversLicense | DRIVERS_LICENSE | 2016 | Baja California Drivers License | | DriversLicense | DRIVERS_LICENSE | 2018 | Baja California Drivers License | | DriversLicense | DRIVERS_LICENSE | 2019 | Baja California Drivers License | | DriversLicense | DRIVERS_LICENSE | 2020 | Baja California Drivers License | | DriversLicense | DRIVERS_LICENSE | 2021 | Baja California Drivers License | | IdentificationCard | DISABILITY_IDENTIFICATION_CARD | 2023 | Baja California Disability Identification Card | ### Baja California Sur | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :---------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2016 | Baja California Sur Drivers License | | DriversLicense | DRIVERS_LICENSE | 2022 | Baja California Sur Drivers License | ### Campeche | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :----------------------- | | DriversLicense | DRIVERS_LICENSE | 2019 | Campeche Drivers License | ### CDMX | Type of ID | Subtype of ID | Version | Description | | :------------- | :------------------------- | :------ | :-------------------------------------------- | | DriversLicense | DRIVER_LICENSE | 1929 | Mexico City Drivers License | | DriversLicense | DRIVER_LICENSE | 2000 | Mexico City Drivers License | | DriversLicense | DRIVER_LICENSE | 2004 | Mexico City Drivers License | | DriversLicense | DRIVER_LICENSE | 2005 | Mexico City Drivers License | | DriversLicense | DRIVER_LICENSE | 2014 | Mexico City Drivers License | | DriversLicense | DRIVER_LICENSE | 2018 | Mexico City Drivers License | | DriversLicense | DRIVER_LICENSE | 2019 | Mexico City Drivers License | | DriversLicense | DRIVER_LICENSE | 2021 | Mexico City Drivers License | | DriversLicense | DRIVER_LICENSE | 2024 | CDMX Licencia para Conducir / Driving License | | DriversLicense | DRIVER_LICENSE | 2025 | CDMX Licencia para Conducir / Driving License | | DriversLicense | DIGITAL_DRIVER_LICENSE_APP | 2023 | Mexico City Digital Drivers License | | DriversLicense | DIGITAL_DRIVER_LICENSE_APP | 2024 | Mexico City Digital Drivers License | ### Chiapas | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :---------------------- | | DriversLicense | DRIVERS_LICENSE | 2013 | Chiapas Drivers License | | DriversLicense | DRIVERS_LICENSE | 2016 | Chiapas Drivers License | | DriversLicense | DRIVERS_LICENSE | 2017 | Chiapas Drivers License | | DriversLicense | DRIVERS_LICENSE | 2025 | Chiapas Drivers License | ### Chihuahua | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :------------------------ | | DriversLicense | DRIVERS_LICENSE | 2016 | Chihuahua Drivers License | | DriversLicense | DRIVERS_LICENSE | 2017 | Chihuahua Drivers License | | DriversLicense | DRIVERS_LICENSE | 2019 | Chihuahua Drivers License | | DriversLicense | DRIVERS_LICENSE | 2020 | Chihuahua Drivers License | | DriversLicense | DRIVERS_LICENSE | 2021 | Chihuahua Drivers License | | DriversLicense | DRIVERS_LICENSE | 2022 | Chihuahua Drivers License | | DriversLicense | DRIVERS_LICENSE | 2024 | Chihuahua Drivers License | ### Coahuila | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :----------------------- | | DriversLicense | DRIVERS_LICENSE | 2016 | Coahuila Drivers License | | DriversLicense | DRIVERS_LICENSE | 2020 | Coahuila Drivers License | | DriversLicense | DRIVERS_LICENSE | 2024 | Coahuila Drivers License | ### Colima | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :--------------------- | | DriversLicense | DRIVERS_LICENSE | 2016 | Colima Drivers License | | DriversLicense | DRIVERS_LICENSE | 2017 | Colima Drivers License | | DriversLicense | DRIVERS_LICENSE | 2018 | Colima Drivers License | | DriversLicense | DRIVERS_LICENSE | 2022 | Colima Drivers License | ### Durango | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :---------------------- | | DriversLicense | DRIVERS_LICENSE | 2015 | Durango Drivers License | | DriversLicense | DRIVERS_LICENSE | 2016 | Durango Drivers License | | DriversLicense | DRIVERS_LICENSE | 2023 | Durango Drivers License | | DriversLicense | DRIVERS_LICENSE | 2025 | Durango Drivers License | ### Estado De Mexico | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :--------------------------- | | DriversLicense | DRIVERS_LICENSE | 2011 | Mexico State Drivers License | | DriversLicense | DRIVERS_LICENSE | 2014 | Mexico State Drivers License | | DriversLicense | DRIVERS_LICENSE | 2018 | Mexico State Drivers License | | DriversLicense | DRIVERS_LICENSE | 2021 | Mexico State Drivers License | | DriversLicense | DRIVERS_LICENSE | 2022 | Mexico State Drivers License | ### Guanajuato | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :------------------------- | | DriversLicense | DRIVERS_LICENSE | 2015 | Guanajuato Drivers License | | DriversLicense | DRIVERS_LICENSE | 2019 | Guanajuato Drivers License | | DriversLicense | DRIVERS_LICENSE | 2020 | Guanajuato Drivers License | | DriversLicense | DRIVERS_LICENSE | 2023 | Guanajuato Drivers License | | DriversLicense | DRIVERS_LICENSE | 2025 | Guanajuato Drivers License | ### Guerrero | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :-------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 1985 | Guerrero Drivers License (Juan R. Escudero) | | DriversLicense | DRIVERS_LICENSE | 1896 | Guerrero Drivers License (Tecoanapa) | | DriversLicense | DRIVERS_LICENSE | 1897 | Guerrero Drivers License (Constitucional de Tixtla) | | DriversLicense | DRIVERS_LICENSE | 1898 | Guerrero Drivers License (Acapulco) | | DriversLicense | DRIVERS_LICENSE | 1900 | Guerrero Driving License (Taxco) | | DriversLicense | DRIVERS_LICENSE | 1901 | Guerrero Driving License (Ixcateopan de Cuauhtemoc) | | DriversLicense | DRIVERS_LICENSE | 1902 | Guerrero Drivers License (Chilpancingo) | | DriversLicense | DRIVERS_LICENSE | 1903 | Guerrero Drivers License (La Union de Isidoro Montes de Oca) | | DriversLicense | DRIVERS_LICENSE | 1904 | Guerrero Drivers License (Chilpancingo) | | DriversLicense | DRIVERS_LICENSE | 1905 | Guerrero Drivers License (Zihuatanejo de Azueta) | | DriversLicense | DRIVERS_LICENSE | 1906 | Guerrero Drivers License (H. Ayuntamiento de Alcozauca) | | DriversLicense | DRIVERS_LICENSE | 1908 | Guerrero Drivers License (H. Ayuntamiento Municipal de Cutzamala de Pinzon) | | DriversLicense | DRIVERS_LICENSE | 1909 | Guerrero Drivers License (Tecpan de Galeana) | | DriversLicense | DRIVERS_LICENSE | 1910 | Guerrero Drivers License (La Unión de Isidoro Montes de Oca) | | DriversLicense | DRIVERS_LICENSE | 1911 | Guerrero Drivers License (Huitzuco) | | DriversLicense | DRIVERS_LICENSE | 1912 | Guerrero Drivers License (H. Ayuntamiento de Apaxtla) | | DriversLicense | DRIVERS_LICENSE | 1914 | Guerrero Drivers License (Pilcaya) | | DriversLicense | DRIVERS_LICENSE | 1915 | Guerrero Drivers License (Zitlala) | | DriversLicense | DRIVERS_LICENSE | 1916 | Guerrero Drivers License (Ayuntamiento de Zirándaro) | | DriversLicense | DRIVERS_LICENSE | 1919 | Guerrero Drivers License (Hueycantenango) | | DriversLicense | DRIVERS_LICENSE | 1920 | Guerrero Drivers License (General Canuto A. Neri) | | DriversLicense | DRIVERS_LICENSE | 1922 | Guerrero Drivers License (Malinaltepec) | | DriversLicense | DRIVERS_LICENSE | 1925 | Guerrero Drivers License (Chilpancingo de los Bravo) | | DriversLicense | DRIVERS_LICENSE | 1926 | Guerrero Drivers License (Iguala de la Independencia) | | DriversLicense | DRIVERS_LICENSE | 1927 | Guerrero Drivers License (General Heliodoro Castillo) | | DriversLicense | DRIVERS_LICENSE | 1928 | Guerrero Driving License (Taxco) | | DriversLicense | DRIVERS_LICENSE | 1929 | Guerrero Drivers License (Buenavista de Cuéllar) | | DriversLicense | DRIVERS_LICENSE | 1930 | Guerrero Driving License (Copalillo) | | DriversLicense | DRIVERS_LICENSE | 1931 | Guerrero Drivers License (Cocula) | | DriversLicense | DRIVERS_LICENSE | 1932 | Guerrero Driving License (Coyuca de Benitez) | | DriversLicense | DRIVERS_LICENSE | 1934 | Guerrero Drivers License | | DriversLicense | DRIVERS_LICENSE | 1936 | Guerrero Drivers License (Acapulco) | | DriversLicense | DRIVERS_LICENSE | 1943 | Guerrero Drivers License (General Canuto A. Neri) | | DriversLicense | DRIVERS_LICENSE | 1944 | Guerrero Drivers License (H. Ayuntamiento de Alcozauca) | | DriversLicense | DRIVERS_LICENSE | 1948 | Guerrero Drivers License (Malinaltepec) | | DriversLicense | DRIVERS_LICENSE | 1950 | Guerrero Drivers License (Teloloapan) | | DriversLicense | DRIVERS_LICENSE | 1951 | Guerrero Drivers License (Chilpancingo) | | DriversLicense | DRIVERS_LICENSE | 1952 | Guerrero Drivers License (Apaxtla de Castrejon) | | DriversLicense | DRIVERS_LICENSE | 1953 | Guerrero Drivers License (Juan R. Escudero) | | DriversLicense | DRIVERS_LICENSE | 1957 | Guerrero Drivers License (Gral. Canuto A. Neri) | | DriversLicense | DRIVERS_LICENSE | 1959 | Guerrero Drivers License (Municipal Constitucional de Juan R. Escudero) | | DriversLicense | DRIVERS_LICENSE | 1961 | Guerrero Drivers License (Buenavista de Cuellar) | | DriversLicense | DRIVERS_LICENSE | 1962 | Guerrero Drivers License (H. Ayuntamiento de Cuautepec) | | DriversLicense | DRIVERS_LICENSE | 1963 | Guerrero Drivers License (Chilpancingo de los Bravo) | | DriversLicense | DRIVERS_LICENSE | 1967 | Guerrero Drivers License (La Union de Isidoro Montes de Oca) | | DriversLicense | DRIVERS_LICENSE | 1969 | Guerrero Drivers License (Acapulco de Juarez) | | DriversLicense | DRIVERS_LICENSE | 1971 | Guerrero Drivers License (Hueycantenango) | | DriversLicense | DRIVERS_LICENSE | 1973 | Guerrero Drivers License (Malinaltepec) | | DriversLicense | DRIVERS_LICENSE | 1974 | Guerrero Drivers License (Acapulco de Juarez) | | DriversLicense | DRIVERS_LICENSE | 1975 | Guerrero Drivers License (Zihuatanejo de Azueta) | | DriversLicense | DRIVERS_LICENSE | 1976 | Guerrero Drivers License (Malinaltepec) | | DriversLicense | DRIVERS_LICENSE | 1979 | Guerrero Drivers License (Tetipac) | | DriversLicense | DRIVERS_LICENSE | 1980 | Guerrero Drivers License (Tetipac) | | DriversLicense | DRIVERS_LICENSE | 1982 | Guerrero Drivers License (Pilcaya) | | DriversLicense | DRIVERS_LICENSE | 1986 | Guerrero Drivers License (Pedro Ascencio Alquisiras) | | DriversLicense | DRIVERS_LICENSE | 1987 | Guerrero Drivers License (Iliatenco) | | DriversLicense | DRIVERS_LICENSE | 1989 | Guerrero Drivers License (Iguala de la Independencia) | | DriversLicense | DRIVERS_LICENSE | 1990 | Guerrero Drivers License (Iguala de la Independencia) | | DriversLicense | DRIVERS_LICENSE | 1991 | Guerrero Drivers License (Copalillo) | | DriversLicense | DRIVERS_LICENSE | 1992 | Guerrero Drivers License (Copalillo) | | DriversLicense | DRIVERS_LICENSE | 1993 | Guerrero Drivers License (Cocula) | | DriversLicense | DRIVERS_LICENSE | 1994 | Guerrero Drivers License (Chilpancingo) | | DriversLicense | DRIVERS_LICENSE | 1996 | Guerrero Drivers License | | DriversLicense | DRIVERS_LICENSE | 1997 | Guerrero Drivers License (Atlamaljancingo del Monte) | | DriversLicense | DRIVERS_LICENSE | 1998 | Guerrero Drivers License (Atenango del Rio) | | DriversLicense | DRIVERS_LICENSE | 1999 | Guerrero Drivers License (Acapulco de Juarez) | | DriversLicense | DRIVERS_LICENSE | 2000 | Guerrero Drivers License (Acapulco de Juarez) | | DriversLicense | DRIVERS_LICENSE | 2001 | Guerrero Drivers License (Buenavista de Cuellar) | | DriversLicense | DRIVERS_LICENSE | 2002 | Guerrero Drivers License (Pilcaya) | | DriversLicense | DRIVERS_LICENSE | 2003 | Guerrero Drivers License (Tlacoapa) | | DriversLicense | DRIVERS_LICENSE | 2004 | Guerrero Drivers License (Cuetzala del Progreso) | | DriversLicense | DRIVERS_LICENSE | 2005 | Guerrero Drivers License (Buenavista de Cuellar) | | DriversLicense | DRIVERS_LICENSE | 2006 | Guerrero Drivers License (Acapulco de Juarez) | | DriversLicense | DRIVERS_LICENSE | 2007 | Guerrero Drivers License (Tepecoacuilco) | | DriversLicense | DRIVERS_LICENSE | 2008 | Guerrero Drivers License (Cocula) | | DriversLicense | DRIVERS_LICENSE | 2009 | Guerrero Drivers License (Pungarabato) | | DriversLicense | DRIVERS_LICENSE | 2010 | Guerrero Drivers License (Jose Joaquin de Herrera) | | DriversLicense | DRIVERS_LICENSE | 2011 | Guerrero Drivers License (Tetipac) | | DriversLicense | DRIVERS_LICENSE | 2012 | Guerrero Drivers License (Copalillo) | | DriversLicense | DRIVERS_LICENSE | 2013 | Guerrero Drivers License (Gral. Canuto A. Neri) | | DriversLicense | DRIVERS_LICENSE | 2016 | Guerrero Drivers License (Atlamaljancingo del Monte) | | DriversLicense | DRIVERS_LICENSE | 2017 | Guerrero Drivers License (Juchitan) | | DriversLicense | DRIVERS_LICENSE | 2018 | Guerrero Drivers License (Pilcaya) | | DriversLicense | DRIVERS_LICENSE | 2019 | Guerrero Drivers License (Cocula) | | DriversLicense | DRIVERS_LICENSE | 2020 | Guerrero Drivers License (Juchitan) | | DriversLicense | DRIVERS_LICENSE | 2021 | Guerrero Drivers License (Juchitan) | | DriversLicense | DRIVERS_LICENSE | 2022 | Guerrero Drivers License (Juchitan) | | DriversLicense | DRIVERS_LICENSE | 2023 | Guerrero Drivers License (State Drivers License) | | DriversLicense | DRIVERS_LICENSE | 2025 | Guerrero Driving License (Chilpancingo) | | DriversLicense | DRIVERS_LICENSE | 2026 | Guerrero Driving License (Tabasco) | ### Hidalgo | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :---------------------- | | DriversLicense | DRIVERS_LICENSE | 2014 | Hidalgo Drivers License | | DriversLicense | DRIVERS_LICENSE | 2018 | Hidalgo Drivers License | | DriversLicense | DRIVERS_LICENSE | 2019 | Hidalgo Drivers License | | DriversLicense | DRIVERS_LICENSE | 2022 | Hidalgo Drivers License | ### Jalisco | Type of ID | Subtype of ID | Version | Description | | :------------- | :------------- | :------ | :---------------------- | | DriversLicense | DRIVER_LICENSE | 2004 | Jalisco Drivers Licence | | DriversLicense | DRIVER_LICENSE | 2013 | Jalisco Drivers Licence | | DriversLicense | DRIVER_LICENSE | 2017 | Jalisco Drivers Licence | | DriversLicense | DRIVER_LICENSE | 2018 | Jalisco Drivers Licence | | DriversLicense | DRIVER_LICENSE | 2019 | Jalisco Drivers Licence | | DriversLicense | DRIVER_LICENSE | 2020 | Jalisco Drivers Licence | | DriversLicense | DRIVER_LICENSE | 2021 | Jalisco Drivers Licence | | DriversLicense | DRIVER_LICENSE | 2022 | Jalisco Drivers Licence | | DriversLicense | DRIVER_LICENSE | 2024 | Jalisco Drivers License | ### Michoacan | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :------------------------ | | DriversLicense | DRIVERS_LICENSE | 2012 | Michoacan Drivers License | | DriversLicense | DRIVERS_LICENSE | 2017 | Michoacan Drivers License | | DriversLicense | DRIVERS_LICENSE | 2018 | Michoacan Drivers License | | DriversLicense | DRIVERS_LICENSE | 2020 | Michoacan Drivers License | | DriversLicense | DRIVERS_LICENSE | 2022 | Michoacan Drivers License | ### Morelos | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :---------------------- | | DriversLicense | DRIVERS_LICENSE | 2015 | Morelos Drivers License | | DriversLicense | DRIVERS_LICENSE | 2019 | Morelos Drivers License | | DriversLicense | DRIVERS_LICENSE | 2020 | Morelos Driving License | | DriversLicense | DRIVERS_LICENSE | 2024 | Morelos Drivers License | | DriversLicense | DRIVERS_LICENSE | 2025 | Morelos Drivers License | ### Nayarit | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :---------------------- | | DriversLicense | DRIVERS_LICENSE | 2016 | Nayarit Drivers License | | DriversLicense | DRIVERS_LICENSE | 2018 | Nayarit Drivers License | | DriversLicense | DRIVERS_LICENSE | 2019 | Nayarit Drivers License | | DriversLicense | DRIVERS_LICENSE | 2021 | Nayarit Drivers License | ### Nuevo Leon | Type of ID | Subtype of ID | Version | Description | | :------------- | :------------- | :------ | :------------------------- | | DriversLicense | DRIVER_LICENSE | 2016 | Nuevo Leon Drivers License | | DriversLicense | DRIVER_LICENSE | 2017 | Nuevo Leon Drivers License | | DriversLicense | DRIVER_LICENSE | 2018 | Nuevo Leon Drivers License | | DriversLicense | DRIVER_LICENSE | 2020 | Nuevo Leon Drivers License | | DriversLicense | DRIVER_LICENSE | 2021 | Nuevo Leon Drivers License | | DriversLicense | DRIVER_LICENSE | 2022 | Nuevo Leon Drivers License | ### Oaxaca | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :--------------------- | | DriversLicense | DRIVERS_LICENSE | 2018 | Oaxaca Drivers License | | DriversLicense | DRIVERS_LICENSE | 2019 | Oaxaca Drivers License | | DriversLicense | DRIVERS_LICENSE | 2023 | Oaxaca Drivers License | ### Puebla | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :--------------------- | | DriversLicense | DRIVERS_LICENSE | 2014 | Puebla Drivers License | | DriversLicense | DRIVERS_LICENSE | 2015 | Puebla Drivers License | | DriversLicense | DRIVERS_LICENSE | 2016 | Puebla Drivers License | | DriversLicense | DRIVERS_LICENSE | 2018 | Puebla Drivers License | | DriversLicense | DRIVERS_LICENSE | 2019 | Puebla Drivers License | | DriversLicense | DRIVERS_LICENSE | 2020 | Puebla Drivers License | | DriversLicense | DRIVERS_LICENSE | 2023 | Puebla Drivers License | | DriversLicense | DRIVERS_LICENSE | 2024 | Puebla Driving License | | DriversLicense | DRIVERS_LICENSE | 2025 | Puebla Drivers License | | DriversLicense | DRIVERS_LICENSE | 2026 | Puebla Drivers License | ### Queretaro | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :------------------------ | | DriversLicense | DRIVERS_LICENSE | 2015 | Queretaro Drivers License | | DriversLicense | DRIVERS_LICENSE | 2016 | Queretaro Drivers License | | DriversLicense | DRIVERS_LICENSE | 2017 | Queretaro Drivers License | | DriversLicense | DRIVERS_LICENSE | 2022 | Queretaro Drivers License | ### Quintana Roo | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :---------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 1997 | Quintana Roo Drivers License (Felipe Carrillo Puerto) | | DriversLicense | DRIVERS_LICENSE | 1999 | Quintana Roo Drivers License (Felipe Carillo Puerto) | | DriversLicense | DRIVERS_LICENSE | 2000 | Quintana Roo Drivers License | | DriversLicense | DRIVERS_LICENSE | 2001 | Quintana Roo Drivers License | | DriversLicense | DRIVERS_LICENSE | 2002 | Quintana Roo Drivers License (Othon P. Blanco) | | DriversLicense | DRIVERS_LICENSE | 2004 | Quintana Roo Drivers License (Puerto Morelos) | | DriversLicense | DRIVERS_LICENSE | 2006 | Quintana Roo Drivers License (Felipe Carillo Puerto) | | DriversLicense | DRIVERS_LICENSE | 2007 | Quintana Roo Drivers License (Bacalar) | | DriversLicense | DRIVERS_LICENSE | 2009 | Quintana Roo Drivers License (Solidaridad) | | DriversLicense | DRIVERS_LICENSE | 2010 | Quintana Roo Drivers License (Benito Juarez) | | DriversLicense | DRIVERS_LICENSE | 2011 | Quintana Roo Drivers License (Lazaro Cardenas) | | DriversLicense | DRIVERS_LICENSE | 2012 | Quintana Roo Drivers License (Jose Maria Morelos) | | DriversLicense | DRIVERS_LICENSE | 2013 | Quintana Roo Driving License | | DriversLicense | DRIVERS_LICENSE | 2014 | Quintana Roo Drivers License | | DriversLicense | DRIVERS_LICENSE | 2015 | Quintana Roo Drivers License (Tulum) | | DriversLicense | DRIVERS_LICENSE | 2016 | Quintana Roo Drivers License (Cozumel) | | DriversLicense | DRIVERS_LICENSE | 2017 | Quintana Roo Drivers License (Cozumel) | | DriversLicense | DRIVERS_LICENSE | 2018 | Quintana Roo Drivers License (Tulum) | | DriversLicense | DRIVERS_LICENSE | 2019 | Quintana Roo Drivers License (Benito Juarez) | | DriversLicense | DRIVERS_LICENSE | 2020 | Quintana Roo Drivers License (Solidaridad) | | DriversLicense | DRIVERS_LICENSE | 2021 | Quintana Roo Drivers License | | DriversLicense | DRIVERS_LICENSE | 2022 | Quintana Roo Drivers License (Solidaridad) | | DriversLicense | DRIVERS_LICENSE | 2023 | Quintana Roo Drivers License (Puerto Morelos) | | DriversLicense | DRIVERS_LICENSE | 2024 | Quintana Roo Drivers License (Solidaridad) | ### San Luis Potosi | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :------------------------------ | | DriversLicense | DRIVERS_LICENSE | 2017 | San Luis Potosi Drivers License | | DriversLicense | DRIVERS_LICENSE | 2020 | San Luis Potosi Drivers License | | DriversLicense | DRIVERS_LICENSE | 2021 | San Luis Potosi Drivers License | | DriversLicense | DRIVERS_LICENSE | 2025 | San Luis Potosi Drivers License | ### Sinaloa | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :---------------------- | | DriversLicense | DRIVERS_LICENSE | 2010 | Sinaloa Drivers License | | DriversLicense | DRIVERS_LICENSE | 2015 | Sinaloa Drivers License | | DriversLicense | DRIVERS_LICENSE | 2018 | Sinaloa Drivers License | | DriversLicense | DRIVERS_LICENSE | 2019 | Sinaloa Drivers License | ### Sonora | Type of ID | Subtype of ID | Version | Description | | :------------- | :------------- | :------ | :--------------------- | | DriversLicense | DRIVER_LICENSE | 2015 | Sonora Drivers License | | DriversLicense | DRIVER_LICENSE | 2016 | Sonora Drivers License | | DriversLicense | DRIVER_LICENSE | 2022 | Sonora Drivers License | ### Tabasco | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :---------------------- | | DriversLicense | DRIVERS_LICENSE | 2013 | Tabasco Drivers License | | DriversLicense | DRIVERS_LICENSE | 2020 | Tabasco Drivers License | | DriversLicense | DRIVERS_LICENSE | 2021 | Tabasco Drivers License | ### Tamaulipas | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :------------------------- | | DriversLicense | DRIVERS_LICENSE | 2019 | Tamaulipas Drivers License | | DriversLicense | DRIVERS_LICENSE | 2020 | Tamaulipas Drivers License | | DriversLicense | DRIVERS_LICENSE | 2021 | Tamaulipas Drivers License | | DriversLicense | DRIVERS_LICENSE | 2022 | Tamaulipas Drivers License | ### Tlaxcala | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :----------------------- | | DriversLicense | DRIVERS_LICENSE | 2019 | Tlaxcala Drivers License | | DriversLicense | DRIVERS_LICENSE | 2022 | Tlaxcala Drivers License | ### Veracruz | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :----------------------- | | DriversLicense | DRIVERS_LICENSE | 2016 | Veracruz Drivers License | | DriversLicense | DRIVERS_LICENSE | 2017 | Veracruz Drivers License | | DriversLicense | DRIVERS_LICENSE | 2018 | Veracruz Drivers License | | DriversLicense | DRIVERS_LICENSE | 2019 | Veracruz Drivers License | | DriversLicense | DRIVERS_LICENSE | 2022 | Veracruz Drivers License | | DriversLicense | DRIVERS_LICENSE | 2025 | Veracruz Drivers License | | DriversLicense | DRIVERS_LICENSE | 2026 | Veracruz Drivers License | ### Yucatan | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :---------------------- | | DriversLicense | DRIVERS_LICENSE | 2018 | Yucatan Drivers License | ### Zacatecas | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :------------------------ | | DriversLicense | DRIVERS_LICENSE | 2014 | Zacatecas Drivers License | | DriversLicense | DRIVERS_LICENSE | 2015 | Zacatecas Drivers License | | DriversLicense | DRIVERS_LICENSE | 2017 | Zacatecas Drivers License | | DriversLicense | DRIVERS_LICENSE | 2018 | Zacatecas Drivers License | ## United Nations (UNO) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :--------------------------- | :------ | :--------------------------- | | ALL | Military | MILITARY_CARD | 2020 | Military Card | | ALL | IdentificationCard | UNHCR_CARD | 2022 | UNHCR Card | | ALL | IdentificationCard | UNHCR_CARD | 2023 | UNCHR Card | | ALL | IdentificationCard | UNHCR_CARD | 2024 | UNCHR Card | | ALL | DriversLicense | DRIVING_PERMIT | 2022 | Driving Permit | | ALL | DriversLicense | INTERNATIONAL_DRIVING_PERMIT | 2024 | International Driving Permit | | ALL | TravelDocument | LAISSEZ_PASSER | 2022 | Laissez Passer | | ALL | TravelDocument | LAISSEZ_PASSER | 2023 | Laissez Passer | | ALL | Passport | PASSPORT | 2012 | Laisses-Passer (Passport) | ## USA (USA) ### All States | Type of ID | Subtype of ID | Version | Description | | :------------------- | :---------------------------------- | :------ | :--------------------------------------------------------------------------------------------- | | TribalIdentification | ENHANCED_TRIBAL_IDENTIFICATION_CARD | 2025 | Enhanced Tribal Identification Card | | TribalIdentification | ENHANCED_TRIBAL_IDENTIFICATION_CARD | 2026 | Enhanced Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1827 | Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1828 | Iipay Nation of Santa Ysabel Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1829 | Native Village of Kotlik Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1830 | Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1831 | Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1832 | Narragansett Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1833 | Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1834 | Tribel Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1845 | Northern Arapaho Tribe of Wyoming Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1849 | Chemehuevi Indian Tribe | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1851 | Susanville Indian Rancheria | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1852 | Association Of Village Council Presidents Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1854 | Moak Tribe Of Western Shoshone Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1855 | Picayune Ranceria of the Chukchansi Indians Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1857 | Kickapoo Traditional Tribe Of Texas Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1859 | Apache Tribe Of Oklahoma Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1862 | Eastern Shoshone Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1967 | Ho-Chunk Nation Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1968 | Kalispel Tribe Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1969 | Cyrene Marie Red Elk Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1871 | Redding Rancheria Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1872 | Seminole Tribe of Florida Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1877 | Spirit Lake Tribal Membership Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1879 | The San Carlos Apache Tribe Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1897-98 | Stillaguamish Tribe Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1898 | Yurok Tribe Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1899 | Mashantucket Pequot Tribal Nation Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1900 | Central Council of the Tlingit and Haida Indian Tribes of Alaska Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1903 | Ute Indian Tribe Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1904 | Nottawaseppi Huron Band of the Potawatomi Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1908 | Native Village of Point Hope Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1909 | Quartz Valley Indian Reservation Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1914 | White Mountain Apache Tribe Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1916 | Native Village of Ouzinkie Tribal ID | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1918 | Nez Perce Tribe Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1919 | Fond Du Lac Band of Lake Superior Chippewa Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1920 | Winnebago Tribe of Nebraska Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1921 | Native Village of Kotzebue Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1922 | Bear River Band of Rohnerville Rancheria Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1923 | White Earth Reservation Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1924 | Pueblo of Laguna Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1925 | Quinault Indian Nation Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1926 | The Klamath Tribe Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1927 | Traditional Village of Togiak Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1928 | Shakopee Mdewakanton Sioux Community Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1929 | Little Traverse Bay Bands of Odawa Indians Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1930 | Eastern Band of Cherokee indians Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1932 | Cowlitz Indian Tribe Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1933 | Yavapai - Apache Nation Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1934 | Comanche Nation Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1937 | Grand Traverse Band of Ottawa and Chippewa Indians Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1943 | Lummi Nation Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1948 | Native Village of Eyak Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1949 | Sitka Tribe of Alaska Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1950 | Saint Regis Mohawk Tribe Identity Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1951 | Choctaw Nation of Oklahoma Tribal Identity Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1952 | Alabama - Coushatta Tribe Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1958 | Fort Peck Sioux Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1960 | Ute Mountain Ute Tribe Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1961 | Lummi Nation Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1964 | The Tulalip Tribe Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1965 | Oneida Nation Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1966 | Seneca Nation of Indians Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1967 | Quechan Tribe Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1969 | North Fork Rancheria of Mono Indians of California Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1972 | Fort Belknap Indian Community Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1973 | The Shoshone - Bannock Tribes Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1974 | Enhanced Tribal Identification Card (The Confederated Salish and Kootenai Tribes) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1975 | Lac Courte Oreilles Tribal Membership Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1976 | Tribal Identification Card (Three Affiliated Tribes of the Fort Berthold Reservation) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1977 | Tribal Membership Identification Card (Bishop Paiute Tribe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1978 | Tribal Identification Card (Muckleshoot Indian Tribe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1979 | Pascua Yaqui Tribe Membership Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1980 | Tribal Identification Card (Northern Cheyenne Tribe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1981 | Tribal Identification Card (Muscogee - Creek Nation Citizenship ID) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1984 | Tribal Identification Card (Northern Arapaho Tribe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1985 | Tribal Identification Card (Rosebud Sioux Tribe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1986 | Tribal Identification Card (Mescalero Apache Tribe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1987 | Tribal Identification Card (Confederated Tribes and Bands of the Yakama Nation) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1988 | Tribal Identification Card (Assiniboine and Sixous Tribes) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1989 | Cheyenne and Arapaho Tribes Membership Identification | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1990 | Tribal Identification Card (Lac Vieux Desert Band of Lake Superior Chippewa) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1992 | Lower Brule Sioux Tribal Member Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1993 | Tribal Membership Identification Card (Tonka Tribe of Oklahoma) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1994 | Lower Elwha Klallam Tribe Membership Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1995 | Tribal Identification Card (Kiowa Tribe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1996 | White Earth Reservation Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1997 | Santee Sioux Nation Tribal Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1998 | Tribal Identification Card (St. Croix Chippewa of Wisconsin Tribe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 1999 | Tribal Identification Card (Citizen Potawatomi Nation) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2000 | Tribal Identification Card (Sac and Fox Nation) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2001 | Official Membership ID Card (Oglala Sioux Tribe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2003 | Tribal Identification Card (Coeur D'Alene Tribe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2004 | Tribal Identification Card (Salt River Pima-Maricopa Indian Community) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2005 | Tribal Identification Card (Citizen of the Cherokee Nation) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2006 | Tribal Enrollment Identification Card (Chippewa Cree Tribe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2007 | Tribal Identification Card (Turtle Mountain Band of Chippewa Indians) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2008 | Official Tribal Identification Card of Leech Lake Band of Ojibwe | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2009 | Tribal Identification Card (Red Lake Band of Chippewa Indians) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD_UNDER21 | 2009 | Reno Sparks Indian Colony Tribal Identification Card (Under 21) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2010 | Tribal Identification Card (Mississippi Band of Choctaw Indians) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD_UNDER21 | 2010 | Three Affiliated Tribes of the Fort Berthold Reservation Tribal Identification Card (Under 21) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2016 | Tribal Identification Card (The Blackfeet Nation) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2017 | Muscogee (Creek) Nation Citizenship ID | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2018 | Bois Forte Band of Chippewa Membership Identification | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2019 | Tribal Identification Card (Sisseton-Wahpeton Oyate Tribe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2020 | Tribal Identification Card (Omaha Tribe of Nebraska) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2021 | Crow Tribal Membership Identification | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD_UNDER21 | 2016 | Hoopa Valley Tribal Minor Identification Card (Under 21) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD_UNDER21 | 2017 | Ute Indian Tribe Minor Identification Card (Under 21) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD_UNDER21 | 2021 | Bear River Band of Rohnerville Rancheira Tribal Identity Card (Under 21) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2022 | Tribal Identification Card (Mille Lacks Band of Ojibwe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2023 | Tribal Identification Card (Standing Rock Sioux Tribe) | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2024 | Menominee Tribe of Wisconsin Identification Card | | TribalIdentification | TRIBAL_IDENTIFICATION_CARD | 2025 | Native Village of Savoonga Tribal Identification Card | | DriversLicense | FOREIGN_DRIVERS_LICENSE | 2022 | Foreign Driver License | | Passport | NATIONAL_PASSPORT | 2006 | Passport | | Passport | NATIONAL_PASSPORT | 2020 | Passport | | Passport | NATIONAL_PASSPORT | 2021 | Passport | | Passport | NATIONAL_PASSPORT | 2022 | Passport | | ResidenceDocument | PERMANENT_RESIDENCE_CARD | 2017 | Permanent Residence Card | | TravelDocument | GLOBAL_ENTRY | 2008 | Global Entry Card | | TravelDocument | NEXUS | 2008 | NEXUS Card | | TravelDocument | SENTRI | 2008 | SENTRI Card | | TravelDocument | FASTEXPRES | 2008 | FAST/EXPRESS Card | | Other | BIRTH_CERTIFICATE | 2010 | Certificate of Live Birth | | Other | BIRTH_CERTIFICATE | 2011 | Birth Certificate | | MedicalCard | SOCIAL_SECURITY_CARD | 2016 | Social Security Card | ### Alabama | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2005 | Alabama Driver License / Vessel License / FN Vessel License / FN Commercial Driver License / FN Driver License / FN Nonresident Vessel License / Nonresident Vessel License | | DriversLicense | DRIVERS_LICENSE | 2010 | Alabama Driver License / Commercial Driver License | | DriversLicense | LEARNERS_PERMIT | 2010 | Alabama Learner's Permit | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2010 | Alabama Driver License (Under 21) / Graduated Driver License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2005 | Alabama Nondriver Identification Card / FN Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2010 | Alabama Nondriver Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2010 | Alabama Nondriver Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2010 | Alabama Firearms License | ### Alaska | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------------------- | :------ | :--------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2014 | Alaska Driver License / Commercial License / Driver - Motorcycle License | | DriversLicense | DRIVERS_LICENSE | 2019 | Alaska Driver License / Commercial Driver's License / CDL & Motorcycle License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2014 | Alaska Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2019 | Alaska Driver License (Under 21) / Commercial Driver's License (Under 21)  / CDL & Motorcycle License (Under 21) | | DriversLicense | DRIVERS_LICENSE | 2025 | Alaska Driver License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2025 | Alaska Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2019 | Alaska Driver Permit / Commercial Learner's Permit | | DriversLicense | LEARNERS_PERMIT | 2025 | Alaska Driver Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2019 | Alaska Driver Permit (Under 21) / Commercial Learner's Permit (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2019 | Alaska Provisional Driver License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2014 | Alaska Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2019 | Alaska Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2019 | Alaska Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2025 | Alaska Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2025 | Alaska Identification Card (Under 21) | IdentificationCard | CITY_IDENTIFICATION_CARD | 2023 | Alaska City Identification Card | | | Other | FIREARMS_LICENSE | 2020 | Alaska Concealed Handgun Permit | ### Arizona | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2001 | Arizona Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2014 | Arizona Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2023 | Arizona Driver License / Commercial Driver License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2001 | Arizona Driver License (Under 21) / Graduated Driver License (Under 21) / Commercial Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2014 | Arizona Driver License (Under 21) / Graduated Driver License (Under 21) / Commercial Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2023 | Arizona Driver License (Under 21) / Graduated Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2001 | Arizona Instruction Permit | | DriversLicense | LEARNERS_PERMIT | 2014 | Arizona Instruction Permit | | DriversLicense | LEARNERS_PERMIT | 2023 | Arizona Instruction Permit / Limited - Term Instruction Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2001 | Arizona Instruction Permit (Under 21) / Graduated Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2014 | Arizona Instruction Permit (Under 21) / Graduated Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2023 | Arizona Instruction Permit (Under 21) / Graduated Instruction Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2001 | Arizona Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2014 | Arizona Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2023 | Arizona Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2001 | Arizona Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2014 | Arizona Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2023 | Arizona Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2020 | Arizona Concealed Weapons Permit | ### Arkansas | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :----------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2011 | Arkansas Driver's License / Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE | 2018 | Arkansas Driver's License / Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2011 | Arkansas Driver's License (Under 21) / Commercial Driver's License (Under 21) / Intermediate Driver's License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2018 | Arkansas Driver's License (Under 21) / Commercial Driver's License (Under 21) / Intermediate Driver's License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2006 | Arkansas Non Driver Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2011 | Arkansas Non - Driver's Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2018 | Arkansas Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2015 | Arkansas Non - Driver's Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | Arkansas Identification Card (Under 21) | | Other | ENHANCED_FIREARMS_LICENSE | 2020 | Arkansas Concealed Handgun Carry License | ### California | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------------------- | :------ | :-------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2000 | California Driver License | | DriversLicense | DRIVERS_LICENSE | 2010 | California Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2018 | California Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2025 | California Driver License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2000 | California Driver License (Under 21) / Commercial Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2010 | California Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2018 | California Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2025 | California Driver License (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2010 | California Provisional Driver License (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2018 | California Provisional Driver License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2000 | California Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2010 | California Identification Card / Senior Citizen Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2018 | California Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2025 | California Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | California Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2025 | California Identification Card (Under 21) | IdentificationCard | CITY_IDENTIFICATION_CARD | 2018 | San Francisco City ID Card | IdentificationCard | CITY_IDENTIFICATION_CARD | 2024 | San Francisco City ID Card | | | Other | FIREARMS_LICENSE | 2009 | California License to Carry Concealed Pistol, Revolver or other Firearm | | Other | FIREARMS_LICENSE | 2025 | California Firearms License | ### Colorado | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :------------------------------------------------------------------------------------------------ | | DriversLicense | DRIVERS_LICENSE | 2014 | Colorado Driver License / Commercial Driver License / Restricted License / Probationary License / | | DriversLicense | DRIVERS_LICENSE | 2016 | Colorado Driver License / Commercial Driver License / Restricted Driver License | | DriversLicense | DRIVERS_LICENSE | 2020 | Colorado Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2022 | Colorado Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2016 | Colorado Driver License (Under 21) / Restricted Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2020 | Colorado Driver License (Under 21) / Commercial Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2022 | Colorado Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2014 | Colorado Instruction Permit / Restricted Permit | | DriversLicense | LEARNERS_PERMIT | 2016 | Colorado Instruction Permit / Restricted Permit | | DriversLicense | LEARNERS_PERMIT | 2020 | Colorado Instruction Permit / Commercial Learner Permit | | DriversLicense | LEARNERS_PERMIT | 2022 | Colorado Instruction Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2016 | Colorado Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2020 | Colorado Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2022 | Colorado Instruction Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2014 | Colorado Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2016 | Colorado Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2020 | Colorado Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2022 | Colorado Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2016 | Colorado Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2019 | Colorado Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2022 | Colorado Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2010 | Colorado Concealed Handgun Permit | | Other | FIREARMS_LICENSE | 2020 | Colorado Concealed Handgun Permit | ### Connecticut | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :---------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2011 | Connecticut Driver License / Commercial Driver License / Commercial Driver Instruction Permit | | DriversLicense | DRIVERS_LICENSE | 2017 | Connecticut Driver License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2011 | Connecticut Driver License (Under 21) / Motorcycle Permit (Under 21) / Commercial Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2017 | Connecticut Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2011 | Connecticut Adult Learner Permit | | DriversLicense | LEARNERS_PERMIT | 2017 | Connecticut Adult Learner Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2011 | Connecticut Learner Permit (Under 21) / Adult Learner Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2017 | Connecticut Learner Permit (Under 21) / Adult Learner Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2011 | Connecticut Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2017 | Connecticut Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2011 | Connecticut Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2017 | Connecticut Identification Card (Under 21) | IdentificationCard | CITY_IDENTIFICATION_CARD | 2020 | Connecticut Park City Resident Card | | | Other | FIREARMS_LICENSE | 2010 | Connecticut Permit to Carry Pistols and Revolvers | ### Delaware | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :---------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2010 | Delaware Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2018 | Delaware Driver License / Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2010 | Delaware Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2018 | Delaware Driver License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2010 | Delaware Non-Driver Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2018 | Delaware Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2010 | Delaware Non-Driver Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | Delaware Identification Card (Under 21) | | Other | BIRTH_CERTIFICATE | 2020 | Delaware Birth Certificate | ### District Of Columbia | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :-------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2002 | Washington, D.C. Driver's License / Commercial Driver's License / Learner's Permit / CDL Learner's Permit | | DriversLicense | DRIVERS_LICENSE | 2023 | Washington, DC Driver License | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2023 | Washington DC Learner Permit | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE | 2023 | Washington DC Provisional Driver License | | DriversLicense | LEARNERS_PERMIT | 2023 | Washington, DC Learner Permit | | DriversLicense | DRIVERS_LICENSE | 2017 | Washington, DC Driver License / Temporary Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2017 | Washington, DC Driver License (Under 21) / Temporary Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2017 | Washington, DC Learner Permit (Under 21) / Temporary Learner Permit (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE | 2017 | Washington, DC Provisional Driver License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2013 | District of Columbia Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2017 | Washington, DC Identification Card / Temporary Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2023 | Washington, DC Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2013 | District of Columbia Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2017 | Washington, DC Identification Card (Under 21)  / Temporary Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2023 | Washington, DC Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2010 | District of Columbia Concealed Carry Pistol License | ### Florida | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------------ | :------ | :------------------------------------------------------------------ | | DriversLicense | DRIVERS_LICENSE | 2004 | Florida Driver License / Learner License / CDL | | DriversLicense | DRIVERS_LICENSE | 2017 | Florida Driver License / CDL | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2004 | Florida Driver License (Under 21) / CDL (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2017 | Florida Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2004 | Florida Learner License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2017 | Florida Learner's License / Learner's Permit / CDL Learner's Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2017 | Florida Learner's License (Under 21) | | DriversLicense | TEMPORARY_DRIVERS_LICENSE | 2017 | Florida Temporary Driver License | | DriversLicense | TEMPORARY_LEARNERS_PERMIT | 2017 | Florida Temporary Learner's License | | IdentificationCard | IDENTIFICATION_CARD | 1999 | Florida Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2013 | Florida Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2017 | Florida Identification Card | | IdentificationCard | TEMPORARY_IDENTIFICATION_CARD | 2017 | Florida Temporary Identification Card | | IdentificationCard | TEMPORARY_IDENTIFICATION_CARD_UNDER21 | 2017 | Florida Temporary Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2013 | Florida Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2017 | Florida Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2020 | Florida Concealed Weapon or Firearm License | | Other | FIREARMS_LICENSE | 2025 | Statewide Firearm License | ### Georgia | Type of ID | Subtype of ID | Version | Description | | :------------------ | :---------------------------------- | :------ | :-------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2012 | Georgia Driver's License / Limited - Term Driver's License / Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE | 2019 | Georgia Driver's License / Limited - Term Driver's License / Commercial Driver's License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2012 | Georgia Driver's License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2019 | Georgia Driver's License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2012 | Georgia DL Instructional Permit / Commercial Learner's Permit | | DriversLicense | LEARNERS_PERMIT | 2019 | Georgia DL Instructional Permit / CDL Instructional Permit / Limited - Term DL Instructional Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2012 | Georgia DL Instructional Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2019 | Georgia DL Instructional Permit (Under 21)  /  Limited - Term DL Instructional Permit (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE | 2012 | Georgia Provisional Driver's License | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2019 | Georgia Provisional Driver's License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2012 | Georgia Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2019 | Georgia Identification Card / Limited - Term Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2012 | Georgia Identification Card (Under 21) / ID for Voting Purpose | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2019 | Georgia Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2020 | Georgia Weapons Carry License | | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2022 | Georgia Voter Identification Card | ### Guam | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :----------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2017 | Guam Driver's License | | DriversLicense | DRIVERS_LICENSE | 2019 | Guam Driver's License | | DriversLicense | DRIVERS_LICENSE | 2020 | Guam Driver's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2019 | Guam Driver's License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2020 | Guam Driver's License (Under 21) / Intermediate License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2016 | Guam Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2020 | Guam Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | Guam Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2019 | Guam Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2021 | Guam Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2010 | Guam Firearm Identification Card | ### Hawaii | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------------------- | :------ | :--------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2015 | Hawaii Driver License | | DriversLicense | DRIVERS_LICENSE | 2021 | Hawaii Limited Purpose Driver License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2009 | Hawaii Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2009 | Hawaii Driver License - PERMIT | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2009 | Hawaii Driver License - PERMIT (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2009 | Hawaii Driver License - PROVISIONAL (Under 21) | | DriversLicense | DRIVERS_LICENSE | 2026 | Hawaii Driver License | | IdentificationCard | IDENTIFICATION_CARD | 2015 | Hawaii Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2014 | Hawaii Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2026 | Hawaii Identification Card | ### Idaho | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2011 | Idaho Driver's License | | DriversLicense | DRIVERS_LICENSE | 2016 | Idaho Driver's License | | DriversLicense | DRIVERS_LICENSE | 2023 | Idaho Driver's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2011 | Idaho Driver's License (Under 21) / Commercial Driver's License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2016 | Idaho Driver's License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2023 | Idaho Driver's License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2016 | Idaho Instruction Permit | | DriversLicense | LEARNERS_PERMIT | 2023 | Idaho Instruction Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2016 | Idaho Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2023 | Idaho Instruction Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2011 | Idaho Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2018 | Idaho Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2023 | Idaho Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | Idaho Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2023 | Idaho Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2013 | Idaho Concealed Weapons License | | Other | FIREARMS_LICENSE | 2016 | Idaho Concealed Weapons License | | Other | ENHANCED_FIREARMS_LICENSE | 2023 | Idaho Enhanced Concealed Weapons License | ### Illinois | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :----------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2007 | Illinois Driver's License / CDL | | DriversLicense | DRIVERS_LICENSE | 2016 | Illinois Driver's License | | DriversLicense | DRIVERS_LICENSE | 2020 | Illinois Driver's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2016 | Illinois Driver's License (Under 21) / TVDL (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2007 | Illinois ID Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2007 | Illinois ID Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2016 | Illinois Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2020 | Illinois Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2016 | Illinois Identification Card (Under 21) | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2000 | City of Chicago Identification Card (Illinois) | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2020 | City of Chicago Identification Card (Illinois) | Other | FIREARMS_LICENSE | 2010 | Illinois Concealed Carry License | | Other | FIREARMS_LICENSE | 2024 | Illinois Firearm Owner's Identification Card | ### Indiana | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2010 | Indiana Operator License / Commercial Driver's License / DUP Operator Driver License / Motorcycle Only License / Amend Commercial Driver License / Chauffeur License | | DriversLicense | DRIVERS_LICENSE | 2019 | Indiana Operator License / Commercial Driver's License / Driver's License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2019 | Indiana Driver's License (Under 21) / Operator License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2019 | Indiana Learner Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2010 | Indiana Learner Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2019 | Indiana Learner Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2010 | Indiana Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2019 | Indiana Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2010 | Indiana Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2019 | Indiana Identification Card (Under 21) | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2020 | City of Union / City Municipal Identification Card | | Other | FIREARMS_LICENSE | 2020 | Indiana License to Carry Handgun | ### Iowa | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2013 | Iowa Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2018 | Iowa Driver License / Limited - Term Driver License / Commercial Driver License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2013 | Iowa Driver License (Under 21) / Commercial Driver License (Under 21) / Intermediate Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2018 | Iowa Driver License (Under 21) / Commercial Driver License (Under 21) / Intermediate Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2018 | Iowa Limited - Term Instruction Permit / Instruction Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2013 | Iowa Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2018 | Iowa Instruction Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2005 | Iowa Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2013 | Iowa Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2018 | Iowa Identification Card / Limited - Term Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2013 | Iowa Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | Iowa Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2013 | Iowa Non - Professional Permit to carry weapons | ### Kansas | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :----------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2004 | Kansas Driver's License / CDL | | DriversLicense | DRIVERS_LICENSE | 2012 | Kansas Driver's License / Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE | 2017 | Kansas Driver's License / Commercial Driver's License / Learner's Permit / Commercial Learner's Permit | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2012 | Kansas Driver's License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2017 | Kansas Driver's License / Commercial Driver's License (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2017 | Kansas Learner's Permit (Under 21) / Commercial Learner's Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2012 | Kansas Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2018 | Kansas Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2012 | Kansas Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2017 | Kansas Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2017 | Kansas Concealed Carry License | ### Kentucky | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------------------- | :------ | :----------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2004 | Kentucky Hardship Driver's License / Kentucky Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE | 2012 | Kentucky Driver's License / Kentucky Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE | 2019 | Kentucky Driver's License / Kentucky Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2012 | Kentucky Driver's License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2019 | Kentucky Driver's License (Under 21) / Commercial Driver's License Limited - Term | | DriversLicense | LEARNERS_PERMIT | 2011 | Kentucky Instruction Permit | | DriversLicense | LEARNERS_PERMIT | 2019 | Kentucky Instruction Permit / Commercial Learner's Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2012 | Kentucky Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2019 | Kentucky Instruction Permit (Under 21)  / Commercial Driver's License Limited - Term | | IdentificationCard | IDENTIFICATION_CARD | 2012 | Kentucky Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2019 | Kentucky Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2012 | Kentucky Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2019 | Kentucky Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_VALID_WITHOUT_PHOTO | 2019 | Kentucky Identification Card (valid without photo) | | Other | FIREARMS_LICENSE | 2009 | Kentucky Concealed Deadly Weapons License | ### Louisiana | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :----------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2001 | Louisiana Personal Driver's License | | DriversLicense | DRIVERS_LICENSE | 2013 | Louisiana Personal Driver's License / Chauffeur's License / Commercial License | | DriversLicense | DRIVERS_LICENSE | 2015 | Louisiana Personal Driver's License / Chauffeur's License / Commercial License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2015 | Louisiana Personal Driver's License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2015 | Louisiana Temporary Instructional Permit / Commercial Learner's Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2015 | Louisiana Temporary Instructional Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2013 | Louisiana Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2015 | Louisiana Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2015 | Louisiana Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2020 | Louisiana Concealed Handgun Permit | | Other | FIREARMS_LICENSE | 2025 | Louisiana Concealed Handgun Permit | ### Maine | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2011 | Maine Driver's License / CDL Operator | | DriversLicense | DRIVERS_LICENSE | 2019 | Maine Driver's License / Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2011 | Maine Driver's License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2019 | Maine Driver's License (Under 21) / Commercial Driver's License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2011 | Maine Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2019 | Maine Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2011 | Maine Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2019 | Maine Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2010 | Maine Permit to Carry Concealed Firearms | ### Mariana Islands | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------- | :------ | :---------------------------------------------------------------------- | | IdentificationCard | IDENTIFICATION_CARD | 2014 | Mariana Islands Identification Card | IdentificationCard | CITY_IDENTIFICATION_CARD | 2025 | Municipality of Saipan Identification Card | | | DriversLicense | DRIVERS_LICENSE | 2020 | Mariana Islands Driver License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2020 | Mariana Islands Driver License (Under 21) / Driver License Limited Term | | Other | DRIVERS_LICENSE | 2023 | Mariana Islands Driver's License | | Other | DRIVERS_LICENSE_UNDER21 | 2025 | Mariana Islands Driver's License (Under 21) | ### Maryland | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------------------- | :------ | :---------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2002 | Maryland Driver's License / Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE | 2016 | Maryland Driver's License / Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2016 | Maryland Driver's License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2002 | Maryland Learner's Instructional Permit / Moped Operator's Permit | | DriversLicense | LEARNERS_PERMIT | 2017 | Maryland Learner's Instructional Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2016 | Maryland Learner's Instructional Permit (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE | 2002 | Maryland Provisional Driver's License | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE | 2017 | Maryland Provisional Driver's License | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2016 | Maryland Provisional Driver's License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2002 | Maryland Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2016 | Maryland Identification Card / Limited Term Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2002 | Maryland Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2016 | Maryland Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2020 | Maryland Handgun Permit | ### Massachusetts | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------- | :------ | :----------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2010 | Massachusetts Driver's License / Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE | 2016 | Massachusetts Driver's License / Commercial Driver's License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2010 | Massachusetts Under 21 Driver's License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2016 | Massachusetts Under 21 Driver's License | | DriversLicense | JUNIOR_OPERATORS_LICENSE_UNDER21 | 2010 | Massachusetts Junior Operator's License (Under 21) | | DriversLicense | JUNIOR_OPERATORS_LICENSE_UNDER21 | 2016 | Massachusetts Junior Operator's License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2004 | Massachusetts Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2005 | Massachusetts Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2010 | Massachusetts Identification Card / Liquor ID Card | | IdentificationCard | IDENTIFICATION_CARD | 2016 | Massachusetts Identification Card / Liquor ID Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2004 | Massachusetts Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2016 | Massachusetts Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2009 | Massachusetts License to Carry Firearms | ### Michigan | Type of ID | Subtype of ID | Version | Description | | :----------------- | :----------------------------------- | :------ | :---------------------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2011 | Michigan Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2024 | Michigan Driver's License / Chauffeur's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2011 | Michigan Driver License (Under 21)  / Commercial Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2024 | Michigan Driver's License (Under 21) | | DriversLicense | ENHANCED_DRIVERS_LICENSE | 2011 | Michigan Enhanced Driver License / Enhanced Chauffeur License / Enhanced Commercial Driver License | | DriversLicense | ENHANCED_DRIVERS_LICENSE | 2024 | Michigan Enhanced Driver's License / Enhanced Chauffeur's License | | DriversLicense | ENHANCED_DRIVERS_LICENSE_UNDER21 | 2011 | Michigan Enhanced Driver License (Under 21) / Enhanced Chauffeur License (Under 21) / Enhanced Commercial Driver License (Under 21) | | DriversLicense | ENHANCED_DRIVERS_LICENSE_UNDER21 | 2024 | Michigan Enhanced Driver's License (Under 21) | | DriversLicense | ENHANCED_LEARNERS_PERMIT_UNDER21 | 2011 | Michigan Enhanced Graduated Driver License (Under 21) | | IdentificationCard | ENHANCED_IDENTIFICATION_CARD | 2011 | Michigan Enhanced Identification Card | | IdentificationCard | ENHANCED_IDENTIFICATION_CARD_UNDER21 | 2024 | Michigan Enhanced Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2011 | Michigan Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2024 | Michigan Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2011 | Michigan Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2024 | Michigan Identification Card (Under 21) | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2025 | City of Detroit Municipal ID Card | | Other | FIREARMS_LICENSE | 2024 | Michigan Concealed Pistol License | ### Minnesota | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------------------- | :------ | :------------------------------------------------------------------------------------------------------------ | | DriversLicense | DRIVERS_LICENSE | 2004 | Minnesota Driver's License / Driver's License Commercial / Motorized Bicycle | | DriversLicense | DRIVERS_LICENSE | 2018 | Minnesota Driver's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2004 | Minnesota Driver's License (Under 21) / Driver's License Commercial (Under 21) / Motorized Bicycle (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2018 | Minnesota Driver's License (Under 21) | | DriversLicense | ENHANCED_DRIVERS_LICENSE | 2018 | Minnesota Enhanced Driver's License | | DriversLicense | ENHANCED_DRIVERS_LICENSE_UNDER21 | 2018 | Minnesota Enhanced Driver's License (Under 21) | | DriversLicense | ENHANCED_LEARNERS_PERMIT | 2018 | Minnesota Enhanced Instruction Permit | | DriversLicense | ENHANCED_PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2018 | Minnesota Enhanced Provisional Driver's License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2018 | Minnesota Instruction Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2004 | Minnesota Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2018 | Minnesota Instruction Permit (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2018 | Minnesota Provisional Driver's License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2004 | Minnesota Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2018 | Minnesota Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2004 | Minnesota Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | Minnesota Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2020 | Minnesota Permit to Carry a Pistol | ### Mississippi | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :------------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2001 | Mississippi Driver License / Commercial License | | DriversLicense | DRIVERS_LICENSE | 2016 | Mississippi Driver License / Commercial Driver License / Light Commercial Driver License / Non-US Citizen Driver License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2024 | Mississippi Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2001 | Mississippi Driver License (Under 21) / Commercial License (Under 21) /  Non-US Citizen Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2016 | Mississippi Driver License (Under 21) / Commercial Driver License (Under 21)  / Light Commercial Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2016 | Mississippi Learner's Permit / Commercial Learner's Permit / Non-US Citizen Commercial Learner's Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2001 | Mississippi Learner's Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2016 | Mississippi Learner's Permit (Under 21) / Restricted Learner's Permit (Under 21) / Commercial Learner's Permit (Under 21) | | DriversLicense | DRIVERS_LICENSE | 2024 | Mississippi Driver License | | DriversLicense | LEARNERS_PERMIT | 2024 | Mississippi Learner's Permit | | IdentificationCard | IDENTIFICATION_CARD | 2001 | Mississippi Identification Card / Non-US Citizen Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2016 | Mississippi Identification Card / Person with disabilities Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2024 | Mississippi Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2001 | Mississippi Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2016 | Mississippi Identification Card (Under 21) / Person with disabilities Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2024 | Mississippi Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2010 | Mississippi Firearms Permit | | Other | FIREARMS_LICENSE | 2020 | Mississippi Firearms Permit | | Other | FIREARMS_LICENSE | 2024 | Mississippi Firearms Permit | ### Missouri | Type of ID | Subtype of ID | Version | Description | | :----------------- | :----------------------------------- | :------ | :------------------------------------------------------------------------ | | DriversLicense | DRIVERS_LICENSE | 2003 | Missouri Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2012 | Missouri Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2020 | Missouri Driver License / Commercial Driver License / Non-Domiciled CDL | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2012 | Missouri Driver License (Under 21) / Commercial Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2020 | Missouri Driver License (Under 21) | | DriversLicense | INTERMEDIATE_DRIVERS_LICENSE_UNDER21 | 2012 | Missouri Intermediate Driver License (Under 21) | | DriversLicense | INTERMEDIATE_DRIVERS_LICENSE_UNDER21 | 2020 | Missouri Intermediate Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2012 | Missouri Instruction Permit | | DriversLicense | LEARNERS_PERMIT | 2020 | Missouri Instruction Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2012 | Missouri Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2020 | Missouri Instruction Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2012 | Missouri Nondriver License | | IdentificationCard | IDENTIFICATION_CARD | 2020 | Missouri Nondriver Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2012 | Missouri Nondriver License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2020 | Missouri Nondriver Identification Card (Under 21) | ### Montana | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :---------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2008 | Montana Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2016 | Montana Driver License / Commercial License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2016 | Montana Driver License (Under 21) / Commercial License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2025 | Montana Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE | 2025 | Montana Driver License | | IdentificationCard | IDENTIFICATION_CARD | 2008 | Montana Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2016 | Montana Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2025 | Montana Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2008 | Montana Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2016 | Montana Identification Card (Under 21) | ### Nebraska | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------------------- | :------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2017 | Nebraska Driver License / Operators License / School Bus Permit / Medical Hardship Permit / Non - Domiciled CDL / Commercial Drivers License / Restricted CDL | | DriversLicense | DRIVERS_LICENSE | 2021 | Nebraska Driver's License / Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2003 | Nebraska School Learners Permit (Under 21) / Provisional Operators Permit (Under 21) / Operators License (Under 21) / Restricted CDL | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2017 | Nebraska Driver License (Under 21) / Commercial Driver's License (Under 21) / Limited - Term Driver License (Under 21) / Restricted CDL (Under 21) / Non - Domiciled CDL (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2021 | Nebraska Driver's License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2026 | Nebraska Driver's License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2017 | Nebraska Learners Permit /  Limited - Term Learners Permit / Commercial Learner's Permit / Non - Domiciled CLP | | DriversLicense | LEARNERS_PERMIT | 2022 | Nebraska Learner's Permit / Commercial Learner's Permit | | DriversLicense | LEARNERS_PERMIT | 2026 | Nebraska Learner's Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2017 | Nebraska Commercial Learner's Permit (Under 21)  /  Learners Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2021 | Nebraska Learner's Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2026 | Nebraska Learner's Permit (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2017 | Nebraska Provisional Operators Permit (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2021 | Nebraska Provisional Operator's Permit (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2026 | Nebraska Provisional Operator's Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2009 | Nebraska Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2021 | Nebraska Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2026 | Nebraska Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2017 | Nebraska Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2021 | Nebraska Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2026 | Nebraska Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2020 | Nebraska Concealed Handgun Permit | ### Nevada | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :--------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2010 | Nevada Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2021 | Nevada Driver License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2010 | Nevada Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2021 | Nevada Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2021 | Nevada Instruction Permit / Commercial Learner Permit / Instruction Permit Driver Authorization Card | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2010 | Nevada Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2021 | Nevada Instruction Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2010 | Nevada Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2021 | Nevada Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2010 | Nevada Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2021 | Nevada Identification Card (Under 21) | ### New Hampshire | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2011 | New Hampshire Operator License | | DriversLicense | DRIVERS_LICENSE | 2017 | New Hampshire Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2025 | New Hampshire Driver License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2017 | New Hampshire Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2025 | New Hampshire Driver License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2011 | New Hampshire Non Driver ID | | IdentificationCard | IDENTIFICATION_CARD | 2017 | New Hampshire Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2025 | New Hampshire Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2008 | New Hampshire Non Driver ID (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2017 | New Hampshire Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2025 | New Hampshire Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2020 | New Hampshire Pistol / Revolver License | ### New Jersey | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :--------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2011 | New Jersey Auto Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2011 | New Jersey Auto Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2011 | New Jersey Probationary Auto License | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2011 | New Jersey Probationary Auto License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2011 | New Jersey - FOR IDENTIFICATION ONLY | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | New Jersey - FOR IDENTIFICATION ONLY (Under 21) | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2019 | New Jersey County of Essex Resident Card | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2020 | City of Plainfield Municipal Identification Card | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2021 | Monmouth County Identification Card | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2022 | City of New Ark Municipal Identification Card | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2023 | City of Paterson New Jersey Municipal Identification Card | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2024 | City of Elizabeth NJ Identification Card | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2025 | New Jersey Identification Card | ### New Mexico | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------------------- | :------ | :------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2007 | New Mexico Driver's License (Interlock License)  / Commercial Driver's License  / Restricted Driver's License | | DriversLicense | DRIVERS_LICENSE | 2016 | New Mexico Driver's License / Commercial Driver's License / Driver's Interlock License / Commercial Learner's Permit | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2007 | New Mexico Driver's License (Under 21) / Interlock Driver's License (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2007 | New Mexico Restricted Driver's License (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2007 | New Mexico Provisional License (Under 21) / Provisional Interlock License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2016 | New Mexico Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2007 | New Mexico Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2010 | New Mexico Concealed Handgun License | ### New York | Type of ID | Subtype of ID | Version | Description | | :----------------- | :----------------------------------- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVER_LICENSE | 2005 | New York State Driver License / Enhanced Commercial Driver License / Enhanced Restricted Use Driver License / Restricted Use Driver License / Commercial Driver License / Enhanced Driver License / Enhanced Conditional Driver License / Conditional Driver License | | DriversLicense | DRIVER_LICENSE | 2010 | New York State Driver License | | DriversLicense | DRIVER_LICENSE | 2017 | New York State Driver License | | DriversLicense | DRIVER_LICENSE | 2022 | New York State Driver License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2017 | New York State Driver License Under 21 | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2022 | New York State Driver License Under 21 | | DriversLicense | ENHANCED_DRIVER_LICENSE | 2017 | New York State Enhanced Commercial Driver License / Enhanced Driver License | | DriversLicense | LEARNERS_PERMIT | 2005 | New York State Learner Permit / Enhanced Learner Permit | | DriversLicense | LEARNERS_PERMIT | 2017 | New York State Learner Permit | | DriversLicense | LEARNERS_PERMIT | 2022 | New York State Learner Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2005 | New York State Learner Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2017 | New York State Learner Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2022 | New York State Learner Permit (Under 21) | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2021 | New York City Identification Card | | IdentificationCard | ENHANCED_IDENTIFICATION_CARD | 2017 | New York State Enhanced Identification Card | | IdentificationCard | ENHANCED_IDENTIFICATION_CARD_UNDER21 | 2017 | New York State Enhanced Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2005 | New York State Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2017 | New York State Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2018 | NYC Identification Card | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2020 | Westchester County Clerk Identification Card | | Other | IDENTIFICATION_CARD | 2021 | NYC Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2022 | New York State Enhanced Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2017 | New York State Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2022 | New York State Identification Card (Under 21) | | MedicalCard | MEDICAL_CARD | 2015 | New York State Medical Card | | Other | FIREARMS_LICENSE | 2010 | New York Firearms License | | Other | FIREARMS_LICENSE | 2015 | New York Firearms License | ### North Carolina | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------------------- | :------ | :------------------------------------------------------------------------------------------ | | DriversLicense | DRIVERS_LICENSE | 2008 | North Carolina Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2015 | North Carolina Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2024 | North Carolina Driver License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2015 | North Carolina Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2016 | North Carolina Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2024 | North Carolina Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2015 | North Carolina Learner Permit / Commercial Learner Permit | | DriversLicense | LEARNERS_PERMIT | 2024 | North Carolina Learner Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2024 | North Carolina Learner Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2015 | North Carolina Limited Learner Permit (Under 21) / Learner Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2016 | North Carolina Limited Learner Permit (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2015 | North Carolina Full Provisional License (Under 21) / Limited Provisional License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2008 | North Carolina Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2015 | North Carolina Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2024 | North Carolina Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2014 | North Carolina Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2015 | North Carolina Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2024 | North Carolina Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2020 | North Carolina Concealed Handgun Permit | ### North Dakota | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :----------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2006 | North Dakota Driver License / Motorized Bicycle Permit / Commercial Driver License / Motorcycle Permit | | DriversLicense | DRIVERS_LICENSE | 2014 | North Dakota Driver License / Permanent Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2023 | North Dakota Driver License / Commercial Driver License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2017 | North Dakota Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2023 | North Dakota Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2014 | North Dakota Instruction Permit / Temporary Instruction Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2014 | North Dakota Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2023 | North Dakota Instruction Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2023 | North Dakota Instruction Permit (Under 21) | | DriversLicense | TEMPORARY_DRIVERS_LICENSE | 2023 | North Dakota Temporary Operator Permit / Temporary Driver License | | IdentificationCard | IDENTIFICATION_CARD | 2006 | North Dakota Non - Driver Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2014 | North Dakota Non - Driver Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2023 | North Dakota Non - Driver Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2006 | North Dakota Non - Driver Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2014 | North Dakota Non - Driver Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2023 | North Dakota Non - Driver Identification Card (Under 21) | ### Ohio | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :------------------------------------------------------------------------------- | | DriversLicense | DRIVER_LICENSE | 2009 | Ohio Driver License / Commercial License | | DriversLicense | DRIVER_LICENSE | 2018 | Ohio Driver License / Commercial License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2018 | Ohio Driver License (Under 21) / Commercial License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2018 | Ohio Temporary Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2018 | Ohio Temporary Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2009 | Ohio Identification Card / Temporary Instruction Permit ID | | IdentificationCard | IDENTIFICATION_CARD | 2018 | Ohio Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2015 | Ohio Identification Card (Under 21) / Temporary Instruction Permit ID (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | Ohio Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2020 | Ohio License to Carry Concealed Handgun | ### Oklahoma | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :-------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2012 | Oklahoma Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2020 | Oklahoma Driver License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2012 | Oklahoma Driver License (Under 21) / Intermediate Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2020 | Oklahoma Driver License (Under 21) / Intermediate Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2026 | Oklahoma Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2012 | Oklahoma Learner Permit | | DriversLicense | LEARNERS_PERMIT | 2020 | Oklahoma Learner Permit | | DriversLicense | LEARNERS_PERMIT | 2026 | Oklahoma Learner Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2012 | Oklahoma Learner Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2020 | Oklahoma Learner Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2026 | Oklahoma Learner Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2012 | Oklahoma Non - Driver Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2020 | Oklahoma Non - Driver Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2012 | Oklahoma Non - Driver Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2020 | Oklahoma Non - Driver Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2026 | Oklahoma Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2023 | Oklahoma Non - Driver Identification Card | | Other | FIREARMS_LICENSE | 2020 | Oklahoma Handgun License | ### Oregon | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------------------- | :------ | :-------------------------------------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2004 | Oregon Driver License / Instruction Permit / CDL Instruction Permit / Commercial Driver License / Motorcycle Instruction Permit / Moped Restriction | | DriversLicense | DRIVERS_LICENSE | 2018 | Oregon Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2004 | Oregon Driver License (Under 21) / Commercial Drivers License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2018 | Oregon Driver License (Under 21) / Commercial Drivers License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2018 | Oregon Instruction Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2004 | Oregon Provisional Instruction Permit (Under 21) / CDL Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2018 | Oregon Provisional Instruction Permit (Under 21) / CDL Instruction Permit (Under 21) | | DriversLicense | DRIVERS_LICENSE_VALID_WITHOUT_PHOTO | 2018 | Oregon Driving License (valid without photo) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2004 | Oregon Provisional License (Under 21) / Provisional Student Permit (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2018 | Oregon Provisional Driver License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2004 | Oregon Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2018 | Oregon Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2004 | Oregon Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | Oregon Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2022 | Oregon Concealed Handgun License | ### Pennsylvania | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------------------- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2007 | Pennsylvania Driver's License (Under 21) / Temporary Driver's License (Under 21) / Limited Commercial Driver's License (Under 21) / Limited License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2017 | Pennsylvania Driver's License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2022 | Pennsylvania Driver's License (Under 21) | | DriversLicense | DRIVER_LICENSE | 2007 | Pennsylvania Driver's License / Limited Commercial Driver's License / Commercial Driver's License / Limited License | | DriversLicense | DRIVER_LICENSE | 2017 | Pennsylvania Driver's License / Commercial Driver's License | | DriversLicense | DRIVER_LICENSE | 2022 | Pennsylvania Driver's License / Commercial Driver's License | | DriversLicense | JUNIOR_DRIVERS_LICENSE | 2007 | Pennsylvania Junior Driver's License | | DriversLicense | JUNIOR_DRIVERS_LICENSE | 2017 | Pennsylvania Junior Driver's License (Under 21) | | DriversLicense | JUNIOR_DRIVERS_LICENSE | 2022 | Pennsylvania Junior Driver's License (Under 21) | | DriversLicense | DRIVERS_LICENSE_VALID_WITHOUT_PHOTO | 2022 | Pennsylvania Driving License (valid without photo) | | IdentificationCard | IDENTIFICATION_CARD | 2007 | Pennsylvania Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2017 | Pennsylvania Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2022 | Pennsylvania Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2007 | Pennsylvania Identification Card (Under 21) / Pennsylvania Temporary Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | Pennsylvania Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2022 | Pennsylvania Identification Card (Under 21) | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2024 | City of Philadelphia Identification Card | | Other | BIRTH_CERTIFICATE | 2020 | Pennsylvania Birth Certificate | | Other | FIREARMS_LICENSE | 2020 | Pennsylvania License to Carry Firearms | ### Rhode Island | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------------------- | :------ | :-------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2007 | Rhode Island Driver License / Commercial Driver License | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2016 | Rhode Island Learner Permit (Under 21) | | DriversLicense | DRIVERS_LICENSE | 2018 | Rhode Island Driver License / Commercial Driver License / Non - Domiciled CDL | | DriversLicense | LEARNERS_PERMIT | 2018 | Rhode Island Learner Permit | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2016 | Rhode Island Driver License (Under 21)  / Commercial Driver License (Under 21) / Non - Domiciled CDL (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2016 | Rhode Island Provisional Driver License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2007 | Rhode Island Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2016 | Rhode Island Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2016 | Rhode Island Identification Card | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2025 | Rhode Island Identification Card | | Other | FIREARMS_LICENSE | 2020 | Rhode Island Pistol Permit | ### South Carolina | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2010 | South Carolina Driver's License | | DriversLicense | DRIVERS_LICENSE | 2018 | South Carolina Driver's License / Commercial Driver's License / Provisional Driver's License / Moped Driver's License / Route Restricted Driver's License / Temporary Alcohol Driver's License / Limited - Term Driver's License | | DriversLicense | DRIVERS_LICENSE | 2025 | South Carolina Driver's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2010 | South Carolina Driver's License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2018 | South Carolina Driver's License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2017 | South Carolina Commercial Beginner's Permit / Beginner's Permit | | DriversLicense | LEARNERS_PERMIT | 2025 | South Carolina Beginner's Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2018 | South Carolina Beginner's Permit (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2025 | South Carolina Driver's License (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2025 | South Carolina Beginner's Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2010 | South Carolina Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2018 | South Carolina Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2025 | South Carolina Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2010 | South Carolina Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | South Carolina Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2025 | South Carolina Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2020 | South Carolina Concealed Weapons Permit | ### South Dakota | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2018 | South Dakota Driver License / Operator License / Commercial Driver License / Limited - Term Driver License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2018 | South Dakota Driver License (Under 21) / Commercial Driver License (Under 21) / Limited - Term Restricted Minor's Permit (Under 21) / Operator License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2018 | South Dakota Instruction Permit / Limited - Term Instruction Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2018 | South Dakota Instruction Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2010 | South Dakota Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | South Dakota Identification Card (Under 21) | ### Tennessee | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------------- | :------ | :-------------------------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2003 | Tennessee Driver License / Commercial Driver License / Restricted Driver License / Temporary Restricted Driver License / Learner Permit | | DriversLicense | DRIVERS_LICENSE | 2016 | Tennessee Driver License | | DriversLicense | DRIVERS_LICENSE | 2024 | Tennessee Driver License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2011 | Tennessee Driver License (Under 21) / Intermediate Unrestricted Driver License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2019 | Tennessee Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2011 | Tennessee Learner Permit  / Temporary Learner Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2011 | Tennessee Learner Permit (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2024 | Tennessee Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2024 | Tennessee Learner Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2024 | Tennessee Learner Permit (Under 21) | | DriversLicense | TEMPORARY_LEARNERS_PERMIT | 2024 | Tennessee Temporary Learner Permit | | DriversLicense | TEMPORARY_DRIVERS_LICENSE | 2024 | Tennessee Temporary Driver License | | IdentificationCard | IDENTIFICATION_CARD | 2003 | Tennessee Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2015 | Tennessee Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2016 | Tennessee Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2016 | Tennessee Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2024 | Tennessee Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2024 | Tennessee Identification Card (Under 21) | | IdentificationCard | TEMPORARY_IDENTIFICATION_CARD | 2024 | Tennessee Temporary Identification Card | | Other | FIREARMS_LICENSE | 2020 | Tennessee Handgun Carry Permit | | Other | FIREARMS_LICENSE | 2025 | Tennessee Handgun Carry Permit | ### Texas | Type of ID | Subtype of ID | Version | Description | | :----------------- | :---------------------------------- | :------ | :------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2002 | Texas Driver License | | DriversLicense | DRIVERS_LICENSE | 2009 | Texas Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2020 | Texas Driver License | | DriversLicense | DRIVERS_LICENSE | 2025 | Texas Driver License | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2009 | Texas Provisional Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2009 | Texas Learner Permit (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2009 | Texas Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2020 | Texas Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2025 | Texas Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2020 | Texas Commercial Learner Permit | | DriversLicense | LEARNERS_PERMIT | 2025 | Texas Learner Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2020 | Texas Learner Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2025 | Texas Learner Driver License (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2020 | Texas Provisional Driver License (Under 21) | | DriversLicense | PROVISIONAL_DRIVERS_LICENSE_UNDER21 | 2025 | Texas Provisional Driver License (Under 21) | | DriversLicense | LIMITED_TERM_DRIVERS_LICENSE | 2020 | Texas Limited-Term Driver License | | IdentificationCard | IDENTIFICATION_CARD | 2002 | Texas Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2009 | Texas Identification Card / Limited - Term Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2020 | Texas Identification Card / Limited - Term Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2025 | Texas Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2009 | Texas Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2020 | Texas Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2025 | Texas Identification Card (Under 21) | | Other | BIRTH_CERTIFICATE | 2018 | Texas Certification of Vital Record | | Other | FIREARMS_LICENSE | 2009 | Texas Concealed Handgun License | | Other | FIREARMS_LICENSE | 2024 | Texas License to Carry Handgun | | Other | FIREARMS_LICENSE | 2025 | Texas License to Carry Handgun | ### USCIS | Type of ID | Subtype of ID | Version | Description | | :---------------- | :------------------------------ | :------ | :---------------------------- | | Permit | EMPLOYMENT_AUTHORIZATION_CARD | 2011 | Employment Authorization Card | | Permit | EMPLOYMENT_AUTHORIZATION_CARD | 2018 | Employment Authorization Card | | Permit | EMPLOYMENT_AUTHORIZATION_CARD | 2022 | Employment Authorization Card | | TravelDocument | TRAVEL_DOCUMENT | 2010 | Travel Document | | TravelDocument | TRAVEL_DOCUMENT | 2017 | Travel Document | | ResidenceDocument | PERMANENT_RESIDENT_CARD_ALLAGES | 2010 | Permanent Resident Card | | ResidenceDocument | PERMANENT_RESIDENT_CARD_ALLAGES | 2015 | Permanent Residence Card | | ResidenceDocument | PERMANENT_RESIDENT_CARD_ALLAGES | 2023 | Permanent Resident Card | ### US Department of State | Type of ID | Subtype of ID | Version | Description | | :----------------- | :----------------------------- | :------ | :------------------------------------------------------------------------------ | | DriversLicense | DRIVERS_LICENSE | 2019 | United States Department of State Driver's License / Graduated Driver's License | | IdentificationCard | GOVERNMENT_IDENTIFICATION_CARD | 2010 | United States Government Identification Card | | TravelDocument | PASSPORT_CARD_ALLAGES | 2012 | Passport Card | | TravelDocument | VISA_B1_B2 | 2008 | B1/B2 VISA - Border Crossing Card | | TravelDocument | VISA_B1_B2 | 2021 | B1/B2 VISA - Border Crossing Card | | Visa | VISA_ALLAGES | 2009 | VISA | | Visa | VISA_ALLAGES | 2010 | VISA | | Visa | VISA_ALLAGES | 2023 | VISA | | Visa | VISA_ALLAGES | 2024 | Immigrant Visa | ### Utah | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2016 | Utah Driver License / Commercial Driver License / Privilege Driver License | | DriversLicense | DRIVERS_LICENSE | 2021 | Utah Driver License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2016 | Utah Driver License (Under 21) /  Limited - Term Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2021 | Utah Driver License (Under 21) | | DriversLicense | PRIVILEGE_CARD | 2022 | Utah Driving Privilege Card | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2023 | Utah Privilege Driver License (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2006 | Utah Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2016 | Utah Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2021 | Utah Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2006 | Utah Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2010 | Utah Concealed Firearm Permit | ### Vermont | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------------------ | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2013 | Vermont Driver's License | | DriversLicense | DRIVERS_LICENSE | 2014 | Vermont Enhanced Driver's License / Enhanced Operator's License / Enhanced Commercial Driver's License / | | DriversLicense | DRIVERS_LICENSE | 2019 | Vermont Driver's License / Driver's Privilege Card / Commercial Driver's License / Nondomiciled Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2013 | Vermont Driver's License (Under 21) / Driver's Privilage Card (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2019 | Vermont Driver's License (Under 21) / Junior Driver's License (Under 21) / Junior Driver's Privilege Card (Under 21) / Nondomiciled Commercial Driver's License (Under 21) / Commercial Driver's License (Under 21) / Driver's Privilege Card (Under 21) | | DriversLicense | ENHANCED_DRIVERS_LICENSE | 2019 | Vermont Enhanced Driver's License | | DriversLicense | ENHANCED_DRIVERS_LICENSE_UNDER21 | 2014 | Vermont Enhanced Driver's License (Under 21) / Enhanced Operator's License (Under 21) | | DriversLicense | ENHANCED_DRIVERS_LICENSE_UNDER21 | 2019 | Vermont Enhanced Driver's License (Under 21) /  Enhanced Junior Driver's License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2019 | Vermont Learner's Permit / Nondomiciled Commercial Learner's Permit / Learner's Privilege Card | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2003 | Vermont Learner's Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2019 | Vermont Learner's Permit (Under 21) / Commercial Learner's Permit (Under 21) / Learner's Privilege Card (Under 21) | | DriversLicense | LEARNERS_PERMIT_VALID_WITHOUT_PHOTO | 2019 | Vermont Learner Permit (valid without photo) | | DriversLicense | LEARNERS_PERMIT_VALID_WITHOUT_PHOTO_UNDER21 | 2019 | Vermont Learner Permit Under 21 (valid without photo) | | IdentificationCard | IDENTIFICATION_CARD | 2013 | Vermont Nondriver Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2019 | Vermont Nondriver Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2013 | Vermont Nondriver Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2019 | Vermont Nondriver Identification Card (Under 21) / Enhanced Nondriver Identification Card (Under 21) | ### Virginia | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :--------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2018 | Virginia Driver's License / Commercial Driver's License | | DriversLicense | DRIVERS_LICENSE | 2023 | Virginia Driver's License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2018 | Virginia Driver's License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2023 | Virginia Driver's License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2018 | Virginia DL Learner's Permit / CDL Learner's Permit | | DriversLicense | LEARNERS_PERMIT | 2023 | Virginia DL Learner's Permit / Commercial Learner's Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2018 | Virginia DL Learner's Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2023 | Virginia DL Learner's Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2018 | Virginia Identification Card / Children's ID Card | | IdentificationCard | IDENTIFICATION_CARD | 2023 | Virginia Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2018 | Virginia Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2023 | Virginia Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2020 | Virginia Concealed Handgun Permit | | Other | FIREARMS_LICENSE | 2021 | Virginia Concealed Handgun Permit | ### Washington | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------------------ | :------ | :------------------------------------------------------------------------------------------------------------ | | DriversLicense | DRIVERS_LICENSE | 2010 | Washington Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2018 | Washington Driver License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2010 | Washington Driver License (Under 21) / Intermediate License (Under 21) / Commercial Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2017 | Washington Driver License (Under 21) / Intermediate License (Under 21) | | DriversLicense | ENHANCED_DRIVERS_LICENSE | 2018 | Washington Enhanced Driver License | | DriversLicense | ENHANCED_DRIVERS_LICENSE_UNDER21 | 2017 | Washington Enhanced Intermediate Driver License (Under 21) / Enhanced Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2018 | Washington Instruction Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2017 | Washington Instruction Permit (Under 21) | | DriversLicense | DRIVERS_LICENSE_VALID_WITHOUT_PHOTO_UNDER21 | 2017 | Washington Driving License Under 21 (valid without photo) | | DriversLicense | LEARNERS_PERMIT_VALID_WITHOUT_PHOTO_UNDER21 | 2017 | Washington Learner Permit Under 21 (valid without photo) | | IdentificationCard | ENHANCED_IDENTIFICATION_CARD | 2017 | Washington Enhanced Identification Card | | IdentificationCard | ENHANCED_IDENTIFICATION_CARD_UNDER21 | 2017 | Washington Enhanced Identification Card (Under 21) | | IdentificationCard | ENHANCED_IDENTIFICATION_CARD_UNDER21 | 2022 | Washington Enhanced Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2010 | Washington Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2017 | Washington Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2010 | Washington Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2017 | Washington Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2010 | Washington Concealed Pistol License | | Other | FIREARMS_LICENSE | 2020 | Washington Concealed Pistol License | ### West Virginia | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | DriversLicense | DRIVERS_LICENSE | 2011 | West Virginia Driver's License / Commercial DL / M - Cycle Only DL / BI - OPTIC Lens DL | | DriversLicense | DRIVERS_LICENSE | 2020 | West Virginia Driver's License | | DriversLicense | DRIVERS_LICENSE | 2023 | West Virginia Driver's License | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2011 | West Virginia Driver's License (Under 21) / Commercial DL (Under 21) / M - Cycle Only DL (Under 21) / BI - OPTIC Lens DL (Under 21) / Graduated DL (Under 21) / Level 2 - Intermed DL | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2020 | West Virginia Driver's License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2023 | West Virginia Intermediate DL (Under 21) / Commercial Driver's License (Under 21) / West Virginia Intermediate DL 2 (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2020 | West Virginia Instruction Permit | | DriversLicense | LEARNERS_PERMIT | 2023 | West Virginia Learner's Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2011 | West Virginia Instruction Permit (Under 21) / CDL INST Permit (Under 21) / Level 1 - INST Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2020 | West Virginia Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2023 | West Virginia Instruction Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2011 | West Virginia Non - Oper ID Card / Secondary ID | | IdentificationCard | IDENTIFICATION_CARD | 2023 | West Virginia Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2011 | West Virginia Non - Oper ID Card (Under 21)  / Secondary ID (Under 21) / Youth ID (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2020 | West Virginia Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2023 | West Virginia Identification Card (Under 21) | | Other | FIREARMS_LICENSE | 2009 | West Virginia Concealed Pistol / Revolver Permit | ### Wisconsin | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------------------- | :------ | :----------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2012 | Wisconsin Driver License Regular / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2015 | Wisconsin Driver License Regular | | DriversLicense | DRIVERS_LICENSE | 2023 | Wisconsin Driver License Regular | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2005 | Wisconsin Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2012 | Wisconsin Driver License Regular (Under 21) / Probationary Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2015 | Wisconsin Driver License Regular (Under 21) / Commercial Driver License (Under 21) | | DriversLicense | DRIVERS_LICENSE_UNDER21 | 2023 | Wisconsin Driver License Regular (Under 21) / Probationary Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2015 | Wisconsin Instruction Permit | | DriversLicense | LEARNERS_PERMIT | 2023 | Wisconsin Instruction Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2005 | Wisconsin Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2015 | Wisconsin Instruction Permit (Under 21) | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2023 | Wisconsin Instruction Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2012 | Wisconsin Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2015 | Wisconsin Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2020 | Wisconsin Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2023 | Wisconsin Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2012 | Wisconsin Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2015 | Wisconsin Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2023 | Wisconsin Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_VALID_WITHOUT_PHOTO | 2023 | Wisconsin Identity Card (valid without photo) | | IdentificationCard | CITY_IDENTIFICATION_CARD | 2020 | City of Milwaukee Municipal ID Card | | Other | FIREARMS_LICENSE | 2020 | Wisconsin Concealed Carry License | ### Wyoming | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :---------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2010 | Wyoming Driver License / Commercial Driver License | | DriversLicense | DRIVERS_LICENSE | 2020 | Wyoming Driver License | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2004 | Wyoming Driver License (Under 21) / Commercial Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2010 | Wyoming Driver License (Under 21) / Commercial Driver License (Under 21) | | DriversLicense | DRIVER_LICENSE_UNDER21 | 2020 | Wyoming Driver License (Under 21) | | DriversLicense | LEARNERS_PERMIT | 2020 | Wyoming Instruction Permit / Limited Term Instruction Permit / Commercial Learners Permit | | DriversLicense | LEARNERS_PERMIT_UNDER21 | 2020 | Wyoming Instruction Permit (Under 21) | | IdentificationCard | IDENTIFICATION_CARD | 2004 | Wyoming Identification Card | | IdentificationCard | IDENTIFICATION_CARD | 2019 | Wyoming Identification Card | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2010 | Wyoming Identification Card (Under 21) | | IdentificationCard | IDENTIFICATION_CARD_UNDER21 | 2020 | Wyoming Identification Card (Under 21) | --- - Path: `general-reference/supported-ids-oceania` - URL: https://developer.incode.com/general-reference/supported-ids-oceania/ - Markdown: https://developer.incode.com/general-reference/supported-ids-oceania.md The following tables list supported identification documents for Oceania, organized by country. The table for Australia is further divided by state. ## Australia (AUS) ### All States | Type of ID | Subtype of ID | Version | Description | | :---------------- | :------------------ | :------ | :-------------------------------------------------------------- | | MedicalCard | MEDICAL\_CARD | 2018 | Medicare Card | | MedicalCard | MEDICAL\_CARD | 2019 | Medicare Card | | MedicalCard | MEDICAL\_CARD | 2020 | Medicare Card | | Military | MILITARY\_CARD | 2020 | Military Card | | Passport | NATIONAL\_PASSPORT | 2008 | Passport | | Passport | NATIONAL\_PASSPORT | 2022 | Passport | | Passport | EMERGENCY\_PASSPORT | 2025 | Emergency Passport | | ResidenceDocument | RESIDENCE\_PERMIT | 2017 | Australian Government ImmiCard (Evidence of Immigration Status) | | ResidenceDocument | RESIDENCE\_PERMIT | 2018 | Australian Government Permanent Resident Evidence | ### Capital Territory | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------- | :------ | :-------------------------------------------------------- | | DriversLicense | DRIVERS\_LICENSE | 2015 | Australian Capital Territory Driver License | | DriversLicense | HEAVY\_VEHICLE\_DRIVERS\_LICENSE | 2015 | Australian Capital Territory Heavy Vehicle Driver License | | DriversLicense | LEARNER\_DRIVERS\_LICENSE | 2015 | Australian Capital Territory Learner Driver License | | DriversLicense | PROVISIONAL\_DRIVERS\_LICENSE | 2015 | Australian Capital Territory Provisional Driver License | | DriversLicense | PROBATIONARY\_DRIVERS\_LICENSE | 2024 | Australian Capital Territory Probationary Driver License | | IdentificationCard | IDENTIFICATION\_CARD | 2021 | Australian Capital Territory Proof of Identity Card | ### New South Wales | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------- | :------ | :------------------------------------------- | | DriversLicense | DRIVERS\_LICENSE | 2015 | New South Wales Driver License | | DriversLicense | HEAVY\_VEHICLE\_DRIVERS\_LICENSE | 2015 | New South Wales Heavy Vehicle Driver License | | DriversLicense | LEARNERS\_PERMIT | 2015 | New South Wales Learner Driver License | | DriversLicense | PROVISIONAL\_DRIVERS\_LICENSE | 2015 | New South Wales Provisional Driver License | | IdentificationCard | IDENTIFICATION\_CARD | 2012 | New South Wales Photo Card | | Other | COMPETENCY\_CARD | 2022 | New South Wales Competency Card | ### Northern Territory | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------- | :------ | :----------------------------------------------------------- | | DriversLicense | DRIVERS\_LICENSE | 2012 | Northern Territory of Australia Driver License | | DriversLicense | DRIVERS\_LICENSE | 2015 | Northern Territory of Australia Driver License | | DriversLicense | HEAVY\_VEHICLE\_DRIVERS\_LICENSE | 2015 | Northern Territory of Australia Heavy Vehicle Driver License | | IdentificationCard | IDENTIFICATION\_CARD | 2015 | Northern Territory of Australia Evidence of Age Card | ### Queensland | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------- | :------ | :-------------------------------------- | | DriversLicense | DRIVERS\_LICENSE | 2015 | Queensland Driver License | | DriversLicense | DRIVERS\_LICENSE | 2020 | Queensland Driver License | | DriversLicense | HEAVY\_VEHICLE\_DRIVERS\_LICENSE | 2015 | Queensland Heavy Vehicle Driver License | | DriversLicense | HEAVY\_VEHICLE\_DRIVERS\_LICENSE | 2020 | Queensland Heavy Vehicle Driver License | | DriversLicense | INDUSTRY\_AUTHORITY\_CARD | 2024 | Queensland Industry Authority Card | | IdentificationCard | IDENTIFICATION\_CARD | 2011 | Queensland Adult Proof of Age Card | | IdentificationCard | IDENTIFICATION\_CARD | 2019 | Queensland Photo Identification Card | | Permit | INDUSTRY\_AUTHORITY\_CARD | 2024 | Queensland Industry Authority Card | ### South Australia | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------- | :------ | :--------------------------------------------- | | DriversLicense | DRIVERS\_LICENSE | 2015 | South Australia Driver's License | | DriversLicense | HEAVY\_VEHICLE\_DRIVERS\_LICENSE | 2015 | South Australia Heavy Vehicle Driver's License | | DriversLicense | LEARNERS\_PERMIT | 2015 | South Australia Learner's Permit | | DriversLicense | PROVISIONAL\_DRIVERS\_LICENSE | 2015 | South Australia Provisional Driver's License | | IdentificationCard | IDENTIFICATION\_CARD | 2015 | South Australia Proof of Age Card | ### Tasmania | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------- | :------ | :------------------------------------ | | DriversLicense | DRIVERS\_LICENSE | 2015 | Tasmania Driver License | | DriversLicense | HEAVY\_VEHICLE\_DRIVERS\_LICENSE | 2015 | Tasmania Heavy Vehicle Driver License | | DriversLicense | LEARNERS\_PERMIT | 2015 | Tasmania Learner Driver License | | DriversLicense | PROVISIONAL\_DRIVERS\_LICENSE | 2015 | Tasmania Provisional Driver License | | IdentificationCard | IDENTIFICATION\_CARD | 2023 | Tasmania Personal Information Card | ### Victoria | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------- | :------ | :------------------------------------ | | DriversLicense | DRIVERS\_LICENSE | 2014 | Victoria Driver License | | DriversLicense | HEAVY\_VEHICLE\_DRIVERS\_LICENSE | 2014 | Victoria Heavy Vehicle Driver License | | DriversLicense | LEARNERS\_PERMIT | 2014 | Victoria Learner Permit | | DriversLicense | PROVISIONAL\_DRIVERS\_LICENSE | 2014 | Victoria Probationary Driver License | | IdentificationCard | IDENTIFICATION\_CARD | 2018 | Victoria Proof of Age Card | | Other | MARINE\_LICENSE | 2020 | Victoria Marine License | ### Western Australia | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------------- | :------ | :----------------------------------------------- | | DriversLicense | DRIVERS\_LICENSE | 2016 | Western Australia Driver's License | | DriversLicense | HEAVY\_VEHICLE\_DRIVERS\_LICENSE | 2016 | Western Australia Heavy Vehicle Driver's License | | DriversLicense | LEARNERS\_PERMIT | 2016 | Western Australia Learner's Permit | | DriversLicense | PROVISIONAL\_DRIVERS\_LICENSE | 2016 | Western Australia Provisional Driver's License | | IdentificationCard | IDENTIFICATION\_CARD | 2015 | Western Australia Photo Card | ## American Samoa (ASM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------------------------- | :------ | :-------------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2003 | Driver License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2021 | Driver License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2023 | Driver License | | ALL | DriversLicense | PROVISIONAL\_DRIVERS\_LICENSE\_UNDER21 | 2003 | Provisional Driver License | | ALL | DriversLicense | PROVISIONAL\_DRIVERS\_LICENSE\_UNDER21 | 2021 | American Samoa Provisional License (Under 21) | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2003 | Identification Card | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2019 | Identification Card | | ALL | VoterIdentification | VOTER\_IDENTIFICATION\_CARD | 2023 | Voter Registration Card | | ALL | ResidenceDocument | RESIDENCE\_DOCUMENT | 2020 | Immigration Identification Card | ## Federated States of Micronesia (FSM) | State | Type of ID | Subtype of ID | Version | Description | | :------ | :------------- | :----------------- | :------ | :--------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2019 | Driver's License | | ALL | Passport | NATIONAL\_PASSPORT | 2019 | Passport | | POHNPEI | DriversLicense | DRIVERS\_LICENSE | 2022 | Pohnpei Driver License | ## Fiji (FJI) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :---------------------------- | :------ | :--------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2010 | Driver License Permit | | ALL | DriversLicense | PROVISIONAL\_DRIVERS\_LICENSE | 2010 | Provisional Driver License | | ALL | Passport | NATIONAL\_PASSPORT | 2013 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2020 | Passport | | ALL | VoterIdentification | VOTER\_IDENTIFICATION\_CARD | 2010 | Voter Identification Card | | ALL | TaxIdentification | TAX\_IDENTIFICATION\_CARD | 2023 | Taxpayer Identification Card | ## Kiribati (KIR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :--------- | :----------------- | :------ | :---------- | | ALL | Passport | NATIONAL\_PASSPORT | 2013 | Passport | ## Marshall Islands (MHL) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :--------- | :----------------- | :------ | :---------- | | ALL | Passport | NATIONAL\_PASSPORT | 2018 | Passport | ## Nauru (NRU) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :----------------- | :------ | :------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2017 | Driver Licence | | ALL | Passport | NATIONAL\_PASSPORT | 2024 | Passport | ## New Zealand (NZL) | State | Type of ID | Subtype of ID | Version | Description | | :------------ | :----------------- | :----------------- | :------ | :-------------------------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2000 | Driver License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2010 | Driver License | | ALL | IdentificationCard | AGE\_CARD | 2024 | Evidence of Age Document | | ALL | MedicalCard | MEDICAL\_CARD | 2020 | Kiwi Access Card | | ALL | Military | MILITARY\_CARD | 2020 | New Zealand Defence Force Identity Card | | ALL | Passport | NATIONAL\_PASSPORT | 2009 | Passport | | ALL | Passport | NATIONAL\_PASSPORT | 2021 | Passport | | ALL | Other | FIREARMS\_LICENSE | 2024 | Firearms License | | ALL | Other | FIREARMS\_LICENSE | 2025 | Firearms License | | COOK\_ISLANDS | DriversLicense | DRIVERS\_LICENSE | 2024 | Driver License | ## Northern Mariana Islands (MNP) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :--------------- | :------ | :------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2021 | Driver License | ## Palau (PLW) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :--------------------------- | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2021 | Identification Card | | ALL | DriversLicense | DRIVERS\_LICENSE | 2022 | Vehicle Operator License | | ALL | Passport | NATIONAL\_PASSPORT | 2015 | Passport | | ALL | TravelDocument | CONSULAR\_CARD | 2020 | Consular Identification Card | | ALL | TravelDocument | ENTRY\_PERMIT | 2024 | Entry Permit | ## Papua New Guinea (PNG) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :--------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2010 | Driver's License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2019 | Driver's License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2015 | National Identity Card | | ALL | Passport | NATIONAL\_PASSPORT | 2006 | Passport | ## French Polynesia (PYF) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :-------------- | :------ | :----------------------------------- | | ALL | DriversLicense | DRIVER\_LICENSE | 2020 | Permis de Conduire (Driving License) | ## Samoa (WSM) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------- | :----------------- | :------ | :---------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2020 | Drivers License | | ALL | DriversLicense | DRIVERS\_LICENSE | 2023 | Private Drivers License | | ALL | Passport | NATIONAL\_PASSPORT | 2016 | Passport | ## Solomon Islands (SLB) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :--------- | :----------------- | :------ | :---------- | | ALL | Passport | NATIONAL\_PASSPORT | 2022 | Passport | ## Tonga (TON) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :--------------------- | | ALL | DriversLicense | DRIVERS\_LICENSE | 2018 | Driving License | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2015 | National Identity Card | | ALL | Passport | NATIONAL\_PASSPORT | 2004 | Passport | ## Tuvalu (TUV) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :--------- | :----------------- | :------ | :---------- | | ALL | Passport | NATIONAL\_PASSPORT | 2021 | Passport | ## Vanuatu (VUT) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------- | :------ | :---------------------------------------------------- | | ALL | IdentificationCard | IDENTIFICATION\_CARD | 2024 | Carte D'Identite Nationale de Vanuatu (Identity Card) | | ALL | Passport | NATIONAL\_PASSPORT | 2019 | Passport | --- - Path: `general-reference/supported-ids-south-america` - URL: https://developer.incode.com/general-reference/supported-ids-south-america/ - Markdown: https://developer.incode.com/general-reference/supported-ids-south-america.md The following tables list supported identification documents for South America, organized by country. The tables for Argentina, Brazil, and Peru are further divided by ID type or state. ## Argentina (ARG) ### All States | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------------- | :------ | :-------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 1960 | Licencia de Conducir (Provincia del Chaco) / Driver License | | DriversLicense | DRIVERS_LICENSE | 1961 | Licencia de Conducir / Driver License | | DriversLicense | DRIVERS_LICENSE | 1963 | Licencia de Conducir (Provincia del Neuquen) / Driver License | | DriversLicense | DRIVERS_LICENSE | 1967 | Licencia de Conductor (Municipalidad de Mocoreta Corrientes) / Driver License | | DriversLicense | DRIVERS_LICENSE | 1968 | Licencia de Conductor (Municipalidad de Santa Sylvina - Chaco) / Driver License | | DriversLicense | DRIVERS_LICENSE | 1969 | Licencia de Conductor (Villa Angela - Chaco) / Driver License | | DriversLicense | DRIVERS_LICENSE | 1970 | Municipalidad de Colon Licencia de Conductor / Driving License | | DriversLicense | DRIVERS_LICENSE | 1971 | Provincia de Formosa Licencia de Conductor / Driving License | | DriversLicense | DRIVERS_LICENSE | 1972 | Paclin - Catamarca Licencia de Conductor / Driving License | | DriversLicense | DRIVERS_LICENSE | 1973 | Municipalidad de Naschel San Luis Licencia de Conductor / Driving License | | DriversLicense | DRIVERS_LICENSE | 1974 | Municipalidad Villa el Chocon Licencia de Conductor / Driving License | | DriversLicense | DRIVERS_LICENSE | 1975 | Municipalidad de Conscripto Bernardi Licencia de Conductor / Driving License | | DriversLicense | DRIVERS_LICENSE | 1976 | Gobierno de Formosa Licencia de Conducir | | DriversLicense | DRIVERS_LICENSE | 1978 | Municipalidad de Fernández Oro Licencia de Conductor | | DriversLicense | DRIVERS_LICENSE | 1979 | Municipalidad de Alcaraz Licencia de Conductor / Driving License | | DriversLicense | DRIVERS_LICENSE | 1981 | Municipalidad de Cutral-Co Licencia de Conductor / Driving License | | DriversLicense | DRIVERS_LICENSE | 1982 | Municipalidad de Ingeniero Juarez Licencia de Conductor / Driving License | | DriversLicense | DRIVERS_LICENSE | 1983 | Municipalidad de Calilegua Licencia de Conductor / Driving License | | DriversLicense | DRIVERS_LICENSE | 1984 | Licencia de Conducir Unica (Municipalidad de Puerto Vilelas) / Driver License | | DriversLicense | DRIVERS_LICENSE | 1986 | Licencia de Conductor (Municipalidad de Pampa Blanca) / Driver License | | DriversLicense | DRIVERS_LICENSE | 1987 | Licencia de Conducir (Driving License) | | DriversLicense | DRIVERS_LICENSE | 1989 | Licencia de Conductor / Driving License | | DriversLicense | DRIVERS_LICENSE | 1992 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1994 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1995 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1996 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1997 | Licencia de Conducir (Driving License) | | DriversLicense | DRIVERS_LICENSE | 1998 | Licencia de Conducir (Driving License) | | DriversLicense | DRIVERS_LICENSE | 1999 | Licencia de Conducir (Driving License) | | DriversLicense | DRIVERS_LICENSE | 2000 | Licencia Nacional de Conducir (National Driver's License) | | DriversLicense | DRIVERS_LICENSE | 2001 | Licencia Nacional de Conducir (National Driver's License) | | DriversLicense | DRIVERS_LICENSE | 2002 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 2004 | Licencia Nacional de Conducir (National Driver's License) | | DriversLicense | DRIVERS_LICENSE | 2005 | Licencia de Conductor (Villa Angela - Chaco) / Driver License | | DriversLicense | DRIVERS_LICENSE | 2006 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 2007 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 2012 | Municipalidad de San Carlos Licencia de Conductor / Driving License | | DriversLicense | DRIVERS_LICENSE | 2013 | Licencia de Conducir / Driving License (Provincia de la Pampa) | | DriversLicense | DRIVERS_LICENSE | 2014 | Licencia de Conducir (Municipalidad de Monte Caseros) / Driver License | | DriversLicense | DRIVERS_LICENSE | 2016 | Pueblo de Libertador Licencia de Conductor / Driving License | | DriversLicense | DRIVERS_LICENSE | 2020 | Licencia de Conducir (Provincia del Chaco) / Driver License | | DriversLicense | DRIVERS_LICENSE | 2024 | Licencia de Conducir / Driving License (Municipio Presidencia Roque Sáenz Peña) | | DriversLicense | DRIVERS_LICENSE | 2025 | Municipalidad de Alvear Licencia de Conductor / Driving License | | IdentificationCard | DIGITAL_IDENTITY_CARD | 2019 | Documento Nacional de Identidad (National Identity Document) | | IdentificationCard | IDENTIFICATION_CARD | 2000 | Documento Nacional de Identidad (National Identity Document) | | IdentificationCard | IDENTIFICATION_CARD | 2009 | Cedula de Identidad (Identity Card) | | IdentificationCard | IDENTIFICATION_CARD | 2012 | Documento Nacional de Identidad (National Identity Document) | | IdentificationCard | IDENTIFICATION_CARD | 2013 | Cedula de Identidad (Identity Card) | | IdentificationCard | IDENTIFICATION_CARD | 2015 | Documento Nacional de Identidad Extranjero (National Foreign Identity Document) | | IdentificationCard | IDENTIFICATION_CARD | 2023 | Documento Nacional de Identidad (National Identity Document) | | IdentificationCard | IDENTIFICATION_CARD | 2024 | Alcaldia Municipal de San Miguel Carné de Identificación Personal / Identity Card | | IdentificationCard | POLICE_IDENTIFICATION_CARD | 2024 | Police Identification Card | | Passport | NATIONAL_PASSPORT | 2009 | Pasaporte (Passport) | | Passport | NATIONAL_PASSPORT | 2010 | Pasaporte (Passport) | | Passport | NATIONAL_PASSPORT | 2014 | Pasaporte (Passport) | | Passport | NATIONAL_PASSPORT | 2023 | Pasaporte (Passport) | ### Córdoba | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :--------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2017 | Cordoba Licencia de Conducir (Driving License) | ### Formosa | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :--------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2024 | Formosa Licencia de Conducir / Driving License | ### Misiones | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :---------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2008 | Misiones Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 2020 | Misiones Licencia de Conducir / Driving License | ### Río Negro | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :------------------------ | | DriversLicense | DRIVERS_LICENSE | 2020 | Rio Negro Driving License | ### San Luis | Type of ID | Subtype of ID | Version | Description | | :----------------- | :------------------ | :------ | :------------------------------------------- | | IdentificationCard | IDENTIFICATION_CARD | 2024 | San Luis Cedula de Identidad (Identity Card) | ### Yala | Type of ID | Subtype of ID | Version | Description | | :------------- | :-------------- | :------ | :------------------------------------------ | | DriversLicense | DRIVERS_LICENSE | 2023 | Yala Licencia de Conducir / Driving License | ## Bolivia (BOL) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :---------------------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2013 | Licencia para Conducir (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Licencia para Conducir (Driving License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2025 | Licencia para Conducir (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2001 | Cedula de Identidad (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2002 | Cedula de Identidad (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Cedula de Identidad (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2023 | Cedula de Identidad (Identity Card) | | ALL | MedicalCard | MEDICAL_CARD | 2010 | Medical Card | | ALL | Passport | NATIONAL_PASSPORT | 2010 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2021 | Cedula de Identidad de Extranjero (Foreigner Identity Card) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2024 | Cédula de Identidad de Extranjero (Residence Permit) | | ALL | Visa | VISA | 2023 | Visa | ## Brazil (BRA) ### National IDs | Type of ID | Subtype of ID | Version | Description | | :---------------- | :-------------------------------- | :------ | :---------------------------------------------------------------------------------------------- | | DriversLicense | DRIVERS_LICENSE | 2019 | Carteira Nacional de Habilitação (Nation Wide Drivers License) | | DriversLicense | DRIVERS_LICENSE | 2023 | Carteira Nacional de Habilitação (Nation Wide Drivers License) | | DriversLicense | DRIVER_LICENSE | 2002 | Carteira Nacional de Habilitação (Nation Wide Drivers License) | | DriversLicense | DRIVER_LICENSE | 2005 | Carteira Nacional de Habilitação (Nation Wide Drivers License) | | DriversLicense | DRIVER_LICENSE | 2018 | Carteira Nacional de Habilitação (Nation Wide Drivers License) | | DriversLicense | DIGITAL_DRIVERS_LICENSE_PDF | 2020 | Carteira Nacional de Habilitação (Nation Wide Drivers License) | | DriversLicense | DRIVER_LICENSE | 2022 | Carteira Nacional de Habilitação (Nation Wide Drivers License) | | DriversLicense | INTERNATIONAL_DRIVERS_LICENSE | 2024 | International Driver License | | Other | BIRTH_CERTIFICATE | 2009 | Certidão de Nascimento (Birth Certificate) | | Other | BIRTH_CERTIFICATE | 2010 | Certidão de Nascimento (Birth Certificate) | | Other | BIRTH_CERTIFICATE | 2011 | Certidão de Nascimento (Birth Certificate) | | Other | BIRTH_CERTIFICATE | 2013 | Certidão de Nascimento (Birth Certificate) | | Other | FIREFIGHTER_IDENTIFICATION_CARD | 2010 | Carteira de Identidade - Corpo de Bombeiros Militar (Identity Card - Military Fire Department) | | Other | FIREFIGHTER_IDENTIFICATION_CARD | 2011 | Carteira de Identidade - Corpo de Bombeiros Militar (Identity Card - Military Fire Department) | | Other | WORK_AND_SOCIAL_SECURITY_REGISTRY | 2009 | Carteira de Trabalho e Previdência Social (Work Card and Social Security) | | Other | WORK_AND_SOCIAL_SECURITY_REGISTRY | 2010 | Carteira de Trabalho e Previdência Social (Work Card and Social Security) | | Other | REFUGEE_IDENTIFICATION_CARD | 2010 | Refugee Identification Card | | Passport | NATIONAL_PASSPORT | 2010 | Passaporte (Passport) | | Passport | NATIONAL_PASSPORT | 2011 | Passaporte (Passport) | | Passport | NATIONAL_PASSPORT | 2015 | Passaporte (Passport) | | Passport | NATIONAL_PASSPORT | 2018 | Passaporte (Passport) | | Passport | NATIONAL_PASSPORT | 2023 | Passaporte (Passport) | | ResidenceDocument | CONSULAR_IDENTIFICATION_CARD | 2017 | Carteira de Matricula Consular (Consular ID Card) | | ResidenceDocument | MIGRATORY_REGISTER | 2011 | Documento Provisório de Registro Nacional Migratório (National Migration Registration Document) | | ResidenceDocument | MIGRATORY_REGISTER | 2012 | Carteira de Registro Nacional Migratório (National Migration Registration Card) | | ResidenceDocument | MIGRATORY_REGISTER | 2013 | Carteira de Registro Diplomático (Diplomatic Registration Card) | | ResidenceDocument | RESIDENCE_PERMIT | 2000 | Cedula de identidade de estrangeiro (Foreigner Identity Card) | | ResidenceDocument | RESIDENCE_PERMIT | 2019 | Carteira de Registro Nacional Migratório (National Migration Registration Card) | | Visa | VISA | 2012 | Visa | ### Federal Professional Identity Cards | Type of ID | Subtype of ID | Version | Description | | :--------- | :--------------------------- | :------ | :------------------------------------------------------------------------------------------------------------------------ | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1844 | Identidade Funcional / Functional Identity Card | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1845 | Carteira de Identidade Funcional / Functional Identity Card | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1848 | Cedula de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1849 | Cedula de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1853 | Carteira de Identidade de Procurador do estado de Santa Catarina (Professional Identity Card for attorneys) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1855 | Carteira de Identidade Profissional (Professional Identity Card for industrial technicians) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1857 | Identidade Funcional de Vereador / Professional Identity Card of Councilor | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1858 | Carteira de Identidade Profissional (Professional Identity Card for accountants) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1859 | Carteira de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1861 | JETHRO International Chaplain Card | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1864 | Estado do Tocantins Carteira de identidade Funcional / Domestic Identification Card | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1865 | Cartão do Senador da Republica / Republic Senator Card | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1866 | Carteira de Identidade Profissional (Professional Identity Card for employees in Ministry of Finance) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1871 | Carteira de Identidade Parlamentar / Identity Card for employees in Parliament | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1872 | Carteira de Identidade Profissional (Professional Identity Card for people who work in finance) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1873 | Cedula de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1878 | Carteira de Identidade Profissional (Professional Identity Card for economists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1879 | Carteira de Identidade Profissional (Professional Identity Card for judges) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1881 | Carteira de Identidade Profissional (Professional Identity Card for judges) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1883 | Carteira de Identidade Profissional (Professional Identity Card for inspectors) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1885 | Carteira de Identidade Profissional (Professional Identity Card for physiotherapist) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1887 | Carteira de Identidade Profissional (Professional Identity Card for researchers) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1889 | Carteira de Identidade Profissional (Professional Identity Card for opticians) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1891 | Carteira de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1893 | Carteira de Identidade Profissional (Professional Identity Card for real estate brokers) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1894 | Carteira de Identidade Profissional (Professional Identity Card for representatives) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1896 | Carteira de Identidade Profissional (Professional Identity Card for judicial technicians) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1897 | Carteira de Identidade Profissional (Professional Identity Card for judges) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1900 | Carteira de Identidade Profissional (Professional Identity Card for attorneys) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1902 | Carteira de Identidade Profissional (Professional Identity Card for pilots) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1903 | Cedula de Identidade / Domestic Identification Card | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1904 | Carteira de Identidade Profissional COFECI-CRECI (Professional Identity Card for real estate agents) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1905 | Identidade Funcional / Functional Identity Card | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1906 | Identidade Funcional / Functional Identity Card | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1907 | Carteira de Identidade Profissional (Professional Identity Card for real estate agents) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1908 | Carteira de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1909 | Carteira de Identidade Profissional (Biologist Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1910 | Carteira de Identidade Profissional (Professional Identity Card for professors) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1911 | Carteira de Identidade Profissional (Administrators Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1912 | Carteira de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1913 | Carteira de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1914 | Carteira de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1915 | Carteira de Identidade Profissional (Professional Identity Card for judiciary) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1916 | Carteira de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1917 | Carteira de Habilitação de Amador (Amateur Driving License) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1918 | Carteira de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1919 | Carteira de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1920 | Carteira de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1921 | Carteira de Identidade Profissional CRECI (Professional Identity Card for real estate agents) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1922 | Carteira de Identidade Profissional (Professional Identity Card for judiciary) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1923 | Carteira de Identidade Profissional (Professional Identity Card for advocates) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1925 | Carteira de Identidade Profissional CFBM (Biomedicine Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1926 | Carteira de Identidade Profissional (Professional Identity Card for judges) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1929 | Carteira de Identidade Profissional CRP (Professional Identity Card for Psychologists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1930 | Carteira de Identidade Profissional INEP (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1931 | Carteira de Identidade Profissional CRECI (Professional Identity Card for real estate agents) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1932 | Carteira de Identidade Profissional CRCSP (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1933 | Carteira de Identidade Profissional - Tribunal de justiça de Minas Gerais (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1934 | Carteira de Identidade Profissional CRBio (Biologist Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1939 | Carteira de Identidade Profissional CREFITO (Physiotherapist Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1943 | Carteira de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1944 | Carteira de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1945 | Carteira de Identidade Profissional - FENAJ (Professional Identity Card for journalists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1951 | Carteira de Identidade Profissional (Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1955 | Carteira Nacional de Vigilante - CNV (National Security Guard Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1956 | Carteira de Identidade Profissional - CRA (Professional Identity Card for administrators) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1958 | FUNAI - National Indian Foundation card | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1960 | Carteira de Identidade Indígena - FUNAI (Indigenous Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1961 | Carteira de Identidade de Contabilista (Accountant Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1962 | Carteira de Identidade Profissional (Professional Identity Card for those working in the Ministry of Education) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1963 | Carteira de Identidade Profissional COFEN (Professional Identity Card for nursing technicians) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1964 | Carteira de Identidade Profissional CFQ (Professional Identity Card for chemists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1966 | Carteira de Identidade Profissional (Professional Identity Card for judicial technicians) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1967 | Carteira de Identidade Profissional (Professional Identity Card for radiology technician) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1971 | Carteira de Identidade Profissional (Professional Identity Card for Psychologists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1972 | Campo Grande Guarda Civil Metropolitana / Police Identification Card | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1978 | Carteira de Identidade Profissional CFM (Professional Identity Card for doctors) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1979 | Carteira de Identidade Profissional CONFEA (Professional Identity Card for engineers, architects and agronomists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1980 | Carteira de Identidade Profissional CAU (Professional Identity Card for architects and urban planners) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1981 | Cedula de Identidade de Medico (Doctor's Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1982 | Carteira de Identidade Profissional COFEN (Professional Identity Card for nursing technicians) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1983 | Carteira de Identidade Profissional CFMV (Professional Identity Card for veterinarians) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1984 | Carteira de Identidade Profissional COFEN (Professional Identity Card for nursing assistants) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1985 | Carteira de Identidade de doador de órgãos e tecidos (Organ and tissue donor Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1986 | Carteira de Identidade Profissional CFA (Administrators Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1987 | Carteira de Identidade Profissional CBMDF (Identity Card of the Federal District Military Fire Department) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1988 | Carteira de Identidade Profissional COFEN (Professional Identity Card for experts) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1989 | Carteira de Identidade Profissional CRESS (Professional Identity Card for social workers) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1990 | Carteira de Identidade Profissional CREFONO (Professional Identity Card for speech therapists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1991 | Carteira de Identidade Profissional CFF (Professional Identity Card for pharmacists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1992 | Carteira de Identidade Profissional CFO (Professional Identity Card for odontologist) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1994 | Carteira de Identidade Profissional CRTR (Professional Identity Card for radiology technicians) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1995 | Carteira de Identidade Profissional COFECI-CRECI (Professional Identity Card for real estate agents) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1996 | Carteira de Identidade Profissional CFP (Professional Identity Card for psychologists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1997 | Carteira de Identidade Profissional CRP (Professional Identity Card for psychologists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1998 | Carteira de Identidade Profissional CFMV (Professional Identity Card for veterinarians) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 1999 | Carteira de Identidade Profissional CRTR (Professional Identity Card for radiology technicians) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2000 | Carteira de Identidade Profissional CONFEA (Professional Identity Card for engineers, architects and agronomists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2001 | Carteira de Identidade Profissional CFM (Professional Identity Card for doctors) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2002 | Carteira de Identidade Profissional COFECI-CRECI (Professional Identity Card for real estate agents) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2003 | Carteira de Identidade Profissional OAB (Professional Identity Card for lawyers) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2004 | Carteira de Identidade Profissional OAB (Professional Identity Card for lawyers) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2005 | Carteira de Identidade Profissional CRC (Professional Identity Card for accounting) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2006 | Carteira de Identidade Profissional COFEN (Professional Identity Card for nurses and nursing technicians) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2007 | Carteira de Identidade Profissional CFBM (Professional Identity Card for nurses and biomedical sciences) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2012 | Carteira de Identidade Profissional CREFITO (Professional Identity Card for physiotherapists and occupational therapists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2015 | Carteira de Identidade Profissional CAU (Professional Identity Card for architects and urban planners) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2016 | Carteira de Identidade Profissional CRESS (Professional Identity Card for social workers) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2018 | Carteira de identidade Funcional - Ministerio da Saude (Identity Card for Ministry of Health workers) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2019 | Carteira de Identidade Profissional CRA (Administrators Professional Identity Card) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2020 | Carteira de Identidade Profissional CFF (Professional Identity Card for pharmacists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2021 | Carteira de Identidade Profissional CONFEA (Professional Identity Card for engineers and agronomists) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2023 | Carteira de Identidade Profissional CFMV (Professional Identity Card for veterinarians) | | FederalID | DOMESTIC_IDENTIFICATION_CARD | 2024 | Carteira de Identidade Profissional CFM (Professional Identity Card for doctors) | ### Federal Police Identity Cards | Type of ID | Subtype of ID | Version | Description | | :--------- | :------------------------- | :------ | :-------------------------------------------------------------------------------------------------------------------------- | | FederalID | POLICE_IDENTIFICATION_CARD | 1949 | Police Identity Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1951 | Guarda Civil Municipal / Police Identity Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1952 | Polícia Legislativa Federal / Police Identity Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1954 | Policial Legislativo Federal / Police Identity Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1958 | Polícia Militar Identidade Funcional / Police Identity Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1960 | Guarda Civil Municipal / Police Identity Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1961 | Policia Civil Certificado Digital / Civil Police Digital Certificate | | FederalID | POLICE_IDENTIFICATION_CARD | 1965 | Guarda Civil Carteira de Identidade Funcional / Police Identity Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1967 | Policia Civil Documento de Identidade Funcional / Civil Police Identity Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1969 | Estado de Mato Grosso do Sol Policia Civil Identidade / Police Identification Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1972 | Campo Grande Guarda Civil Metropolitana / Police Identification Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1973 | Estado de Minas Gerais Policia Civil Identidade Funcional / Police Identification Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1974 | Estado de Minas Gerais Identidade Funcional / Police Identification Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1976 | Policia Civil Delegado / Police Identification Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1977 | Polícia Militar Carteira de Identidade / Military Police Identity Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1981 | Polícia Rodoviária Federal (Federal Highway Police Identification Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 1984 | Polícia Militar Carteira de Identidade / Military Police Identity Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1985 | Carteira de Identidade Policia Militar / Police Identity Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1987 | Polícia Militar Carteira de Identidade / Police Identity Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1990 | Carteira de Identidade Policia Militar - Estado de Mato Grosso (Military Police Identity Card - State Mato Grosso) | | FederalID | POLICE_IDENTIFICATION_CARD | 1991 | Police Identification Card | | FederalID | POLICE_IDENTIFICATION_CARD | 1992 | Carteira de Identidade Policia Militar - Estado de Maranhão (Military Police Identity Card - State of Maranhão) | | FederalID | POLICE_IDENTIFICATION_CARD | 1993 | Carteira de Identidade Policia Militar - Estado de Alagoas (Military Police Identity Card - State of Alagoas) | | FederalID | POLICE_IDENTIFICATION_CARD | 1994 | Carteira de Identidade Policia Militar - Estado de São Paulo (Military Police Identity Card - State of São Paulo) | | FederalID | POLICE_IDENTIFICATION_CARD | 1995 | Carteira de Identidade Policia Militar - Estado de Roraima (Military Police Identity Card - State of Roraima) | | FederalID | POLICE_IDENTIFICATION_CARD | 1996 | Carteira de Identidade Policia Militar - Estado de Pará (Military Police Identity Card - State of Pará) | | FederalID | POLICE_IDENTIFICATION_CARD | 1997 | Carteira de Identidade Policia Militar - Estado de Espirito Santo (Military Police Identity Card - State of Espirito Santo) | | FederalID | POLICE_IDENTIFICATION_CARD | 1998 | Carteira de Identidade Policia Militar - Estado do Acre (Military Police Identity Card - State of Acre) | | FederalID | POLICE_IDENTIFICATION_CARD | 2001 | Carteira de Identidade Policia Militar - Estado de Paraná (Military Police Identity Card - State of Paraná) | | FederalID | POLICE_IDENTIFICATION_CARD | 2002 | Carteira de Identidade Policia Militar - Estado do Paraíba (Military Police Identity Card - State of Paraíba) | | FederalID | POLICE_IDENTIFICATION_CARD | 2004 | Carteira Nacional de Vigilante (Police Identification Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 2005 | Carteira de Identidade Policia Militar (Military Police Identity Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 2006 | Polícia Militar / Police Identity Card | | FederalID | POLICE_IDENTIFICATION_CARD | 2007 | Carteira de Identidade Policia Militar (Military Police Identity Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 2010 | Carteira de Identidade Policia Militar (Military Police Identity Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 2013 | Carteira de Identidade Policia Civil (Civil Police Identity Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 2014 | Carteira de Identidade Policia GOIAS (GOIAS Police Identity Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 2015 | Carteira de Identidade Policia Militar (Military Police Identity Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 2016 | Carteira de Identidade Funcional - BRIGADA MILITAR (Military Brigade Identity Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 2017 | Carteira de Identidade Policia Militar - Estado do Paraíba (Military Police Identity Card - State of Paraíba) | | FederalID | POLICE_IDENTIFICATION_CARD | 2018 | Identidade Funcional - POLICIA MILITAR (Military Police Identity Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 2019 | Carteira de Identidade - POLICIA MILITAR (Military Police Identity Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 2020 | Carteira de Identidade - POLICIA MILITAR (Military Police Identity Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 2021 | Guarda Municipal Carteira de Idenitdade (Municipal Guard Identity Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 2022 | Carteira de Identidade - POLICIA MILITAR (Military Police Identity Card) | | FederalID | POLICE_IDENTIFICATION_CARD | 2023 | Carteira de Identidade - Policia Militar de Minas Gerais (Identity Card - Military Police of Minas Gerais) | | FederalID | POLICE_IDENTIFICATION_CARD | 2025 | Polícia Penal Identidade Funcional / Police Identity Card | ### Federal Military Identity Cards | Type of ID | Subtype of ID | Version | Description | | :--------- | :--------------------------- | :------ | :--------------------------------------------------------------------------------------------- | | FederalID | AIRFORCE_IDENTIFICATION_CARD | 2014 | Carteira de Identidade Militar (Military Identity Card) | | FederalID | AIRFORCE_IDENTIFICATION_CARD | 2015 | Carteira de Identidade Militar (Military Identity Card) | | FederalID | MILITAR_IDENTIFICATION_CARD | 2001 | Carteira de Identidade - Corpo de Bombeiros Militar (Military Identity Card) | | FederalID | MILITAR_IDENTIFICATION_CARD | 2004 | Military Identification Card | | FederalID | MILITAR_IDENTIFICATION_CARD | 2005 | Military Identification Card | | FederalID | MILITAR_IDENTIFICATION_CARD | 2006 | Military Identification Card | | FederalID | MILITAR_IDENTIFICATION_CARD | 2007 | Military Identification Card | | FederalID | MILITAR_IDENTIFICATION_CARD | 2010 | Carteira de identidade do exercito (Military Identity Card) | | FederalID | MILITAR_IDENTIFICATION_CARD | 2011 | Military Identification Card | | FederalID | MILITAR_IDENTIFICATION_CARD | 2012 | Corpo de Bomberios Militar Identidade Funcional / Military Identity Card | | FederalID | MILITAR_IDENTIFICATION_CARD | 2013 | Military Identification Card | | FederalID | MILITAR_IDENTIFICATION_CARD | 2015 | Military Identity Card | | FederalID | MILITAR_IDENTIFICATION_CARD | 2017 | Military Identification Card | | FederalID | MILITAR_IDENTIFICATION_CARD | 2020 | Carteira de Identidade Militar (Military Identity Card) | | FederalID | MILITAR_IDENTIFICATION_CARD | 2021 | Bombeiro Militar Identidade Funcional / Military Identity Card | | FederalID | MILITAR_IDENTIFICATION_CARD | 2022 | Carteira de Identidade Militar (Military Identity Card) | | FederalID | MILITAR_IDENTIFICATION_CARD | 2023 | Carteira de Identidade Militar (Military Identity Card) | | FederalID | MILITAR_IDENTIFICATION_CARD | 2024 | Carteira de Identidade - Corpo de Bombeiros Militar (Identity Card - Military Fire Department) | | FederalID | MILITAR_IDENTIFICATION_CARD | 2025 | Carteira de Identidade - Corpo de Bombeiros Militar (Military Identity Card) | | FederalID | MILITAR_SERVICE_CARD | 2010 | Certificado de Dispensa de Incorporacao (Certificate of exemption from incorporation) | | FederalID | NAVY_IDENTIFICATION_CARD | 1990 | Cartao de Identificacao da Marina (Navy Identity Card) | | FederalID | NAVY_IDENTIFICATION_CARD | 2000 | Cartao de Identificacao da Marina (Navy Identity Card) | ### Federal Other IDs | Type of ID | Subtype of ID | Version | Description | | :--------- | :------------------------------ | :------ | :-------------------------------------------------------------------------------------------------------- | | FederalID | DIGITAL_IDENTIFICATION_CARD_PDF | 2024 | Federal Digital Identification Card | | FederalID | DIGITAL_IDENTIFICATION_CARD_PDF | 2025 | Federal Digital Identification Card | | FederalID | DIGITAL_IDENTIFICATION_CARD_PDF | 2026 | Federal Digital Identification Card | | FederalID | DIGITAL_IDENTITY_CARD | 2021 | Carteira Nacional de Habilitação (Digital Identity Card) | | FederalID | DISABILITY_IDENTIFICATION_CARD | 2024 | Disability Identification Card | | FederalID | FEDERAL_IDENTIFICATION | 2000 | Carteira de Identidade Federal (Federal Identity Card) | | FederalID | IDENTIFICATION_CARD | 2000 | Carteira Especial de Identidade (Special Identity Card) | | FederalID | IDENTIFICATION_CARD | 2001 | Titulo Eleitoral (Voter Registration Card) | | FederalID | IDENTIFICATION_CARD | 2002 | Estado De Rio de Janeiro - Cedula de Identidade (State Rio de Janeiro - Identification Card) | | FederalID | IDENTIFICATION_CARD | 2004 | Carteira de Identidade Profissional COFEN (Professional Identity Card for nurses and nursing technicians) | | FederalID | IDENTIFICATION_CARD | 2013 | Carteira de Identidade de Contabilista CRC (Accountant Identity Card) | | FederalID | IDENTIFICATION_CARD | 2019 | Carteira de Identidade Federal (Federal Identity Card) | | FederalID | IDENTIFICATION_CARD | 2020 | Carteira de Identidade Federal (Federal Identity Card) | | FederalID | IDENTIFICATION_CARD | 2021 | Cedula de Identidade Profissional CREF (Professional Identity Card for physicists) | | FederalID | IDENTIFICATION_CARD | 2022 | Carteira de Identidade - Estado de Mato Grosso (Mato Grosso Identity Card) | | FederalID | IDENTIFICATION_CARD | 2024 | Estado De Mato Grosso - Carteira de Identidade (State Mato Grosso - Identification Card) | | FederalID | TAX_IDENTIFICATION | 2000 | Cadastro de Pessoas Físicas (Taxpayer Registry Identification) | | FederalID | TAX_IDENTIFICATION | 2009 | Cadastro de Pessoas Físicas (Taxpayer Registry Identification) | | FederalID | TAX_IDENTIFICATION | 2010 | Comprovante de Inscrição CPF (Proof of CPF Registration) | | FederalID | TAX_IDENTIFICATION | 2011 | Cadastro de Pessoas Físicas (Taxpayer Registry Identification) | ## Chile (CHL) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :------------------------------------------------------------------------------------------ | | ALL | DriversLicense | DRIVER_LICENSE | 2000 | Licencia de Conductor (Driving License) | | ALL | DriversLicense | DRIVER_LICENSE | 2019 | Licencia de Conductor / Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2000 | Identification Personal - Cedula de Ciudadania (Personal Identification - Citizenship Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2007 | Cedula de Identidad (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2013 | Cedula de Identidad (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2024 | Cedula de Identidad (Identity Card) | | ALL | ResidenceDocument | RESIDENCE_DOCUMENT | 2025 | Cédula de Identidad Extranjero (Residence Document) | | ALL | Passport | NATIONAL_PASSPORT | 2013 | Pasaporte (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2025 | Pasaporte / National Passport | | ALL | Passport | EMERGENCY_PASSPORT | 2022 | Pasaporte de Emergencia (Emergency Passport) | | ALL | Visa | VISA | 2019 | Visa | ## Colombia (COL) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :-------------------------- | :------ | :------------------------------------------------------------ | | ALL | DriversLicense | DRIVER_LICENSE | 2000 | Drivers License | | ALL | DriversLicense | DRIVER_LICENSE | 2012 | Drivers License | | ALL | DriversLicense | DRIVER_LICENSE | 2013 | Drivers License | | ALL | DriversLicense | DRIVER_LICENSE | 2024 | Licencia de Conducción (Driving License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2000 | Cédula de Ciudadanía | | ALL | IdentificationCard | MINORS_ID | 2008 | Tarjeta de Identidad (Minors Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Cédula de Ciudadanía | | ALL | Military | MILITARY_CARD | 2010 | Ministerio de Defensa Nacional | | ALL | Military | MILITARY_CARD | 2018 | Military Card | | ALL | Passport | NATIONAL_PASSPORT | 2007 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2015 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2024 | Pasaporte / Passport | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2000 | Cédula de Extranjería | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2014 | Cédula de Extranjería | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2020 | Permiso por Protección Temporal | | ALL | ResidenceDocument | IMMIGRATION_CARD | 2014 | Cedula de Extranjeria (Foreigner ID) | | ALL | ResidenceDocument | IMMIGRATION_CARD | 2015 | Cedula de Extranjería (Immigration Card) | | ALL | ResidenceDocument | PEP_TUTOR | 2026 | Permiso por Protección Temporal - Tutor | | ALL | ResidenceDocument | TEMPORARY_PROTECTION_PERMIT | 2020 | Permiso por Proteccion Temporal (Temporary Protection Permit) | | ALL | TravelDocument | CONSULAR_CARD | 2023 | Registro Consular / Consular Registration Card | | ALL | Visa | VISA | 2010 | Visa | | ALL | Visa | VISA | 2017 | Visa | | ALL | Visa | ELECTRONIC_VISA | 2023 | Electronic Visa | | ALL | MedicalCard | HEALTH_CARD | 2022 | Carné de Servicios de Salud / Health Card | ## Ecuador (ECU) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------------- | :------ | :-------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Licencia de Conducir (Driver's License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2019 | Licencia de Conducir (Driver's License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2000 | Cedula de Ciudadania (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2011 | Cedula de Ciudadania (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2020 | Cedula de Identidad (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2021 | Cedula de Ciudadania (Identity Card) | | ALL | IdentificationCard | POLICE_IDENTIFICATION_CARD | 2020 | Police Identification Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2024 | Voter Identification Card | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2025 | Voter Identification Card | | ALL | Military | MILITARY_CARD | 2023 | Military Card | | ALL | Military | MILITARY_CARD | 2024 | Military Card | | ALL | Passport | NATIONAL_PASSPORT | 2015 | Pasaporte (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2020 | Pasaporte (Passport) | | ALL | TravelDocument | CONSULAR_ID_CARD | 2024 | Consular Identity Card | ## Guyana (GUY) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2010 | Driver's License | | ALL | DriversLicense | DRIVERS_LICENSE | 2019 | Driver License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2017 | Guyana Identification Card | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2025 | Guyana Identification Card | | ALL | Passport | NATIONAL_PASSPORT | 2014 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Passport | | ALL | Passport | NATIONAL_PASSPORT | 2025 | Passport | ## Paraguay (PRY) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------------- | :------ | :---------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2017 | Licencia de Conducir (Driver's License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2026 | Licencia de Conducir (Driver's License) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2008 | Cedula de Identidad Civil (Civil Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2018 | Cedula de Identidad Civil (Civil Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2023 | Cedula de Identidad Civil (Civil Identity Card) | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2020 | Residence Permit | | ALL | ResidenceDocument | RESIDENCE_PERMIT | 2024 | Residence Permit | | ALL | ResidenceDocument | TEMPORARY_RESIDENCE_PERMIT | 2025 | Temporary Residence Permit | | ALL | Passport | NATIONAL_PASSPORT | 2012 | Pasaporte (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2014 | Pasaporte (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2023 | Pasaporte (Passport) | | ALL | TravelDocument | CONSULAR_CARD | 2020 | Consular Card | ## Peru (PER) ### National IDs | Type of ID | Subtype of ID | Version | Description | | :----------------- | :-------------------------- | :------ | :----------------------------------------------------------- | | IdentificationCard | IDENTIFICATION_CARD | 2000 | Documento Nacional de Identidad (Identity Card) | | IdentificationCard | IDENTIFICATION_CARD | 2001 | Documento Nacional de Identidad (Identity Card) | | IdentificationCard | IDENTIFICATION_CARD | 2013 | Documento Nacional de Identidad (Identity Card) | | IdentificationCard | IDENTIFICATION_CARD | 2020 | Documento Nacional de Identidad (Identity Card) | | IdentificationCard | IDENTIFICATION_CARD | 2025 | Identification Card | | IdentificationCard | REFUGEE_IDENTIFICATION_CARD | 2019 | Carne de Solicitante de Refugio (Refugee Identity Card) | | Military | MILITARY_CARD | 2011 | Military Card | | Military | MILITARY_CARD | 2015 | Carnet de Tropa Servicio Militar / Military Card | | Military | MILITARY_CARD | 2016 | Military Card | | Military | MILITARY_CARD | 2017 | Military Card | | Military | MILITARY_CARD | 2018 | Military Card | | Military | MILITARY_CARD | 2019 | Military Card | | Military | MILITARY_CARD | 2020 | Military Card | | Military | MILITARY_CARD | 2021 | Military Card | | Military | MILITARY_CARD | 2022 | Military Card | | Military | MILITARY_CARD | 2025 | Military Card | | Passport | NATIONAL_PASSPORT | 2000 | Pasaporte (Passport) | | Passport | NATIONAL_PASSPORT | 2014 | Pasaporte (Passport) | | Passport | NATIONAL_PASSPORT | 2016 | Pasaporte (Passport) | | ResidenceDocument | RESIDENCE_PERMIT | 2000 | Residence Permit | | ResidenceDocument | RESIDENCE_PERMIT | 2017 | Carné de Extranjería (Foreigner Identity Card) | | ResidenceDocument | RESIDENCE_PERMIT | 2021 | Carné de Extranjería (Foreigner Identity Card) | | ResidenceDocument | TEMPORAL_RESIDENCE_PERMIT | 2018 | Permiso Temporal de Permanencia (Temporary Residence Permit) | | ResidenceDocument | TEMPORAL_RESIDENCE_PERMIT | 2020 | Carné Temporal de Permanencia (Temporary Residence Card) | | TravelDocument | CONSULAR_CARD | 2020 | Consular Card | | Visa | VISA | 2024 | Visa | ### Drivers Licenses | Type of ID | Subtype of ID | Version | Description | | :------------- | :------------------------- | :------ | :------------------------------------------------------------------------------------------------------ | | DriversLicense | DRIVERS_LICENSE | 1884 | Municipalidad Provincial de Azangaro Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1885 | Municipalidad Provincial de Jauja Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1889 | Licencia de Conducir (Municipalidad Provincia de Canta) / Driver License | | DriversLicense | DRIVERS_LICENSE | 1890 | Municipalidad Provincial de Chupaca Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1892 | Municipalidad Provincial de Cutervo Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1893 | Municipalidad Provincial de Puno Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1896 | Municipalidad Provincial de Chiclayo Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1897 | Municipalidad Provincial de la Convencion Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1899 | Municipalidad Provincial de Paita Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1901 | Municipalidad Provincial de Yauyos Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1902 | Municipalidad Provincial de Tambopata Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1903 | Municipalidad Provincial Sánchez Carrión Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1904 | Municipalidad Provincial de Dos de Mayo Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1905 | Municipalidad Provincial de Huamalies Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1906 | Municipalidad Provincial de Cajamarca Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1907 | Municipalidad Provincial de Andahuaylas Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1910 | Municipalidad Provincial de Acobamba Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1911 | Municipalidad Provincial de Chepén Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1912 | Municipalidad Provincial de Canta Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1914 | Provincia de Mariscal Caceres - Juanjui Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1915 | Municipalidad Provincial de la Mar San Miguel Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1918 | Municipalidad Provincial de Zarumilla Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1920 | Municipalidad Provincial de Contralmirante Villar Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1921 | Municipalidad Provincial de Padre Abad Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1922 | Municipalidad Provincial de Utcubamba Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1923 | Municipalidad Provincial de Ayabaca Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1924 | Municipalidad Provincial de Condesuyos Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1925 | Municipalidad Provincial de Paucartambo Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1926 | Municipalidad Provincial de Satipo Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1928 | Licencia de Conducir Vehiculos Menores (Municipalidad Provincial de Pallasca Cabana) / Driving License | | DriversLicense | DRIVERS_LICENSE | 1929 | Licencia de Conducir (Municipalidad Provincial de Oxapampa) / Driving License | | DriversLicense | DRIVERS_LICENSE | 1930 | Licencia de Conducir (Lamas) / Driving License | | DriversLicense | DRIVERS_LICENSE | 1932 | Municipalidad Provincial de Palpa - Ica Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1933 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1934 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1936 | Municipalidad Provincial de Pisco Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1937 | Licencia de Conducir Vehiculos Menores (Municipalidad Provincial de Ascope) / Driving License | | DriversLicense | DRIVERS_LICENSE | 1938 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1939 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1941 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1942 | Municipalidad Provincial de Chincha Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1943 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1944 | Licencia de Conducir Vehiculos Menores (Municipalidad Provincial de Coronel Portillo) / Driving License | | DriversLicense | DRIVERS_LICENSE | 1945 | Licencia de Conducir (Driving License) | | DriversLicense | DRIVERS_LICENSE | 1947 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1948 | Licencia de Conducir (Driving License) | | DriversLicense | DRIVERS_LICENSE | 1949 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1950 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1951 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1953 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1955 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1956 | Licencia de Conducir Vehiculos Menores (Municipalidad Provincial de Camana) / Driving License | | DriversLicense | DRIVERS_LICENSE | 1957 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1958 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1959 | Licencia de Conducir (Driving License) | | DriversLicense | DRIVERS_LICENSE | 1960 | Licencia de Conducir (Driving License) | | DriversLicense | DRIVERS_LICENSE | 1961 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1962 | Licencia de Conducir (Driving License) | | DriversLicense | DRIVERS_LICENSE | 1963 | Municipalidad Provincial de Chucuito - Juli Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1964 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1965 | Municipalidad Provincial de Huanuco Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1966 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1967 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1968 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1969 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1970 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1974 | Municipalidad Provincial de Rioja Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1975 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1977 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1978 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1980 | Licencia de Conducir Vehiculos Menores (Municipalidad Provincial de Huaral) / Driving License | | DriversLicense | DRIVERS_LICENSE | 1981 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1983 | Municipalidad Provincial de Antabamba Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1985 | Licencia de Conducir Vehiculos Menores (Municipalidad Provincial de la Convencion) / Driving License | | DriversLicense | DRIVERS_LICENSE | 1988 | Licencia de Conducir (Driving License) | | DriversLicense | DRIVERS_LICENSE | 1989 | Licencia de Conducir (Driving License) | | DriversLicense | DRIVERS_LICENSE | 1990 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1991 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1993 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1995 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 1997 | Licencia de Conducir (Driving License) | | DriversLicense | DRIVERS_LICENSE | 1998 | Licencia de Conducir Vehiculos Menores (Municipalidad Provincial de Tahuamanu) / Driving License | | DriversLicense | DRIVERS_LICENSE | 2000 | Licencia de Conducir (Driver License) | | DriversLicense | DRIVERS_LICENSE | 2002 | Licencia de Conducir Vehiculos Menores (Driver's License for Minor Vehicles) | | DriversLicense | DRIVERS_LICENSE | 2006 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 2009 | Municipalidad Provincial de Atalaya Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 2010 | Municipalidad Provincial de Antabamba Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 2011 | Licencia de Conducir Vehiculos Menores (Driver's License for Minor Vehicles) | | DriversLicense | DRIVERS_LICENSE | 2012 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 2013 | Municipalidad Provincial de Leoncio Prado Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 2015 | Municipalidad Provincial de Canta Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 2016 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 2019 | Municipalidad Provincial de Maynas Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 2020 | Licencia de Conducir / Driving License | | DriversLicense | DRIVERS_LICENSE | 2024 | Municipalidad Provincial de Ferreñafe Licencia de Conducir / Driving License | | DriversLicense | ELECTRONIC_DRIVERS_LICENSE | 2019 | Licencia de Conducir Electrónica / Electronic Drivers License | | DriversLicense | ELECTRONIC_DRIVERS_LICENSE | 2020 | Licencia de Conducir Electrónica (Electronic Driver License) | | DriversLicense | ELECTRONIC_DRIVERS_LICENSE | 2024 | Licencia de Conducir Electronica / Electronic Driving License | ## Suriname (SUR) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :--------------------------- | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2019 | Identification Card | | ALL | DriversLicense | DRIVERS_LICENSE | 2018 | Rijbewijs (Driver's License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2021 | Driver License | | ALL | Passport | NATIONAL_PASSPORT | 2014 | Paspoort (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2018 | Paspoort (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2026 | Paspoort (Passport) | ## Uruguay (URY) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :------------------ | :------------------------ | :------ | :------------------------------------------------------ | | ALL | DriversLicense | DRIVER_LICENSE | 2000 | Licencia Nacional de Conductor (Driver License) | | ALL | DriversLicense | DRIVER_LICENSE | 2014 | Licencia Nacional de Conductor / Driving License | | ALL | DriversLicense | DRIVER_LICENSE | 2015 | Permiso Unico Nacional de Conduccion (Driver's License) | | ALL | DriversLicense | DRIVER_LICENSE | 2016 | Licencia Nacional de Conductor / Driving License | | ALL | DriversLicense | DRIVER_LICENSE | 2017 | Licencia Nacional de Conductor / Driving License | | ALL | DriversLicense | DRIVER_LICENSE | 2018 | Licencia de Conductor / Driving License | | ALL | DriversLicense | DRIVER_LICENSE | 2019 | Licencia Nacional de Conductor / Driving License | | ALL | DriversLicense | DRIVER_LICENSE | 2023 | Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2000 | Cedula de Identidad (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2001 | Carteira de Identidade (Identity Card) | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2026 | Carteira Nacional de Identidad (Identification Card) | | ALL | Passport | NATIONAL_PASSPORT | 2014 | Pasaporte (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2015 | Pasaporte (Passport) | | ALL | Visa | VISA | 2023 | Visa | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2008 | Carte Electoral (Voter Card) | | ALL | VoterIdentification | VOTER_IDENTIFICATION_CARD | 2010 | Cartao de Eleitor (Voter Card) | ## Venezuela (VEN) | State | Type of ID | Subtype of ID | Version | Description | | :---- | :----------------- | :------------------ | :------ | :----------------------------------------------- | | ALL | DriversLicense | DRIVERS_LICENSE | 2000 | Licencia para Conducir (Driver's License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2017 | Licencia para Conducir (Driver's License) | | ALL | DriversLicense | DRIVERS_LICENSE | 2024 | Licencia para Conducir / Driving License | | ALL | IdentificationCard | IDENTIFICATION_CARD | 2000 | Cedula de Identidad (Identity Card) | | ALL | IdentificationCard | HOMELAND_CARD | 2020 | Carnet de la Patria / Homeland Card | | ALL | Military | MILITARY_CARD | 2020 | Fuerza Armada Nacional Bolivariana Military Card | | ALL | Passport | NATIONAL_PASSPORT | 2007 | Pasaporte (Passport) | | ALL | Passport | NATIONAL_PASSPORT | 2017 | Pasaporte (Passport) | | ALL | Visa | VISA | 2019 | Visa | --- - Path: `general-reference/supported-languages` - URL: https://developer.incode.com/general-reference/supported-languages/ - Markdown: https://developer.incode.com/general-reference/supported-languages.md # Supported Languages # Out-of-the-Box Language Support The Incode Platform (iOS, Android, and Web SDKs) officially supports **English **`en`, **Spanish **`es`, and **Portuguese **`pt`** **out of the box. You can modify strings for each language in the SDKs; for more information and instructions, refer to customization pages for [iOS](/sdk-reference/ios-customization/#localize-display-text), [Android](/sdk-reference/android-customization/#localize-display-text), or [Web](/sdk-reference/web-sdk-2-theming/). Contact your Incode Representative to request Figma files that reflect how each of these languages is showcased in our end user verification journey. # Additional Language Support For our Native SDKs (iOS and Android), you can provide the translations for additional languages that match the list of English text provided by Incode. The platform will work properly with your configured language. For our Web SDK, Incode offers AI auto-translations for 50+ additional languages. These strings can be modified in the SDK. Refer to the following list for languages available via auto-translation: - Amharic: `am` - Arabic: `ar` - Azerbaijani: `az` - Bengali: `bn` - Bosnian: `bs` - Burmese: `my` - Catalan: `ca` - Cebuano: `ceb` - Chinese: `zh` - Chinese Traditional: `zh-HANT` - Croatian: `hr` - Czech: `cs` - Dutch: `nl` - English (Belize): `en-BZ` - English (Diego Garcia): `en-DG` - Estonian: `et` - French: `fr` - Georgian: `ka` - German: `de` - Greek: `el` - Haitian Creole: `ht` - Hebrew: `he` - Hindi: `hi` - Hmong: `hmn` - Hungarian: `hu` - Indonesian: `id` - Italian: `it` - Japanese: `ja` - Javanese: `jv` - Kazakh: `kk` - Khmer: `km` - Korean: `ko` - Kyrgyz: `ky` - Lao: `lo` - Latvian: `Lv` - Lithuanian: `Lt` - Macedonian: `mk` - Malay: `ms` - Mongolian: `mn` - Nepali: `ne` - Polish: `pl` - Portuguese (Brazil): `pt-BR` - Portuguese (Portugal): `pt-PT` - Romanian: `ro` - Russian: `ru` - Serbian: `sr` - Serbian (Latin): `sr-LATN` - Slovak: `sk` - Slovenian: `sl` - Somali: `so` - Spanish (Spain): `es-ES` - Swahili: `sw` - Tagalog (Philippines): `tl-PH` - Thai: `th` - Turkish: `tr` - Ukrainian: `uk` - Urdu: `ur` - Uzbek: `uz` - Vietnamese: `vi` --- - Path: `general-reference/system-of-record-argentina` - URL: https://developer.incode.com/general-reference/system-of-record-argentina/ - Markdown: https://developer.incode.com/general-reference/system-of-record-argentina.md # Registro Nacional de las Personas (RENAPER) ## Registro Nacional de las Personas (RENAPER) RENAPER is Argentina’s government authority responsible for identifying citizens and legal residents, capturing biometric and personal data, and issuing the national identity card (DNI). Incode’s platform supports clients that independently obtain credentials through their own contract with RENAPER, allowing them to access RENAPER’s database as part of their verification flows. ## Verification Type | Verification Type | Supported Document Types | Data that can be verified | | :---------------- | :------------------------------------ | :---------------------------------------------------------------------------------- | | Face Only | DNI (Documento Nacional de Identidad) | Document Number (DNI), Gender, Selfie image | | Data and Face | DNI (Documento Nacional de Identidad) | Document Number (DNI), Gender, First Name, Last Name, Date of Birth, Selfie Image | ## Standalone API `POST` `/omni/process/government-validation?countryCode=ARG` ### Face Only **Request Body** ```json { "documentNumber": "12345678", "base64Image": "{{selfie}}" } ``` **Response Body** ```json { "valid": true, "statusCode": 0, "governmentValidation": { "recognitionConfidence": { "value": "99.0", "status": "OK" }, "validationStatus": { "value": "0", "status": "OK", "key": "ok" }, "ocrValidation": [ { "value": "true", "status": "OK", "key": "documentNumber" }, { "value": "true", "status": "OK", "key": "personalNumber" } ], "ocrValidationOverall": { "value": "100.0", "status": "OK" }, "overall": { "value": "99.0", "status": "OK" } } } ``` ### Data and Face **Request Body** ```javascript { "documentNumber": "12345678", "personalNumber": "20123456789", "firstName": "JUAN", "paternalLastName": "GOMEZ", "birthDate": "1985-03-15", "base64Image": "{{selfie}}" } ``` **Response Body** ```javascript { "valid":true, "statusCode":0, "governmentValidation":{ "recognitionConfidence":{ "value":"99.0", "status":"OK" }, "validationStatus":{ "value":"0", "status":"OK", "key":"ok" }, "ocrValidation":[ { "value":"true", "status":"OK", "key":"documentNumber" }, { "value":"true", "status":"OK", "key":"personalNumber" }, { "value":"true", "status":"OK", "key":"paternalLastName" }, { "value":"true", "status":"OK", "key":"firstName" }, { "value":"true", "status":"OK", "key":"birthDate" } ], "ocrValidationOverall":{ "value":"100.0", "status":"OK" }, "overall":{ "value":"99.0", "status":"OK" } } } ``` --- - Path: `general-reference/system-of-record-australia` - URL: https://developer.incode.com/general-reference/system-of-record-australia/ - Markdown: https://developer.incode.com/general-reference/system-of-record-australia.md # Australia ## Data Verification Service (DVS) DVS is Australia’s government-backed system that enables real-time verification of identity data against official government records. Incode’s platform supports clients that independently obtain approval from DVS and appoint Incode as an Information Match Agent, allowing them to access DVS database as part of their verification flows. ### Verification Type | Verification Type | Supported Document Types | Data That can be Verified | |---|---|---| | Data | Passport, Driver's License | Document Number, First Name, Middle Name, Last Name, Date of Birth, Issue Date, Expiration Date | ## Standalone API `POST` `/omni/process/government-validation?countryCode=AUS` ### Verification with a Passport #### Request Body ```javascript { "cic": "PA1234567", // passport number "documentType": "Passport", "firstName": "JANE", "middleName": "", "paternalLastName": "DOE", "birthDate": "1985/11/02", "address": "456 Collins St, Melbourne VIC 3000" } ``` #### Response Body ```jsx { "valid":true, "statusCode":0, "governmentValidation":{ "validationStatus":{ "value":"0", "status":"OK", "key":"ok" }, "ocrValidation":[ { "value":"true", "status":"OK", "key":"documentNumber" }, { "value":"true", "status":"OK", "key":"firstName" }, { "value":"true", "status":"OK", "key":"paternalLastName" }, { "value":"true", "status":"OK", "key":"birthDate" }, { "value":"true", "status":"OK", "key":"expirationDate" }, { "value":"true", "status":"OK", "key":"issueDate" } ], "ocrValidationOverall":{ "value":"100.0", "status":"OK" }, "overall":{ "value":"100.0", "status":"OK" } } } ``` ### Verification with a Driver's License #### Request Body ```javascript { "cic": "1234567", // document/licence number (primary identifier) "refNumber": "ABC123", // licence card reference number (required for DL) "documentType": "DriversLicense", "issuerState": "NSW", // or full state name; mapped to ISO2 internally "firstName": "JOHN", "middleName": "MICHAEL", "paternalLastName": "SMITH", "birthDate": "1990/05/15", "address": "123 George St, Sydney NSW 2000" } ``` #### Response Body ```javascript { "valid":true, "statusCode":0, "governmentValidation":{ "validationStatus":{ "value":"0", "status":"OK", "key":"ok" }, "ocrValidation":[ { "value":"true", "status":"OK", "key":"documentNumber" }, { "value":"true", "status":"OK", "key":"firstName" }, { "value":"true", "status":"OK", "key":"paternalLastName" }, { "value":"true", "status":"OK", "key":"birthDate" }, { "value":"true", "status":"OK", "key":"expirationDate" }, { "value":"true", "status":"OK", "key":"issueDate" } ], "ocrValidationOverall":{ "value":"100.0", "status":"OK" }, "overall":{ "value":"100.0", "status":"OK" } } } ``` ***
          --- - Path: `general-reference/system-of-record-brazil` - URL: https://developer.incode.com/general-reference/system-of-record-brazil/ - Markdown: https://developer.incode.com/general-reference/system-of-record-brazil.md # Brazil ## Serviço Federal de Processamento de Dados (SERPRO) SERPRO is a state-owned entity in Brazil responsible for providing the core digital infrastructure and identity verification databases for the government and its constituents. Incode's connection to SERPRO allows for verification of identity data and biometrics against government databases that include driver’s license and taxpayer registry records, providing a robust and secure means of identity verification for our clients. ### Verification Type | Verification Type | Supported Document Types | Data That Can Be Verified | | :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------- | | Face Only | Driver’s License, Identification Card, any identity document with CPF | Document Number, Selfie Image | | Data and Face | Driver’s License, Identification Card, any identity document with CPF | Document Number, Full Name, Date of Birth, Selfie Image (Optional) | ## Standalone API `POST` `/omni/process/government-validation?countryCode=BRA` ### Request Body ```json { "idNumber": "12345678901", // CPF "fullName": "MARIA SANTOS TEST", "birthDate": "1990-07-10", "base64Image": {{selfie}} } ``` ### Response Body ```json { "valid": true, "statusCode": 0, "governmentValidation": { "recognitionConfidence": { "value": "100.0", "status": "OK" }, "validationStatus": { "value": "0", "status": "OK", "key": "ok" }, "ocrValidation": [ { "value": "true", "status": "OK", "key": "documentNumber" }, { "value": "true", "status": "OK", "key": "fullName" }, { "value": "true", "status": "OK", "key": "birthDate" } ], "ocrValidationOverall": { "value": "100.0", "status": "OK" }, "overall": { "value": "100.0", "status": "OK" } } } ``` --- - Path: `general-reference/system-of-record-chile` - URL: https://developer.incode.com/general-reference/system-of-record-chile/ - Markdown: https://developer.incode.com/general-reference/system-of-record-chile.md # Chile ## Servicio de Registro Civil e Identificación (SRCel) SRCel is Chile’s official government authority responsible for issuing and maintaining civil and identity records. Incode’s platform connects to this database via SINACOFI, a private entity, and clients must independently obtain credentials through their own contract with SINACOFI, allowing them to access the SRCel database as part of their verification flows. ### Verification Type | Verification Type | Supported Document Types | Data That Can Be Verified | | :---------------- | :----------------------- | :----------------------------------------- | | Data | Identification Card | Identification Number (RUT/RUN), Document Number | ## Standalone API `POST` `/omni/process/government-validation?countryCode=CHL` **Request Body** ```javascript { "personalNumber": "12345678-9", "idNumber": "A123456789" } ``` **Response Body** ```javascript Node { "valid": true, "statusCode": 0, "governmentValidation": { "validationStatus": { "value": "0", "status": "OK", "key": "ok" }, "ocrValidation": [ { "value": "true", "status": "OK", "key": "documentNumber" }, { "value": "true", "status": "OK", "key": "personalNumber" }, { "value": "true", "status": "OK", "key": "ocr" } ], "ocrValidationOverall": { "value": "100.0", "status": "OK" }, "overall": { "value": "100.0", "status": "OK" } } } ``` --- - Path: `general-reference/system-of-record-colombia` - URL: https://developer.incode.com/general-reference/system-of-record-colombia/ - Markdown: https://developer.incode.com/general-reference/system-of-record-colombia.md # Colombia ## Registraduría Nacional del Estado Civil (RNEC) and Migración Colombia RNEC is Chile’s official government authority responsible for maintaining identification documents, civil records, and elections, while Migración Colombia is the official immigration authority responsible for maintaining non-citizen identification data. Incode’s platform supports verification of identity data against these databases as part of clients’ verification flows. ### Verification Type | Verification Type | Supported Document Types | Data that can be verified | | :---------------- | :------------------------------------ | :------------------------------------------------------------------------------------------ | | Data | Identification Card (Cédula de Ciudadanía, Cédula de Extranjería), Permit Card (Permiso de Protección Temporal) | Document Number, First Name, Middle Name, Paternal Last Name, Maternal Last Name, Issue Date | ## Standalone API `POST` `/omni/process/government-validation?countryCode=COL` **Request Body** ```javascript { "documentNumber": "1023456789", "firstName": "CAMILO", "middleName": "ANDRES", "paternalLastName": "RODRIGUEZ", "maternalLastName": "PEREZ", "issueDate": "2015/06/20" } ``` **Response Body** ```javascript { "valid": true, "statusCode": 0, "governmentValidation": { "validationStatus": { "value": "0", "status": "OK", "key": "ok" }, "ocrValidation": [ { "value": "true", "status": "OK", "key": "documentNumber" }, { "value": "true", "status": "OK", "key": "firstName" }, { "value": "true", "status": "OK", "key": "middleName" }, { "value": "true", "status": "OK", "key": "paternalLastName" }, { "value": "true", "status": "OK", "key": "maternalLastName" }, { "value": "true", "status": "OK", "key": "issueDate" } ], "ocrValidationOverall": { "value": "100.0", "status": "OK" }, "overall": { "value": "100.0", "status": "OK" } } } ``` --- - Path: `general-reference/system-of-record-mexico` - URL: https://developer.incode.com/general-reference/system-of-record-mexico/ - Markdown: https://developer.incode.com/general-reference/system-of-record-mexico.md # Mexico ## Instituto Nacional Electoral (INE) In Mexico, the INE provides biometric verification services, especially using facial recognition technology. The INE manages a comprehensive database with biometric data, including facial images. Incode provides direct connection to the INE for face and data verification. | Verification Type | Supported Document Types | Data That Can Be Verified | | :---------------- | :------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------- | | Data and Face | INE Card (Voter Identification) | Name, Date of birth, Personal ID (CURP), Document number (OCR, CIC), Electors key (Clave de Elector), Emission number, Issue Date, Registration Date | | Data | INE Card (Voter Identification | Issue Date, Registration Date, Document number (OCR, CIC), Electors key (Clave de Elector), Emission number | *** # Standalone API ### Request Body `POST` `/omni/process/government-validation?countryCode=MEX` ```json { "claveElector": "ABCDEF12345678", "curp": "ABCD123456HDFABC01", "nombre": "JUANTEST", "apellidoPaterno": "GARCIATEST", "apellidoMaterno": "LOPEZTEST", "anioEmision": "2020", "ocr": "1234567890123", "cic": "123456789", "numeroEmisionCredencial": "01", "anioRegistro": "2015", "base64Image": {{selfie}} } ``` ### Response Body ```json { "valid":true, "statusCode":0, "governmentValidation":{ "recognitionConfidence":{ "value":"91.1", "status":"OK" }, "validationStatus":{ "value":"0", "status":"OK", "key":"ok" }, "ocrValidation":[ { "value":"true", "status":"OK", "key":"firstName" }, { "value":"true", "status":"OK", "key":"maternalLastName" }, { "value":"true", "status":"OK", "key":"paternalLastName" }, { "value":"true", "status":"OK", "key":"personalId" }, { "value":"true", "status":"OK", "key":"electorsKey" }, { "value":"true", "status":"OK", "key":"issueDate" }, { "value":"true", "status":"OK", "key":"ocr" }, { "value":"true", "status":"OK", "key":"emissionNumber" }, { "value":"true", "status":"OK", "key":"registrationDate" } ], "ocrValidationOverall":{ "value":"100.0", "status":"OK" }, "overall":{ "value":"91.1", "status":"OK" } } } ```
          --- - Path: `general-reference/system-of-record-south-africa` - URL: https://developer.incode.com/general-reference/system-of-record-south-africa/ - Markdown: https://developer.incode.com/general-reference/system-of-record-south-africa.md # South Africa ## Department of Home Affairs (DHA) DHA is South Africa’s official government authority responsible for civil registration, identity management, citizenship, and immigration control. Incode’s platform connects to the National Population Register maintained by the DHA for the verification of identity data and biometrics as part of clients’ verification flows. ### Verification Type | Verification Type | Supported Document Types | Data That Can Be Verified | | --- | --- | --- | | Data and Face (Face Optional) | Identification Card, Driver’s License, Passport | Document Number, First Name, Paternal Last Name, Maternal Last Name, Issue Date, Selfie Image (Optional) | ## Standalone API `POST` `/omni/process/government-validation?countryCode=ZAF` ### Request Body ```javascript { "idNumber": "1234567890123", "issuedAt": "2020-01-15", "firstName": "NAOMI", "paternalLastName": "KINGS", "maternalLastName": "", "base64Image": "{{selfie_base64}}" } ``` ### Response Body ```javascript { "valid": true, "statusCode": 0, "governmentValidation": { "recognitionConfidence": { "value": "81.0", "status": "OK" }, "validationStatus": { "value": "0", "status": "OK", "key": "ok" }, "ocrValidation": [ { "value": "true", "status": "OK", "key": "documentNumber" }, { "value": "true", "status": "OK", "key": "firstName" }, { "value": "true", "status": "OK", "key": "paternalLastName" }, { "value": "true", "status": "OK", "key": "maternalLastName" }, { "value": "true", "status": "OK", "key": "issueDate" } ], "ocrValidationOverall": { "value": "100.0", "status": "OK" }, "overall": { "value": "81.0", "status": "OK" } } } ```
          --- - Path: `general-reference/united-kingdom` - URL: https://developer.incode.com/general-reference/united-kingdom/ - Markdown: https://developer.incode.com/general-reference/united-kingdom.md # United Kingdom eKYB Prefill in the United Kingdom leverages the UK's source of truth to automatically retrieve and populate business information based on a company's Registration Number or VAT Number, including the business name, registered address, entity type, registration status, directors, shareholders, and additional financial and corporate data, without requiring manual input from the user. ## Source | Country | Source | Description | | --- | --- | --- | | United Kingdom | `GB_KYB_PREFILL` | Returns matching UK business details from the UK's source of truth for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --- | --- | --- | | plugins | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | source | Mandatory | String. Must be `GB_KYB_PREFILL`. Identifies the Prefill source. | | country | Mandatory | String. Two-letter Alpha-2 country code. Must be `GB`. | | taxId | Mandatory | String. UK Registration Number or VAT Number. See Tax ID formats for details. | | businessName | Optional | String. Registered name of the business. When provided, adds `nameMatch` to the response. | | address | Optional | String. Business address as a freeform string. When provided, adds `addressMatch` to the response. | ### Tax ID formats The `taxId` field accepts two UK business identifier types. Routing between them is determined automatically by the length of the submitted value after stripping any `GB` prefix. | ID Type | Format | Example | | --- | --- | --- | | **Registration Number** | 7 or 8 numeric digits | `01616165` | | **VAT Number** | 9 numeric digits, or `GB` + 9 numeric digits | `GB374927709` or `374927709` | Registration Number (8 digits) and VAT Number (9 digits) never overlap in length, so routing is unambiguous. Inputs of any other length return a 400 error. ### Sample request ```json { "plugins": ["ekyb-prefill"], "source": "GB_KYB_PREFILL", "country": "GB", "taxId": "01234567", "businessName": "Northbridge Footwear Ltd", "address": "2 Example Street, London, EC1A 1BB" } ``` ### Sample response The Prefill response returns business data retrieved directly from the source of truth. Fields are returned as-is from the source. `nameMatch` and `addressMatch` are only present when `businessName` or `address` were submitted in the request. ```json { "kyb-prefill": [ { "tin": "01234567", "vatNo": "GB123456789", "name": "Northbridge Footwear Ltd", "nameMatch": "Verified", "address": "2 Example Street, London, EC1A 1BB", "city": "London", "postalCode": "EC1A 1BB", "entityType": "Private limited with Share Capital", "registrationStatus": "Active", "registrationDate": "2012-06-18T00:00:00Z", "creditRating": "A", "creditRatingDescription": "Very Low Risk", "industry": "Unknown", "industryDesc": "Manufacture of footwear", "turnover": { "currency": "GBP", "value": 1026089739 }, "employeeCount": 789, "activityDesc": "The manufacture and distributes sports and leisure footwear and accessories to customers across Europe and is part of one of the major players in the global sports footwear industry.", "otherAddresses": [ { "type": "Main Trading Address", "otherAddress": "18 Harbour Way, Manchester, M1 2AB" }, { "type": "Trading Address", "otherAddress": "75 Meadow Park, Birmingham, B1 1AA" } ], "shareholders": [ { "name": "Summit Athletics Holdings Inc.", "percentSharesHeld": 100 } ], "ultimateParent": { "name": "Summit Global Industries Inc.", "country": "US" }, "immediateParent": { "name": "Summit Athletics Holdings Inc.", "country": "US" }, "beneficialOwners": [ { "name": "Mr Ethan Caldwell", "dateOfBirth": "1944-06-01T00:00:00Z", "nationality": "American", "natureOfControl": "ownership-of-shares-75-to-100-percent,voting-rights-75-to-100-percent,right-to-appoint-and-remove-directors" } ], "websites": ["www.newbalance.co.uk"], "directors": [ { "name": "Mrs Maya Reynolds", "positionName": "Director" }, { "name": "Mr Lucas Bennett", "positionName": "Director" }, { "name": "Mrs Sofia Mitchell", "positionName": "Director" }, { "name": "Mrs Amelia Brooks", "positionName": "Company Secretary" }, { "name": "Mr Daniel Foster", "positionName": "Director" } ] } ] } ``` ### Response fields | Key | Value | Description | | --- | --- | --- | | tin | Registration Number | The company Registration Number as confirmed by the source of truth. Returned when `taxId` is submitted as a Registration Number. | | vatNo | VAT Number | The VAT registration number as returned from the source of truth, including `GB` prefix (for example, `GB374927709`). | | name | Business name | The registered legal name of the business as returned from the source of truth. | | nameMatch | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the name on file. Only present when `businessName` was submitted in the request. See Name and address match values for details. | | address | Registered address | The primary registered address of the business as returned from the source of truth. | | addressMatch | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against the registered address on file. Only present when `address` was submitted in the request. See Name and address match values for details. | | city | City | The city of the registered address as returned from the source of truth. | | postalCode | Postal code | The postal code of the registered address as returned from the source of truth. | | entityType | Entity type | The legal form of the business as returned from the source of truth (for example, `Private limited with Share Capital`). | | registrationStatus | Registration status | The current company status as returned from the source of truth (for example, `Active`). See Registration status values for details. | | registrationDate | Date | The date the company was registered, as returned from the source of truth. | | creditRating | Credit rating value | The standardized credit rating value (for example, `A`). | | creditRatingDescription | Credit rating description | A human-readable description of the credit rating (for example, `Very Low Risk`). | | industry | Industry sector | The industry sector of the business. Returns `Unknown` for UK, as this field is not available from the source of truth. | | industryDesc | Industry description | The primary activity description as returned from the source of truth (for example, `Manufacture of footwear`). | | turnover | `{currency, value}` | The latest turnover figure as returned from the source of truth. May not be present for all companies. | | employeeCount | Number | The latest employee count as returned from the source of truth. May not be present for all companies. | | activityDesc | Activity description | A free-text description of the business's principal activity as returned from the source of truth. | | otherAddresses | Array of `{type, otherAddress}` | Additional addresses on file (for example, trading addresses), other than the primary registered address. | | shareholders | Array of `{name, percentSharesHeld}` | Shareholders associated with the business as returned from the source of truth. | | ultimateParent | `{name, country, registrationNumber}` | Ultimate parent company, if available. Absent when the entity is not a subsidiary. | | immediateParent | `{name, country, registrationNumber}` | Immediate parent company, if available. Absent when the entity is not a subsidiary. | | beneficialOwners | Array of `{name, dateOfBirth, nationality, natureOfControl}` | Beneficial owners as returned from the source of truth. UK-specific field — not present in other country responses. | | websites | Array of strings | Website URLs associated with the business as returned from the source of truth. | | directors | Array of `{name, positionName}` | Current directors and officers as returned from the source of truth. `positionName` reflects the primary position title on file. | ### Name and address match values | Status | Description | | --- | --- | | Verified | Exact match found against registry data. | | Approximate Match | Similar match found; may reflect minor differences in naming or address formatting. | | Unverified | No match found in registry data. | ### Registration status values | Status | Description | | --- | --- | | Active | The company is currently active and registered. | | Inactive | The company registration is dissolved, struck off, or no longer active. | | Unknown | The registration status could not be determined. | ## Error responses For standard HTTP response codes, see the API Error Response page. UK Prefill returns the following country-specific 400 errors. `taxId` is missing, empty, or not a valid Registration Number (7–8 digits) or VAT Number (9 digits or `GB` + 9 digits): ```json { "timestamp": 1782851408892, "status": 400, "error": "Bad Request", "message": "taxId must be a valid UK Registration Number (7-8 digits) or VAT Number (9 digits, optionally prefixed with GB)", "path": "/omni/externalVerification/ekyb-prefill" } ``` Any mandatory field (`plugins`, `source`, `country`, or `taxId`) is missing: ```json { "timestamp": 1782851468367, "status": 400, "error": "Bad Request", "message": "must not be blank", "path": "/omni/externalVerification/ekyb-prefill" } ``` Wrong country code is provided (any value other than `GB`): ```json { "timestamp": 1782851583695, "status": 400, "error": "Bad Request", "message": "IllegalArgumentException: No enum constant com.incodesmile.onboarding.integration.external.government.ekyb.domain.entity.model.EkybCountry.GB", "path": "/omni/externalVerification/ekyb-prefill" } ``` No business match is found for the submitted `taxId`: ```json { "timestamp": 1782851583695, "status": 200, "message": "No business found matching the provided tax ID.", "path": "/omni/externalVerification/ekyb-prefill" } ``` ## Single Session Dashboard results Prefill results are available on the Business tab in [single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/united-states-govmatch` - URL: https://developer.incode.com/general-reference/united-states-govmatch/ - Markdown: https://developer.incode.com/general-reference/united-states-govmatch.md # United States GovMatch Incode GovMatch is an identity verification solution that securely confirms identity against state Department of Motor Vehicles (DMV) issuing databases in real time. GovMatch supports two complementary methods to verify a user: - [GovFaceMatch](#govfacematch): Performs a one-to-one biometric comparison of a user’s live selfie and identity attributes against the photo and identity record held in a participating state DMV database. - [GovDataMatch](#govdatamatch): Verifies user-submitted identity attributes (including name, date of birth, and document details) against the corresponding DMV record. As shown in the following map, most states support one of these methods and some states support both. The Incode module determines which method to use based on the state issuing the ID. When both methods are provisioned, priority is given to the GovFaceMatch method.
          ## Verification Methods ### GovFaceMatch GovFaceMatch is Incode’s direct connection to state DMV systems for biometric face comparison. During verification, the supported document data fields are sent to the DMV. If the document data fields match to a record within the DMV database, the uploaded selfie is compared against the official portrait stored in the state’s DMV database. A successful Face Match guarantees that the Data Match also passed, and provides the highest level of assurance that the person presenting the document is the legitimate holder. - **Provider**: Direct Incode-to-DMV integration - **Supported States**: CA\*, GA\*, MS, VA - **Verification method**: Biometric face matching against DMV photo on file & certain fields required by states. \* Requires separate approval from state DMV to enable For more, see [GovFaceMatch Technical Details](/general-reference/dmv-face-match-technical-details/). ### GovDataMatch GovDataMatch is Incode’s data verification service through AAMVA or through validation of Verifiable Credentials. During verification, the supported document data fields are validated against the data on the record held by the issuing state’s DMV. - **Provider**: AAMVA network, validation of Verifiable Credentials - **Supported States**: 46 states (all _except_ AK, CA, LA, MN, UT) - For most current state AAMVA provider state coverage information, visit: [https://aamva.org/it-systems-participation-map?id=594](https://aamva.org/it-systems-participation-map?id=594) - **Verification method**: Data field matching against authoritative DMV records For more, see [GovDataMatch Technical Details](/general-reference/dmv-data-match-technical-details/). #### Known State-Level Integration Differences Between Participating GovDataMatch States As each state has its own independent GovDataMatch integration, data field matching availability is not consolidated to a single standard. Below are the known state-level variations as provided by the latest official AAMVA documentation. :::info Incode observes some discrepancy cases in production that are pending official confirmation by AAMVA. ::: | State | Notes | | ----- | :------------------------------------------------------- | | AZ | Not supported | | DE | Not supported | | ID | Not supported | | KY | Not supported | | MI | Not supported | | ME | Not supported | | NE | Not supported | | NM | Not supported | | NC | Not available if person previously held a Driver License | | RI | Not supported | | TX | Not supported on ID cards issued pre-2009 | | VA | Not supported | | WI | Not supported | | State | Reason | | ----- | :----------------------------------------- | | AZ | AZ issues ID cards without expiration date | | DE | Data field not available for verification | | ID | Data field not available for verification | | KY | Data field not available for verification | | ME | Data field not available for verification | | MI | Data field not available for verification | | NE | Data field not available for verification | | NJ | Data field not available for verification | | NM | Data field not available for verification | | NC | Data field not available for verification | | RI | Data field not available for verification | | TX | Data field not available for verification | | VA | Data field not available for verification | | WI | Data field not available for verification | | State | ID Type | Issue | Impact | | ----- | :--------------------------- | :---------------------------------------------------- | :------------------------------------------------- | | CO | Some ID cards | Some have no expiration date (criteria not specified) | Cannot verify | | FL | Some ID cards | Some have no expiration date (criteria not specified) | Cannot verify | | IL | ID cards and Driver Licenses | Temporary credentials | Cannot verify issue date on temporary credentials | | IL | Temporary credentials | Cannot verify expiration on temporary credentials | Cannot verify | | MA | ID cards and Driver Licenses | Replacement/duplicate cards | New issue date printed but database keeps original | | MA | Pre-2010 ID cards | No expiration date | Cannot verify | | RI | Old cards | No expiration date | Cannot verify | | WY | Very old ID cards | No expiration date | Cannot verify | These states issue ID cards without expiration dates for certain age groups: | State | Age Threshold | Card Type | Notes | | ----- | ------------- | ---------------- | -------------------------------------------- | | AL | 62+ | Non-REAL ID only | REAL ID cards always have expiration | | AR | 60+ | Non-REAL ID only | REAL ID cards always have expiration | | IL | 65+ | All ID cards | No expiration for seniors | | MO | 70+ | Some ID cards | Varies by individual | | OK | 65+ | Non-REAL ID only | Shows "INDEF"; REAL ID has 4/8 year validity | | TN | 65+ | Non-REAL ID only | REAL ID cards always have expiration | | TX | 60+ | All ID cards | No expiration for senior | These states reuse the original issue date even on replacement cards: * AL * AR * DC * FL * IN * MS * NJ * SC * TX (for "Remade" cards only) ## Module Configuration You can add GovMatch to your [Workflows](https://developer.incode.com/docs/workflows-20) or [Flows](https://developer.incode.com/docs/flows-1) using the [Government Record Verification module](https://developer.incode.com/docs/government-record-verification). Then you can [configure the module settings](/dashboard-platform-administration/government-record-verification-dashboard/) to select the applicable fields for the input data and/or face you would like to collect from the end user. ## Single Session Dashboard Result **GovFaceMatch** **GovDataMatch** ### Interpreting GovMatch Results For each check performed, one of the following 3 statuses is returned: | **Status** | **Description** | **Notes** | | ---------- | :----------------------- | --------------------------------------------------------------------------------------- | | `OK` | Exact Match Verified | Session face or data field is an exact match to DMV records | | `FAIL` | Exact Match Failed | Mismatch between session face or data field and DMV records | | `UNKNOWN` | Verification unavailable | The submitted document or region isn’t supported or something went wrong when trying to perform validation. | For more specific information on scoring and response details, see either [GovFaceMatch](/general-reference/dmv-face-match-technical-details/) or [GovDataMatch](/general-reference/dmv-data-match-technical-details/).
          --- - Path: `general-reference/us-prefill` - URL: https://developer.incode.com/general-reference/us-prefill/ - Markdown: https://developer.incode.com/general-reference/us-prefill.md # United States eKYB Pre-fill in the US leverages official business registry data to automatically retrieve and populate business information based on a company's name and address, including the business name, registered address, entity type, registration status, and directors — without requiring manual input from the user. ## Source | Country | Source | Description | | --- | --- | --- | | United States | `US_KYB_PREFILL` | Returns matching US business details from official business registry data for pre-fill. | ## Direct API approach For general integration notes and shared response semantics, see the [eKYB Prefill API Reference](/general-reference/ekyb-prefill-api-reference/). All module configurations and user data can be forwarded directly in the request for performing a Prefill lookup. This overrides existing configuration and data collected about the user. ### Endpoint `POST /omni/externalVerification/ekyb-prefill` ### Request parameters | Parameter | Required | Description | | --- | --- | --- | | `plugins` | Mandatory | String array. Must be `["ekyb-prefill"]`. Specifies the Prefill flow. | | `source` | Mandatory | String. Must be `US_KYB_PREFILL`. Identifies the Prefill source. | | `country` | Mandatory | String. Two-letter Alpha-2 country code. Must be `US`. | | `businessName` | Mandatory | String. Registered name of the business. | | `address` | Mandatory | String. Business address as a freeform string. Must contain at minimum city + state (for example: `San Francisco, CA`). City alone is not accepted. | | `taxId` | Optional | String. US Employer Identification Number (EIN / TIN). When provided, adds `tinMatch` to the response. See Tax ID formats for details. | ### Tax ID formats EIN (Employer Identification Number), also referred to as TIN, is the US federal tax identifier assigned to businesses by the IRS. Providing `taxId` is optional. When included, it enables IRS TIN verification and adds `tinMatch` to the response. | Format | Example | | --- | --- | | 9 numeric digits, no spaces or special characters | `943320693` | ### Sample request ```javascript Node { "plugins": ["ekyb-prefill"], "source": "US_KYB_PREFILL", "country": "US", "businessName": "Acme Solutions LLC", "address": "San Francisco, CA", "taxId": "123456789" } ``` ### Sample response The Prefill response returns business data retrieved directly from the source of truth. `nameMatch`, `addressMatch`, and `tinMatch` reflect the result of comparing submitted inputs against registry data. ```javascript Node { "kyb-prefill": [ { "name": "Acme Solutions LLC", "nameMatch": "Approximate Match", "address": "742 Nebula Lane, San Francisco, CA 94107", "addressMatch": "Approximate Match", "tinMatch": "Verified", "entityType": "C_CORPORATION", "registrationStatus": "Active", "directors": [ { "name": "Ethan Caldwell", "positionName": "Chief Executive Officer" }, { "name": "Maya Reynolds", "positionName": "Officer" }, { "name": "Lucas Bennett", "positionName": "Director" }, { "name": "Sofia Mitchell", "positionName": "Assistant Secretary" } ] } ] } ``` :::info `addressMatch` is evaluated against all addresses on file for the business, not only the primary registered address. If the submitted city + state matches any address on file, the result may return as Verified or `Approximate Match` even when the primary registered address is in a different location. `tinMatch` is only present in the response when `taxId` was submitted in the request. When `taxId` is omitted, all other response fields are still returned. ::: ### Response fields | Key | Value | Description | | --- | --- | --- | | `name` | Business name | The registered legal name of the business as returned from the source of truth. | | `nameMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `businessName` against the name on file in the source of truth. See Name and address match values for details. | | `address` | Registered address | The primary registered address of the business as returned from the source of truth. | | `addressMatch` | Verified, Approximate Match, Unverified | Match result comparing the submitted `address` against all addresses on file for the business. See Name and address match values for details. | | `tinMatch` | Verified, Potential Match, Unverified | Match result from IRS TIN verification. Only present in the response when `taxId` was submitted in the request. See TIN match values for details. | | `entityType` | Entity type | The legal entity type of the business as returned from the source of truth (for example, `C_CORPORATION`, `LLC`). | | `registrationStatus` | Active, Inactive, Unknown | Current registration status of the business. See Registration status values for details. | | `directors` | Array of `{name, positionName}` | Officers and directors associated with the business as returned from the source of truth. `positionName` reflects the primary title on file. Includes directors, managers, and other officers — role types are not separated. | ### Name and address match values | Status | Description | | --- | --- | | `Verified` | Exact match found against registry data. | | `Approximate Match` | Similar match found; may reflect minor differences in naming or address formatting. | | `Unverified` | No match found in registry data. | ### TIN match values | Status | Description | | --- | --- | | `Verified` | The submitted TIN matches IRS records exactly. | | `Potential Match` | The submitted TIN is a partial or probable match against IRS records. | | `Unverified` | The submitted TIN does not match IRS records. | ### Registration status values | Status | Description | | --- | --- | | `Active` | The business is actively registered in at least one state. | | `Inactive` | The business registration is lapsed or dissolved. | | `Unknown` | The registration status could not be determined. | ### Error responses For standard HTTP response codes, see the API Error Response page. US Prefill returns the following country-specific 400 errors. `businessName` is missing or empty: ```javascript Node { "timestamp": 1782851408892, "status": 400, "error": "Bad Request", "message": "Missing required field: businessName.", "path": "/omni/externalVerification/ekyb-prefill" } ``` `address` is missing, empty, or cannot be resolved to at least city + state: ```javascript Node { "timestamp": 1782851468367, "status": 400, "error": "Bad Request", "message": "address must contain at minimum city and state.", "path": "/omni/externalVerification/ekyb-prefill" } ``` ## Single Session Dashboard results Prefill results are available on the Business tab in [Single Session view](/dashboard-platform-administration/single-session-view/). --- - Path: `general-reference/video-selfie-webhook` - URL: https://developer.incode.com/general-reference/video-selfie-webhook/ - Markdown: https://developer.incode.com/general-reference/video-selfie-webhook.md # Videoselfie upload webhook The Video Selfie Upload Webhook is triggered when the video selfie capture process is complete and the video data is successfully uploaded to the session. ## Endpoint details `POST https://{your-defined-url}` ### Request Below is an example of the payload that you will get when the webhook triggers ```json Sample request payload { "clientId": "", "flowId" : "", // the flow or configuration to which this interview belongs "interviewId": "" // the interview triggering the webhook (ie, the interview to which the video is attached) } ``` If you are [authenticating your webhook requests](/general-reference/authorizing-webhooks-requests/) , the webhook will contain the `Authorization` header along with the OAuth2.0 bearer token: `Authorization: Bearer ` If you configured additional custom headers, they will be included as well. ### Response To avoid our [retry policy](/general-reference/webhooks-overview/#retry-policy) to keep sending the same notification over and over, make sure your endpoint returns one of the following: * Status code `204 No content` * Status code `200 OK` with a response type `application/json`, for example `{ "success" : true }` ```json Sample response { "success" : true } ``` --- - Path: `general-reference/webhooks-overview` - URL: https://developer.incode.com/general-reference/webhooks-overview/ - Markdown: https://developer.incode.com/general-reference/webhooks-overview.md # Incode Webhooks ## What are webhooks? Webhooks are event notifications. They let your organization's application know when a specific event happens on the Incode platform or when a process initiated by a user is completed (also known as a callback). Your application can then take action based on the notification. Webhooks are asynchronous. That means the communication is one-way only, from Incode to your application. You must configure them if you want to use them. ## What webhooks are available? These webhooks are currently supported: - [Onboarding status webhook](/general-reference/onboarding-status-webhook/) - Triggered every time the status changes for an Onboarding Session. - [Videoselfie upload webhook](/general-reference/video-selfie-webhook/) - Triggered when the video selfie recording file (if applicable) becomes available. - [Global watchlists webhook](/general-reference/global-watchlists-webhook/) - Triggered when a global watchlist result is updated. - [Face Authentication webhook](/general-reference/face-authentication-webhook/) - Triggered when a face authentication either succeeds or fails. - [Work history webhook](/general-reference/work-history-webhook/) - Triggered after processing the work history search for a user. This webhook is exclusive to Mexico. - [Proof of payment webhook](/general-reference/payment-proof-webhook/) - Triggered after processing the payment proof validation for a user. This webhook is exclusive to Mexico. - [Session webhooks](/general-reference/session-webhooks/) - Set of four webhooks triggered by specific events during any type of session from a Flow or Workflow: - Session Started - Session Failed - Session Succeeded - Session Pending Review The following webhooks either have been or are soon to be deprecated: - Authentication webhooks - (soon to be deprecated) Available for 1:1 and 1:N. These contain information about the login attempt, any Identities which could match the face reported by the login, and the Onboarding Session (or interview) which best matches the biometric of the face used to login. - INE scraping webhook - (Deprecated) Provided INE Scraping results asynchronously. ## Configure webhooks To configure webhook behavior, go to the Incode Dashboard > Configuration -> Webhooks. ### Configure webhook destination You can configure a single URL per webhook. All notifications from that webhook will be sent to that destination. If you need the webhook notification to be sent to different endpoints in your system, you must broadcast it internally after receiving it at this single endpoint. ### Configure webhooks custom headers You can create custom headers that your endpoint receives as part of webhook notifications. You can create more than one header, but all headers are sent for all webhooks. Dynamic values are not supported. ## Retry Policy Webhook retries will be triggered in either of these scenarios: - A timeout is received when your endpoint is called. - A status code returned from your service is not one of: - `200 OK` along with the `application/json` header or - `204 No content` The webhook retry policy is exponential. It has an initial interval of 30s, a multiplier of 2.5, and a maximum of 5 attempts. This means the maximum time a webhook can take to reach its destination is approximately 32 minutes, as illustrated in the following table. | Retry attempt | Delay (seconds) | Delay (minutes) | Total (minutes) | | :------------ | :-------------- | :-------------- | :-------------- | | 1 | 30 | 0.50 | 0.5 | | 2 | 75 | 1.25 | 1.75 | | 3 | 187.5 | 3.13 | 4.88 | | 4 | 468.75 | 7.81 | 12.69 | | 5 | 1,171.88 | 19.53 | 32.22 | ## Allow webhook source IPs If your organization restricts inbound traffic for your network, make sure the following IP addresses are added to your allow list. **US Environment** - SAAS (production): | IP | Active | | :-------------- | :--------------------- | | `54.86.34.156` | Currently Active | | `3.142.125.52` | Currently Active | | `54.85.117.182` | As of February 2, 2026 | | `3.233.40.153` | As of February 2, 2026 | **DEMO (development) Environment** - Since October 2024,`34.198.171.165` (previously `18.210.119.234`). **EU Environment** - SAAS EU (production and demo): | IP | Active | | :-------------- | :--------------- | | `18.158.116.18` | Currently Active | | `3.127.31.138` | As of March 2026 | | `3.126.52.28` | As of March 2026 | | `3.126.161.252` | As of March 2026 | **Canada Environment** - SAAS CAN (production) | IP | Active | | --------------- | ---------------- | | `3.98.9.116` | Currently Active | | `16.174.49.119` | As of July 2026 | | `40.176.78.96` | As of July 2026 |
          --- - Path: `general-reference/work-history-webhook` - URL: https://developer.incode.com/general-reference/work-history-webhook/ - Markdown: https://developer.incode.com/general-reference/work-history-webhook.md # Work history webhook This webhook is exclusive to Mexico. The work history webhook provides the work history as soon as all asynchronous processes are complete and the data becomes available. This webhook is triggered when the `omni/process/imss` [endpoint](/reference/processimss/) is called and the data is done processing. This is the recommended approach for obtaining the work history data for an individual. # Work History Endpoint Details `POST https://{your-defined-url}` ## Request Below is an example of the payload that you will get in when the webhook triggers ```json Sample webhook payload { "interviewId": "12fj23j2ong0fs848bfks", "requestId": "72456dc1-1234-567c-8b9c-10br11122f9r", "workHistory": { "name": "Marry Sue", "curp": "abc123", "apiKey": "myapikey", "quotedWeeks": { "discountedWeeks": 0, "listedWeeks": 131, "reinstatedWeeks": 0 }, "laborHistoryList": [ { "companyName": "DIRECCION DE ADMINISTRACION CENTRAL", "state": "DISTRITO FEDERAL", "startingDate": "16/10/2021", "endingDate": "03/02/2023", "baseSalary": "$2593.5", "companyIMSSId": "Y123456789" }, { "companyName": "DIRECCION DE ADMINISTRACION CENTRAL", "state": "DISTRITO FEDERAL", "startingDate": "31/08/2021", "endingDate": "15/09/2021", "baseSalary": "$2240.5", "companyIMSSId": "Y987654321" }, { "companyName": "TECNOLOGIAS PUBLICA", "state": "DISTRITO FEDERAL", "startingDate": "01/07/2020", "endingDate": "31/08/2021", "baseSalary": "$2240.5", "companyIMSSId": "Y123459876" } ] } } ``` If you are [authenticating your webhook requests](/general-reference/authorizing-webhooks-requests/) , the webhook will contain the `Authorization` header along with the OAuth2.0 bearer token: `Authorization: Bearer ` If you configured additional custom headers, they will be included as well. ## Response To avoid our [retry policy](/general-reference/webhooks-overview/#retry-policy) to keep sending the same notification over and over, make sure your endpoint returns one of the following: * Status code `204 No content` * Status code `200 OK` with a response type `application/json`, for example `{ "success" : true }` --- - Path: `get-started-with-incode/getting-credentials` - URL: https://developer.incode.com/get-started-with-incode/getting-credentials/ - Markdown: https://developer.incode.com/get-started-with-incode/getting-credentials.md # Getting Your API Credentials Before you can make API calls or run SDK integrations, you need an Incode API key and a Client ID. How you get them depends on where you are in the process with Incode. *** ## If Your Organization Is Not Yet a Contracted Customer New prospects typically start in the **Demo environment**. This is Incode's shared, multitenant evaluation environment. Demo gives you full access to the Omni API for testing and proof-of-concept work without a production commitment. To request Demo environment access, contact your Incode representative or reach out through [the Incode website](https://incode.com). Once your access is set up, you'll receive a credentials bundle (see [What's in the credentials bundle](#whats-in-the-credentials-bundle) below). ### What to Expect During Evaluation Demo access typically comes with the following constraints: - **Time-limited access**: evaluation periods are time-boxed. Your Incode contact can confirm the duration for your engagement - **Synthetic data only**: use sample or test data during integration work. Avoid real end-user data in the Demo environment - **Volume and cost controls**: some verification checks in Demo may have usage limits, particularly those that involve third-party data providers - **Happy-path configuration**: Demo may require specific allowlist settings to test successfully with synthetic IDs. Your Incode contact can assist with this setup Access to a production environment before an MSA is signed is handled on a case-by-case basis and requires explicit approval. If you need production access during your evaluation, discuss this with your Incode contact early in the process. *** ## If Your Organization Is a Contracted Customer Once your contract is in place, you'll typically have access to two environments: | Environment | Purpose | | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | **Demo (Sandbox)** | Integration development, testing, CI pipelines. Use synthetic data. | | **Production** | Live customer verifications. Your production environment may be SaaS multitenant or a dedicated single-tenant deployment depending on your contract. | Each environment has its own set of credentials. Keep them separate and never use production credentials in development or test code paths. *** ## What's in the Credentials Bundle When your environments are provisioned, Incode shares a credentials bundle as described in this table. | Item | Description | | -------------- | -------------------------------------------------------- | | `clientId` | Identifies your organization's account in Incode Omni | | `apiKey` | Authenticates your API requests (keep this secret) | | API base URL | The root endpoint for Omni API calls in this environment | | Onboarding URL | The entry point for hosted onboarding flows | | Dashboard URL | The URL for your Omni Dashboard instance | Credentials are typically shared via a secure link using 1Password. Do not share API keys over email, Slack, or other unencrypted channels. *** ## Managing Your API Keys in Dashboard Once you have Dashboard access, you can [view and manage your API keys](/dashboard-platform-administration/configuration-api-keys-tab/) under **Configuration → API Keys**. *** ## Next steps With your credentials in hand: - See API Authentication Overview for how to use your credentials in API requests — required headers, token types, and session management. - See [Quick Start](/get-started-with-incode/quickstart/) to run your first verification end to end.
          --- - Path: `get-started-with-incode/glossary` - URL: https://developer.incode.com/get-started-with-incode/glossary/ - Markdown: https://developer.incode.com/get-started-with-incode/glossary.md # Incode Glossary This page defines the terms you will encounter across the Incode Platform documentation. Terms are grouped by topic. Use the alphabetical index below to jump directly to any term. *** ## Alphabetical Index [Admin Token](#admin-token) · [Age Assurance](#age-assurance) · [AML](#aml) · [API Key](#api-key) · [Authentication](#authentication) · [Authorization](#authorization) · [Biometric Template](#biometric-template) · [Capture-Only Mode](#capture-only-mode) · [Claims Match](#claims-match) · [Client ID](#client-id) · [Condition Node](#condition-node) · [Configuration ID](#configuration-id) · [Crosscheck](#crosscheck) · [Custom Fields](#custom-fields) · [Customer UUID](#customer-uuid) · [Dashboard](#dashboard) · [Device and Behavior Risk Check](#device-and-behavior-risk-check) · [Deepsight](#deepsight) · [Digital ID Verification](#digital-id-verification) · [Document Verification](#document-verification) · [eKYB](#ekyb) · [eKYC](#ekyc) · [Email Risk Check](#email-risk-check) · [EXIF](#exif) · [External Customer ID](#external-customer-id) · [External ID](#external-id) · [E2EE Mode](#e2ee-mode) · [Face Authentication](#face-authentication) · [Face Match](#face-match) · [Flow](#flow) · [Government Validation](#government-validation) · [IAM](#iam) · [Identity Provider (IdP)](#identity-provider-idp) · [Images](#images) · [Incode Identity](#incode-identity) · [interviewId](#interviewid) · [KYB](#kyb) · [KYC](#kyc) · [Liveness Detection](#liveness-detection) · [Manual Review](#manual-review) · [Module](#module) · [Module Node](#module-node) · [MRZ](#mrz) · [NFC Scan](#nfc-scan) · [OCR](#ocr) · [OIDC](#oidc) · [Omni API](#omni-api) · [Onboarding Attempts](#onboarding-attempts) · [Onboarding Session](#onboarding-session) · [PEP](#pep) · [Phone Risk Check](#phone-risk-check) · [Prizma](#prizma) · [Process Node](#process-node) · [Proof of Address](#proof-of-address) · [Queue](#queue) · [Result Node](#result-node) · [Rules Engine](#rules-engine) · [Score](#score) · [Silent Network Authentication (SNA)](#silent-network-authentication-sna) · [SDK](#sdk) · [Session Status](#session-status) · [Session Token](#session-token) · [UBO](#ubo) · [Video Selfie](#video-selfie) · [Watchlist](#watchlist) · [Webflow](#webflow) · [Webhook](#webhook) · [Workflow](#workflow) · [1:1 Face Authentication](#11-face-authentication) · [1:N Face Authentication](#1n-face-authentication) *** ## Sessions and Identifiers ### Onboarding Session A container for one user's identity verification process. Every image, document, selfie, score, and event produced during verification is attached to the session. A new session must be created for each verification attempt, even if the same person is attempting again. _Also called:_ interview, session → [Onboarding Session Lifecycle](onboarding-session-lifecycle) *** ### interviewId The unique identifier for an Onboarding Session. It is an alphanumeric string assigned by the Incode platform when a session starts. Every API call that reads or writes data for a specific session uses the `interviewId` to identify it. `interviewId` is the term used in code and API parameters. In Dashboard, the same identifier is called the **Session ID**. Both refer to the same value. *** ### Onboarding Attempts Each time a user goes through the onboarding process, that attempt creates a new Onboarding Session with a unique Session ID (interviewId), regardless of whether the user completed or abandoned the process. Key behaviors include: - Users can make multiple attempts using the same or different Workflow or Flow. - Each attempt has its own score, so the same person may have a different result for each attempt. - Multiple attempts by the same person can be linked using a shared externalCustomerId. *** ### Session Token A short-lived credential returned when a session is created. The session token is passed to the SDK so the front end can interact with Incode's API on behalf of that specific session. It is separate from the API key, which identifies your organization. The session token identifies one user's session. Do not expose your API key on the front end. Use the session token on the front end and keep the API key on your back end. → [How to get an access token](/reference/how-to-get-an-session-token/) *** ### Admin Token A credential used by your back end to call Incode API endpoints that require elevated access, such as fetching session results or verifying a face authentication attempt. The admin token is never sent to the front end. → [How to get an access token](/reference/how-to-get-an-session-token/) *** ### API Key A credential that identifies your organization to the Incode platform. It is included as the `x-api-key` header in every API request from your back end. Treat your API key as a secret — do not include it in front-end code or expose it in client-side logs. → [Request Header](/reference/how-to-get-an-session-token/#request-header) *** ### Configuration ID The identifier for a Flow or Workflow configuration as defined in the Omni Dashboard. Also called a **flow ID**. When you initialize an SDK session or start a session via the API, you pass the Configuration ID to tell the platform which set of modules and settings to use for that session. *** ### External Customer ID A string you define in your own system, such as a user ID or account number, that links an Incode Onboarding Session to a record in your database. It is stored in the session and returned in API responses and webhook payloads so you can match Incode results back to your users. Multiple onboarding attempts by the same person can be linked via the same `externalCustomerId`. *** ### External ID Similar to External Customer ID, but with different resumption behavior. If a session already exists for a given `externalId`, submitting the same value resumes that session instead of creating a new one. Use this when you want to prevent duplicate sessions for the same user. *** ### Custom Fields Key-value pairs that allow you to attach additional metadata to an Onboarding Session. Custom Fields are flexible tags you define that can be retrieved later via the API. They are useful for advanced session filtering, analytics, and integrations with external systems. *** ### Customer UUID A unique identifier assigned to a verified user when their Incode Identity is created after a successful onboarding. It represents the person's biometric identity in the Incode platform and is required for 1:1 face authentication on return visits. *** ### Session Status The current state of an Onboarding Session. Statuses are set by the platform as modules complete. Key statuses include: - `UNKNOWN`: Session created but no data collected yet - `ID_VALIDATION_FINISHED`: ID document processing is complete - `FACE_VALIDATION_FINISHED`: Selfie and face match processing is complete - `GOVERNMENT_VALIDATION_FINISHED`: Government database check is complete - `ONBOARDING_FINISHED`: All modules have run and the session is complete - `APPROVED`: Session score met the threshold and the user was approved - `MANUAL_REVIEW`: Session was flagged for human review - `MANUAL_REVIEW_APPROVED`: A reviewer approved the session - `MANUAL_REVIEW_REJECTED`: A reviewer rejected the session → [Onboarding Session Lifecycle](onboarding-session-lifecycle) *** ## Flows, Workflows, and Modules ### Flow A legacy configuration method for defining the steps of an Onboarding Session. Flows are configured in Dashboard and referenced by a Configuration ID. New integrations should use **Workflows** instead. Flows remain supported but are no longer the recommended approach. → [Flows](flows-1) *** ### Workflow The current, recommended way to configure an Onboarding Session. A Workflow is built in Dashboard using a visual drag-and-drop builder. It defines which verification modules run, in what order, and what logic determines the outcome. Workflows support conditional branching, meaning different users can follow different paths based on their data or scores. → [Workflows Overview](workflows) *** ### Module A single step in an Onboarding Session. Each module handles one task: for example, capturing an ID document, taking a selfie, or running an eKYC check. Modules are selected and configured when building a Flow or Workflow. Some modules collect data from the user (capture modules), and some process or validate data that was already collected (process modules). _Also called:_ Verification Module. → [Modules Overview and Availability](/features-and-modules/modules-overview-and-availability/) *** ### Module Node In the Workflow builder, a Module Node represents a step that involves the customer, such as ID capture, selfie capture, or consent. Module nodes are the interactive steps a user sees and acts on during an Onboarding Session. → [Create Workflows](/dashboard-platform-administration/workflows-20/#create-workflows) *** ### Process Node In the Workflow builder, a Process Node runs automatically without customer interaction. It processes or validates data collected by a preceding module: for example, running a face match after a selfie is captured, or performing an eKYC check after ID data is extracted. Process Nodes must follow the relevant Module Nodes in the workflow. → [Create Workflows](/dashboard-platform-administration/workflows-20/#create-workflows) *** ### Condition Node In the Workflow builder, a Condition Node branches the customer journey based on data or scores. For example, a condition can route a customer to manual review if their ID score is below a threshold or skip a step if a previous check already passed. Conditions use AND/OR logic and can evaluate scores, module results, or custom field values. → [Conditions for Workflows](/concepts-and-architecture/condition-use-cases/) *** ### Result Node In the Workflow builder, a Result Node ends a branch of the customer journey. Every branch in a Workflow must end with a Result Node. The Result Node sets the final outcome of the session for that path: `OK`, `FAIL`, `MANUAL`, or `WARN`. → [Create Workflows](/dashboard-platform-administration/workflows-20/#create-workflows) *** ### Webflow A hosted web application created in Dashboard that runs a complete Onboarding Session. Users access it via a URL; no SDK integration is required. Webflows are the no-code option for deploying identity verification. _Also called:_ Hosted Flow, Onboarding URL. *** ### Rules Engine A configuration tool in Dashboard that lets you define automatic decision logic for sessions using Flows. Rules evaluate scores and module results to determine whether a session is approved, denied, or sent to manual review without requiring custom back-end code. → [Flows](flows-1) *** ### Crosscheck A comparison step that checks whether a specific piece of data from one source matches the same data from another source within the same session. For example, a crosscheck can compare the name extracted from an ID document against the name on a utility bill submitted as proof of address. Crosschecks are configured in Dashboard and run as Process Nodes in a Workflow. → [Fetching Crosscheck Results](fetching-crosscheck-results) *** ## Scores and Decisions ### Score A numerical value that represents how confident the platform is in the result of a verification step. Each module produces its own score, and the platform calculates an overall session score based on the modules configured as validation modules. Your back end uses scores to approve, reject, or flag sessions for manual review. Score thresholds are configured per Flow or Workflow in Dashboard. *** ### Manual Review A state in which a session is held for a human reviewer to examine before a final decision is made. A session enters Manual Review when its score falls in a range defined as requiring human judgment, typically between the automatic-approve and automatic-reject thresholds. Reviewers access flagged sessions through Dashboard. *** ### Queue A named group to which sessions are assigned when they require manual review. Queues allow organizations to route sessions to specific reviewer teams: for example, by region, product line, or risk level. Queues are configured in Dashboard and can be specified per session when using the Video Conference module. *** ## Verification Capabilities ### Authentication Authentication is the process of confirming that users are who they say they are. It serves as the initial step in a security procedure. → [Onboarding or Authentication: When to Use Each](/concepts-and-architecture/onboarding-vs-authentication/) *** ### Authorization The process of granting a user permission to access a particular resource or perform a specific function. Authorization is often used interchangeably with access control or client privileges, but it is distinct from authentication: authentication verifies who a user is, while authorization decides what they are allowed to do. Incode does not provide an authorization layer. Incode returns a result, and your application decides what action to take. *** ### Liveness Detection A check that confirms a selfie was captured from a live person rather than from a photo, video, or synthetic image. The Incode platform supports both: - **Passive liveness**: No user action required. - **Active liveness**: The user is prompted to perform an action. Incode's liveness detection is certified to ISO/IEC 30107-3. Liveness detection within Incode's Deepsight suite is divided into three sub-checks: - **Physical Check**: Masks, printed photos - **Digital Check**: Screen replay, injected video - **Evasion Check**: Attempts to bypass detection → [Deepsight](/features-and-modules/deepsight/) *** ### Face Match A comparison between the selfie captured during an Onboarding Session and the photo on the ID document submitted in the same session. A passing face match confirms that the person holding the ID is the same person shown in the document. Face match is a process step that runs after both an ID capture and a selfie capture are complete. *** ### Face Authentication A post-onboarding capability that lets a previously verified user prove their identity using a selfie. Incode face authentication verifies identity, confirms that users are real, and detects common fraudulent behavior through liveness checks, physical and digital attack detection, image quality checks, and face checks such as lenses, hats, closed eyes, and face masks. Two modes are available: 1:1 (one-to-one) and 1:N (one-to-many). → [Face Authentication](/features-and-modules/face-authentication/) → [Onboarding or Authentication: When to Use Each](/concepts-and-architecture/onboarding-vs-authentication/) *** ### 1:1 Face Authentication In one-to-one face authentication, the user provides a selfie and an Authentication Hint—typically their customer UUID—to claim a specific identity. The platform compares the selfie's biometric template against the biometric template stored in that enrolled identity. *** ### 1:N Face Authentication In one-to-many face authentication, the user provides only a selfie. The platform compares the selfie's biometric template against all enrolled identities in the database and identifies the closest match, without requiring the user to claim an identity first. This capability is unique to Incode among major identity verification platforms. *** ### Incode Identity A record created in the Incode platform when a user successfully completes an Onboarding Session and is approved. It stores the user's biometric template, extracted from their selfie, and is identified by a Customer UUID. An Incode Identity is required for face authentication on return visits. If any module in the onboarding fails and the session is not approved, an Incode Identity is not created. → [View Identites in Dashboard](/dashboard-platform-administration/view-identities/) *** ### Biometric Template A mathematical representation of a person's facial features, generated from their selfie during onboarding. The template is used for face authentication; it is compared against a new selfie to confirm identity. The template itself is not a photograph; it cannot be reverse engineered into an image. *** ### OCR Optical Character Recognition (OCR) is the process of extracting text from an image. During an Onboarding Session, Incode uses OCR to read the data printed on an ID document and return it as structured data in the API response. The data extracted depends on the document type: a two-sided document such as a driver's license yields different fields than a one-sided document such as a passport. *** ### Document Verification The automated process of confirming that a government-issued identity document—such as a passport, driver's license, or national ID—is genuine, unaltered, and has not been previously used to commit fraud. Incode uses more than 35 in-house ML models to analyze ID images in real time. Document validation is available for over 10,000 document types and 200 countries and regions. Document verification detects: - Tampered photos and data fields - Counterfeit or non-compliant document formats - Reused or duplicated documents across sessions *** ### Digital ID Verification The automated process of accepting and validating digital identification documents, such as IDs stored in mobile wallets or issued through digital identity systems. Digital ID verification detects available digital IDs on a user's device, validates their authenticity and integrity via cryptographic checks, and automatically routes users to physical document verification when a digital ID is unavailable. *** ### Images Three main types of images may be captured and linked to an Onboarding Session: - Front and back images of an ID document (back image applies to two-sided documents such as driver's licenses). - Selfie images. - Images of supplementary documents, such as proof of address. A session may contain more than one image of the same type if a user needs to perform a recapture for any reason. *** ### EXIF Exchangeable Image File Format (EXIF) metadata is information automatically embedded in an image file by the device that captured it. It travels with the image and usually includes: - When the photo was taken (timestamp) - What device took it (camera make, model) - How it was taken (shutter speed, aperture, focal length, flash) - Where it was taken (GPS coordinates, if location was enabled) *** ### MRZ The Machine-Readable Zone (MRZ) is the two or three lines of text at the bottom of a passport or ID card that encode the document's key data in a standardized format. Incode reads and validates MRZ data as part of document verification. *** ### NFC Scan Near Field Communication (NFC) scan is a method of reading the embedded chip in an ePassport or chip-enabled ID card. NFC scanning retrieves digitally signed data directly from the chip, providing a higher level of document authenticity assurance than optical scanning alone. Available in the iOS, Android, and Flutter SDKs. *** ### Government Validation A verification step that checks identity data extracted from an ID document against an authoritative government database or registry. This confirms that the identity exists in the official record and matches the data on the document. Incode has direct integrations with government sources in Mexico (RENAPO, CURP, INE, SAT), Brazil, Argentina, Colombia, Chile, Peru, South Africa, Australia, and more. → [System-of-Records Documentation](/general-reference/government-verification-sources/) *** ### eKYC Electronic Know Your Customer (eKYC) is a non-document identity check that cross-references a user's data against trusted external data sources—such as credit bureau records, phone number registries, or email risk databases—to confirm the identity exists and is in good standing. eKYC checks supplement document and biometric verification and are commonly required for financial services compliance. → [eKYC Module](/features-and-modules/ekyc/) *** ### eKYB Electronic Know Your Business (eKYB) is a verification check that confirms a business entity is real, legally registered, and not subject to sanctions. eKYB can verify the business name, tax ID, registration status, address, and, where required, the identities of its Ultimate Beneficial Owners (UBOs). Incode supports eKYB in 15+ countries. → [eKYB Module](/features-and-modules/ekyb/) *** ### Email Risk Check An eKYC signal that evaluates the fraud risk of an email address a user submitted during sign-up or login. It analyzes indicators such as email age, reputation, usage patterns, spam signals, and watchlist status to produce a risk score. You can configure that risk score against low, medium, high, or custom thresholds to inform downstream decisioning. Email Risk Check detects: - Disposable, temporary, or undeliverable email addresses - Compromised or breach-exposed accounts - Suspicious usage patterns associated with fraud *** ### Phone Risk Check An eKYC signal that evaluates the fraud risk of a phone number a user submitted. It uses carrier data, number type, and historical usage to determine the phone number's validity, activity status, VOIP or prepaid classification, and leak exposure. It also determines a risk level (low, medium, high, or very high) to inform decisioning. Phone Risk Check detects: - Recycled, virtual (VoIP), or prepaid numbers commonly linked to fraud - Inactive, improperly formatted, or undeliverable numbers - Numbers with known spammer associations *** ### Device and Behavior Risk Check A passive fraud detection layer that analyzes the user's device environment and behavioral patterns throughout the verification session. Device intelligence covers attributes such as IP address, geolocation, OS/browser configuration, and network anomalies. Behavioral signals capture interaction patterns such as typing cadence, touch dynamics, and navigation flow. Together, they detect bots, account takeovers, and synthetic behavior in real time, triggering step-up verification only when risk is high. Device and Behavior Risk Check detects: - Device spoofing, emulation, proxy use, and network anomalies - Bot-like or scripted interaction patterns - Session behavior consistent with account takeover or synthetic identity fraud *** ### UBO The Ultimate Beneficial Owner (UBO) is the individual who ultimately owns or controls a business entity, typically defined as owning 25% or more of the company. Many KYB regulations require businesses to identify and verify their UBOs as part of onboarding. *** ### Proof of Address A document—such as a utility bill, bank statement, or government letter—that confirms a user's residential address. Incode can capture and process proof of address documents as a module in an Onboarding Session, including OCR extraction of the address and crosscheck comparison against the address on the user's ID. *** ### Watchlist A list of individuals or entities against which a user's identity is screened. The Incode platform supports three types: - **Global Watchlist**: Screens against international sanctions lists, Politically Exposed Persons (PEP) databases, and other regulatory watchlists. - **Custom Watchlist**: A list you manage in Dashboard. Can be configured as a Blocklist (deny matches) or an Allowlist (approve matches). - **Watchlist for Business**: A list that works together with eKYB. → [Watchlists](/features-and-modules/business-watchlist/) *** ### PEP A Politically Exposed Person (PEP) is an individual who holds or has held a prominent public position, such as a government official, senior executive of a state-owned company, or senior military officer. Regulatory frameworks require organizations to apply enhanced due diligence when onboarding PEPs. Incode's Global Watchlist module screens for PEPs as part of Anti-Money Laundering (AML) compliance. *** ### Age Assurance A module that estimates a user's age from their selfie using AI, without requiring a government ID. Age Assurance is used in regulated contexts where a platform needs to confirm a user meets a minimum age requirement. It is distinct from age verification via ID document. When Age Assurance is enabled, session recording options for ID Capture and Face Capture are restricted. Deepsight recordings are deleted on session completion. Age Assurance requires additional licensing. Contact your Incode Representative. *** ### Video Selfie A module that records a short video of the customer responding to voice-prompted questions. The video serves as a high-assurance liveness check and produces a video artifact for compliance and audit purposes. This module is unique to Incode: no other major IDV platform in this space offers a voice-prompted video selfie with a recorded Q\&A format. *** ### Silent Network Authentication (SNA) Silent Network Authentication is a carrier-based phone verification method that confirms a user's possession of a mobile number directly through the mobile network. Instead of relying on one-time passwords (OTP), SNA runs silently in the background. This eliminates user friction and protects against phishing, SIM swaps, and interception attacks. When SNA isn't available for a given number or carrier, flows automatically fall back to SMS OTP. See Silent Network Authentication for full details. *** ### Claims Match A step that cross-checks verified identity attributes—such as name, date of birth, phone number, or email—from an Incode session against records in an external directory, such as an identity and access management (IAM) system or HR database. Claims match is used to confirm that the person being verified matches a known record in your organization. It is available in Workforce integrations. *** ### Deepsight Incode's dedicated deepfake and fraud defense suite. Deepsight evaluates the authenticity of a selfie capture across multiple dimensions: - **Physical Check**: Detects physical spoofs such as printed photos, masks, and mannequins. - **Digital Check**: Detects digital attacks such as screen replay and injected video feeds. - **Evasion Check**: Detects attempts to bypass the liveness check system. - **Behavioral Trust**: Evaluates device and interaction behavior for anomalies. - **Device Trust**: Assesses the trustworthiness of the device being used. Deepsight also produces a Media Manipulation Index (MMI) score for document images, indicating whether a document image shows signs of digital manipulation. Deepsight requires additional licensing. Contact your Incode Representative. → [Deepsight](/features-and-modules/deepsight/) *** ## Platform Components ### Dashboard The web-based administration application for the Incode Platform. Used to configure Flows and Workflows, review session results, manage users and roles, set up webhooks, and access analytics. Both developers and operations teams use Dashboard. *** ### Omni API The REST API that powers the Incode platform. Your back end uses the Omni API to create sessions, submit verification data, retrieve scores and OCR results, and trigger platform actions. All API requests require an API key header (`x-api-key`) and most session-level requests also require a session token or admin token. → API Reference *** ### SDK The software development kit (SDK) is a library that handles the capture UI, camera management, and API communication for an Incode integration. Incode provides SDKs for Web, iOS, Android, React Native, Flutter, Xamarin, Cordova, and Ionic Capacitor. Using an SDK is the recommended integration approach for most use cases. It handles image quality optimization, device compatibility, and data submission automatically. → [SDK Reference](/sdk-reference/sdk-reference/) *** ### Prizma Incode's design system for user interfaces. Prizma provides a documented set of design tokens, component specifications, and customization guidelines that allow you to match the verification UI to your product's visual identity. It supports light and dark mode and includes V1 and V2 component comparisons. No other major IDV platform publishes a design system at this level of detail. → [Prizma Design System](/design-and-ux/prizma-design-foundations/) *** ### Capture-Only Mode An SDK integration mode for iOS and Android SDKs that separates the capture layer from the processing layer. In Capture-Only mode, the Incode SDK handles camera access and image quality optimization, but the captured data is sent to your own back end rather than directly to Incode's processing servers. Useful for privacy-constrained architectures or hybrid setups. *** ### E2EE Mode End-to-end encryption (E2EE) mode is an integration variant for iOS and Android SDKs in which all captured data is cryptographically encrypted on the device before transmission to Incode's servers. Useful for high-assurance deployments with strict data security requirements. No other major IDV platform publicly documents an E2EE integration mode. *** ### Webhook An HTTP callback that the Incode platform sends to your back end when a session event occurs: for example, when a session status changes, a module completes, or a video selfie is uploaded. Webhooks let your back end react to verification events without polling the API. Webhook requests can be authenticated using an OAuth 2.0 bearer token. → [Webhooks](/general-reference/webhooks-overview/) *** ## Compliance and Regulatory Terms ### KYC Know Your Customer (KYC) is a regulatory requirement that obligates financial institutions and other regulated organizations to verify the identity of their customers before and during a business relationship. KYC is a core driver for identity verification in banking, fintech, insurance, and other regulated industries. *** ### KYB Know Your Business (KYB) is the business-entity equivalent of KYC. Organizations in regulated industries must verify that businesses they onboard are legitimate, legally registered, and not subject to sanctions. They must also identify the individuals who own or control them. *** ### AML Anti-Money Laundering (AML) is a set of laws, regulations, and procedures that require financial institutions to detect and prevent money laundering. KYC and watchlist screening are both components of AML compliance. Incode's platform supports AML workflows through global watchlist screening, eKYC checks, and sanctions screening. *** ### IAM Identity and access management (IAM) is a framework for controlling who can access what resources in an organization. In the context of Incode's platform, IAM integration refers to connecting Incode's identity verification capabilities with IAM systems such as Okta or Microsoft Entra, so that verification results can drive access decisions. *** ### Identity Provider (IdP) A system that authenticates users and provides identity assertions to other applications. Incode can act as an Identity Provider using the OpenID Connect (OIDC) protocol, allowing other applications to accept Incode's biometric authentication as a login method. *** ### OIDC OpenID Connect (OIDC) is an authentication protocol built on top of OAuth 2.0. It allows applications to verify the identity of a user based on authentication performed by an Identity Provider. Incode supports OIDC for both consumer-facing authentication flows and workforce integrations with systems like Okta and Microsoft Entra. → [OIDC Automatic Configuration](/concepts-and-architecture/oidc-automatic-configuration/) → [OIDC Manual Configuration](/concepts-and-architecture/oidc-manual-configuration/) *** ### Client ID In the context of OIDC integrations, a client ID is the identifier assigned to your application when it is registered with Incode as an Identity Provider. It is included in OIDC authentication requests to identify which application is requesting authentication. --- - Path: `get-started-with-incode/onboarding-session-lifecycle` - URL: https://developer.incode.com/get-started-with-incode/onboarding-session-lifecycle/ - Markdown: https://developer.incode.com/get-started-with-incode/onboarding-session-lifecycle.md # Onboarding Session Lifecycle This page describes the main steps of an Incode Onboarding Session. Understanding these steps helps you successfully integrate Incode with your existing verification and onboarding processes. ![](https://files.readme.io/26a0e094f74215ea12f79212c35c1952908568217f09eee89590efdeb3d5858a-image.png)
          The main steps are: 1. **A new Onboarding Session is created**: A new Onboarding session must be created for each onboarding attempt. 2. **The customer completes the Onboarding Session**: The customer goes through the required verification modules, either on the Incode Webflow app or your own web or mobile app powered by the Incode SDK and APIs. 3. **Add-on modules are executed**: Run additional verification modules that may or may not require end-user interaction. This step is optional. 4. **Session is marked as complete**: After all the verification modules have been executed, the session must be marked as complete. This is a critical indicator of the conversion and completion metrics. 5. **Final results and onboarding data retrieval**: Get the final results (Scores) to make decisions and fetch the data collected during onboarding. There are two options: - Review and download results on Dashboard. - Call the Omni API from your back end. You can trigger this fetch process by notifying your back end from your web or mobile app using App Orchestration. Alternatively, your back end can wait for the Incode Platform [webhook](https://developer.incode.com/v1.1_shipweek/docs/glossary#webhook) notification. ## Onboarding Session Statuses All Onboarding Sessions have a completion status, which the Incode Platform automatically manages. The status changes depending on which modules are executed during the Onboarding Session. Not all verification modules influence the session status. The following diagram shows how statuses change during the Onboarding Session lifecycle: ![](https://files.readme.io/0135065bade94b9aa0dddb17286f5598d07c0f5fc4bd1b403559ecfc70b7de7e-image.png) Possible statuses include: - `UNKNOWN`: Initial status. No data has been collected yet. - `ID_VALIDATION_FINISHED`: ID document validation has finished. OCR data was extracted from the document. A score for this module has been calculated. - `POST_PROCESSING_FINISHED`: ID post-processing has finished. This status is used in specific implementations where extra data review is required. - `FACE_VALIDATION_FINISHED`: Face Match has been completed. This module compares the selfie captured with the photo from the ID document. A score for this module has been calculated. - `GOVERNMENT_VALIDATION_FINISHED`: Validation against a third-party source of truth has finished. A score for this module has been calculated. - `ONBOARDING_FINISHED`: The Onboarding Session has finished. The session has been marked "Completed." Scores and onboarding data are ready and can be fetched. - `MANUAL_REVIEW_APPROVED`: A session that was in a \_**Needs Review** state has been manually approved by a reviewer. - `MANUAL_REVIEW_REJECTED`: A session that was in \_**Needs Review** state has been manually rejected by a reviewer. *** ## Get Onboarding Status You can get the status of a specific Onboarding Session in one of two ways, depending on the integration type, application architecture, and your internal security policies. You can either: - Poll the Omni API endpoint `/omni/get/onboarding/status`. - Use the onboarding webhook notification. Refer to [Integrate by Platform](/integrate-by-platform/) for available options and integration guides.
          --- - Path: `get-started-with-incode/quickstart` - URL: https://developer.incode.com/get-started-with-incode/quickstart/ - Markdown: https://developer.incode.com/get-started-with-incode/quickstart.md # Quick Start: Your First Verification This guide has two parts: - [​Part 1](#part-1-create-and-run-a-verification-session) runs a real verification session using a hosted Incode Webflow—no code required. You see exactly what your customers experience before you write a single line of integration code. - [Part 2](#part-2-integrate-the-web-sdk) walks you through a minimal Web SDK integration that produces the same result programmatically. By the end, your app creates a session, runs ID and selfie capture, and reads the verification score. *** ## Part 1: Create and Run a Verification Session You will run a test verification session using a template Workflow. ### Step 1.1: Create a Workflow in Dashboard A Workflow defines the verification steps your users will go through. You need one before you can run a session. 1. Log in to Dashboard and click **Workflows** in the left menu. 2. Click **New**. 3. In the lower left corner of the Workflow builder, click **Template**. 4. Locate the Identity Verification template and click **Use**. This template comes pre-configured with the standard modules for a complete verification: Data Sharing Consent, ID Capture, ID Validation, Face Capture, Face Match, and a result condition. 5. If prompted to replace what's in the canvas with the template, click **Replace with template**. 6. In the top left corner, click **Edit** to give your Workflow a meaningful name. 7. Click **Save & Publish**. > 📘 Note > > You can configure Workflow-level settings and module-level settings to customize the data collected and the user experience. For this quick start, we recommend leaving the default configuration as-is. For a deeper look at creating Workflows, using templates, and changing configuration settings, see [Workflows](/dashboard-platform-administration/workflows-20/)​. ### Step 1.2: Copy Your Workflow ID and Onboarding URL When the Workflow is saved, Dashboard assigns it a unique Configuration ID (also called a Workflow ID). Active Workflows also have an Onboarding URL. You will need both later in this guide. To copy them: 1. In the left menu, click **Workflows**. 2. In the Actions column for the Workflow you created, click the three-dot menu. 3. Click **Copy ID**. This is the Workflow ID. Paste it somewhere you can easily access it later. 4. Click **Copy URL**. This is the Onboarding URL. Paste it somewhere you can easily access it later. You can also generate a session URL on demand from your back end. You will do this in Part 2. ### Step 1.3: Complete a Test Session 1. In the Actions column for the Workflow you created, click **Test workflow**. 2. Scan the QR code on your phone to open the Onboarding. 3. Go through the verification steps: 1. Grant camera permission when prompted. 2. Scan the front and back of a government-issued ID. 3. Take a selfie when prompted. 4. Wait for the result screen. The whole process should take under two minutes. ### Step 1.4: Review the Session in Dashboard In Dashboard, click **Sessions**. Your test session appears. Click it to review the scores, extracted OCR data, captured images, and the overall verification result. This is what your operations team will see for every user who goes through Onboarding. > 📘 Note > > A session has three phases: capture (the customer), process (Incode), and result (your back-end decision). Part 2 shows how to drive that same flow from your own application code. *** ## Part 2: Integrate the Web SDK You will build a minimal web application with two parts: - A **back-end endpoint** that creates an Incode session and returns the session token to your front end. - A **front-end page** that loads the Incode Web SDK, runs the verification modules, and calls your back end to retrieve the score when the session finishes. ### Step 2.1: Obtain Prerequisites Before you start, make sure you have: - Node.js 18 or higher, for the back-end server. - A browser with camera access. Chrome is recommended. Use your phone for best capture quality. - Your API key, API URL, and Flow configuration ID. - The Configuration ID of the Workflow you created in Step 1.1. You can find it in the Workflow's detail view in Dashboard. > 📘 Note > > The demo environment at `https://demo-api.incodesmile.com` is available for testing. Use it in place of your API URL until you are ready for production. ### Step 2.2: Set Up Your Project 1. Create a project folder and install dependencies: ```bash mkdir incode-quickstart && cd incode-quickstart npm init -y npm install express node-fetch dotenv ``` 2) Create a `.env` file in the project root: ```bash API_URL=https://demo-api.incodesmile.com API_KEY= FLOW_ID= # from Step 1.1 ``` > ⚠️ Warning > > Your API key must never appear in front-end code. This setup keeps it on the back end where it belongs. ### Step 2.3: Create the Back-End Server 1. Create `server.js`: ```javascript require('dotenv').config(); const express = require('express'); const app = express(); app.use(express.json()); app.use(express.static('public')); const API_URL = process.env.API_URL; const API_KEY = process.env.API_KEY; const FLOW_ID = process.env.FLOW_ID; // POST /start — create a new Incode session and return the token to the frontend app.post('/start', async (req, res) => { try { const response = await fetch(`${API_URL}/omni/start`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': API_KEY, }, body: JSON.stringify({ countryCode: 'ALL', configurationId: FLOW_ID, // externalCustomerId: req.body.userId, // optional: link to your user record }), }); if (!response.ok) { throw new Error(`Incode API error: ${response.status}`); } // Return token and interviewId to the frontend. // The frontend only ever sees the token — never the API key. const { token, interviewId } = await response.json(); res.json({ token, interviewId }); } catch (err) { console.error('Session creation failed:', err.message); res.status(500).json({ error: 'Could not create session' }); } }); // POST /finish — mark the session complete and fetch the score app.post('/finish', async (req, res) => { const { token, interviewId } = req.body; try { // Fetch the verification score using the session token. // X-Incode-Hardware-Id carries the session token for /0/ endpoints. const scoreRes = await fetch(`${API_URL}/0/omni/get/score`, { method: 'GET', headers: { 'api-version': '1.0', 'x-api-key': API_KEY, 'X-Incode-Hardware-Id': token, }, }); if (!scoreRes.ok) { throw new Error(`Score fetch failed: ${scoreRes.status}`); } const score = await scoreRes.json(); // In production, apply your business rules here. // score.idValidation.overall.status → 'OK', 'WARN', 'FAIL' // score.liveness.overall.status → 'OK', 'WARN', 'FAIL' // score.faceRecognition.overall.status → 'OK', 'WARN', 'FAIL' // score.overall.status → 'OK', 'WARN', 'FAIL', 'MANUAL' res.json({ interviewId, score }); } catch (err) { console.error('Finish failed:', err.message); res.status(500).json({ error: 'Could not retrieve score' }); } }); app.listen(3000, () => console.log('Server running at http://localhost:3000')); ``` 2. Start the server: ```bash node server.js ``` ### Step 2.4: Create the Front-End Page Create a `public/` folder, then create `public/index.html`: ```html Incode Quick Start

          Identity Verification

          Starting session...

          Verification Complete

          
            
          ``` > 📘 Note > > The CDN URL above references SDK version `1.85.0`. Always use the latest version — check [Web SDK Release Notes](/release-notes/releases-web-sdk/) for the current version number. *** ### Step 2.5: Run It on Your Phone The Incode Web SDK requires HTTPS and a real camera. For local development, use a tunneling tool to expose your local server over HTTPS: ```bash # Using ngrok (install from ngrok.com if needed) ngrok http 3000 ``` Copy the `https://` URL ngrok provides and open it on your phone. Go through the verification as you did in Part 1. When the selfie capture completes, your back end fetches the score and the result appears on screen. *** ### Step 2.6: Read the Score Your `/finish` endpoint returns a score object that looks like this: ```json { "idValidation": { "overall": { "value": "98.0", "status": "OK" } }, "liveness": { "overall": { "value": "100.0", "status": "OK" } }, "faceRecognition": { "overall": { "value": "97.5", "status": "OK" } }, "overall": { "status": "OK" } } ``` Use the `status` field—not the numeric `value`—to make decisions. The possible status values are: | Status | Meaning | | --------- | ------------------------------------------------------- | | `OK` | Module passed. | | `WARN` | Score is borderline; consider routing to manual review. | | `MANUAL` | Session requires a human reviewer. | | `FAIL` | Module failed. | | `UNKNOWN` | Result could not be determined. | A typical decision pattern in your back end: ```javascript const { overall } = score; if (overall.status === 'OK') { // Approve the user and continue your onboarding flow } else if (overall.status === 'WARN' || overall.status === 'MANUAL') { // Route to manual review queue } else { // Reject and prompt the user to try again or contact support } ``` *** ## What You Built In Part 1 you ran a live verification session and saw the result in Dashboard. In Part 2 you built a working integration that: 1. Creates a session from your back end using your API key. 2. Passes only the session token to the front end. 3. Runs ID capture, ID processing, and selfie capture using the Web SDK. 4. Retrieves the verification score from your back end after the session completes. This is the foundation every Incode web integration is built on. The same pattern applies whether you add more modules, switch to webhooks for async results, or move to a mobile SDK. *** ## What's Next | Goal | Where to go | | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Add consent, geolocation, or eKYC modules | [Web SDK Reference](/sdk-reference/web-sdk-reference/) | | Build a React integration | [React Native SDK Reference](/sdk-reference/react-native-sdk/) | | Receive results asynchronously instead of polling | [Webhooks](/general-reference/webhooks-overview/) | | Use a mobile SDK instead | [iOS](/sdk-reference/ios-sdk/) · [Android](/sdk-reference/android-sdk/) · [React Native](/sdk-reference/react-native-sdk/) · [Flutter](/sdk-reference/flutter-sdk/) · [Xamarin](/sdk-reference/xamarin-sdk/) · [Cordova](/sdk-reference/cordova-sdk/) | | Understand all score fields | [Fetch Score Data](/api-reference/get-score/) |
          --- - Path: `get-started-with-incode/welcome-to-incode` - URL: https://developer.incode.com/get-started-with-incode/welcome-to-incode/ - Markdown: https://developer.incode.com/get-started-with-incode/welcome-to-incode.md # Welcome to Incode Incode is an [identity verification (IDV)](https://developer.incode.com/get-started-with-incode/what-is-identity-verification/) platform. It helps: - **Onboard new customers** by confirming their identity exists and they are who they claim to be. - **Authenticate returning customers** against their identity established during onboarding. Incode combines document verification, biometric matching, liveness detection, and risk scoring. You can configure the user's journey through these verification checks according to your use case, region, and regulatory requirements. The Incode Platform provides a single ecosystem for configuring and integrating IDV, including low-code and no-code solutions. Review the [Choose Your Integration Path](#choose-your-integration-path) section below for an overview of ways to implement Incode. *** ## Key Concepts Review these key concepts before you begin: - **Onboarding Session**: A container for one customer's identity verification process. Every image, score, and result is tied to a unique Session ID, referred to as `interviewId` in the API. A new session is created for each verification attempt. - **Module: **A single step within a session. Examples include ID document capture, selfie capture, liveness check, face match, and eKYC database lookup. You choose which modules run and in what order by configuring [Workflows](https://developer.incode.com/concepts-and-architecture/workflows/) in Dashboard. - **Score and Result: **When customers complete modules, Incode returns a numerical score for each module and an overall session score. Your backend reads this score to make a decision: approve the customer, route them to manual review, or reject the attempt. [Read the full glossary](https://developer.incode.com/get-started-with-incode/glossary/)​ for more terms and definitions. *** ## Choose Your Integration Path Incode supports four integration methods. Choose the one that fits your use case. | Path | Best for | Starting point | | ------------------------------------------ | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Web SDK** | Browser-based applications | [Quick Start: Web SDK](/get-started-with-incode/quickstart/) | | **Mobile SDK** (iOS, Android, Hybrid SDKs) | Native mobile apps—higher capture quality and fraud signals | [Mobile Integration Overview](/integrate-by-platform/mobile-integration-overview/)| | **API only** | Backend batch processing—no SDK or frontend UI required | [API-Only Integration](/integrate-by-platform/single-onboarding/) | | **Hosted Workflow URL** (no-code) | Rapid deployment—Incode hosts the UI, you send users a link | [Flows and Workflows Overview](/integrate-by-platform/web-integrations-flows-workflows/) | If you're not sure which to choose, see the [full comparison of integration options by platform](/integrate-by-platform/). *** ## How a Verification Session Works Regardless of the path you choose, every Incode integration follows the same four-step sequence: 1. **Your backend creates a session**. Call `POST /omni/start` with your API key. Incode returns a session token. Store this token; all subsequent calls for this customer's verification are scoped to it. → [Start session API reference](/api-reference/start/) 2. **Your frontend runs the capture modules. **The SDK or Workflow guides your customer through the steps you have configured: ID scan, selfie, liveness check, and any others. Pass the session token to the SDK so all captured data is attached to the correct session. → [Onboarding process overview](/concepts-and-architecture/onboarding-vs-authentication/) 3. **Mark the session complete**. After the last module runs, call `POST /omni/finish-status` from your backend. This step is required; it signals to Incode that data collection is done and triggers final score calculation. 4. **Fetch scores and make a decision. **Read the verification score from the API or wait for Incode to send it to your backend via a webhook. Use the score to approve the user, route them to manual review, or reject the attempt. → [Session lifecycle and status reference](/get-started-with-incode/onboarding-session-lifecycle/)
          → [Webhooks overview](/general-reference/webhooks-overview/) *** ## What to Read Next | Topic | Link | Type | | ------------------------------------------------ | --------------------------------------------------------------------------------------------------------------- | --------- | | Platform concepts and terminology | [Incode Glossary](/get-started-with-incode/glossary/) | Concepts | | What identity verification is and why it matters | [What Is Identity Verification?](/get-started-with-incode/what-is-identity-verification/) | Concepts | | Build a working web integration end-to-end | [Quick Start: Web SDK](/get-started-with-incode/quickstart/) | Tutorial | | Integrate by Platform | [Integrate by Platform](/integrate-by-platform/) | Setup | | Explore all API endpoints | [API Reference](https://developer.incode.com/api-reference/interview/) | Reference | | Receive results asynchronously | [Webhooks](/general-reference/webhooks-overview/) | Reference | ***
          --- - Path: `get-started-with-incode/what-is-identity-verification` - URL: https://developer.incode.com/get-started-with-incode/what-is-identity-verification/ - Markdown: https://developer.incode.com/get-started-with-incode/what-is-identity-verification.md # What Is Identity Verification? Identity verification (IDV) is the process of confirming that a person is who they claim to be. It answers two questions: - Does this identity document belong to a real person? - Is the person presenting it the same person the document belongs to? You encounter IDV as a customer whenever you open a bank account online, board a flight, or verify your age on a regulated platform. As a developer, you're responsible for building the integration that makes IDV happen. *** ## Why Applications Need Identity Verification Regulations in financial services, healthcare, and other industries require organizations to verify the identity of their customers before granting access to certain services. The two most common regulatory frameworks are: - **Know Your Customer (KYC)**: Requires financial institutions to verify customer identity before and during a business relationship. KYC primarily prevents fraud, money laundering, and terrorist financing. KYC is mandated by Anti-Money Laundering (AML) laws in most jurisdictions. - **Know Your Business (KYB)**: The KYC equivalent for business entities. Before onboarding a business customer, a regulated organization must verify that the business is real, legally registered, and not subject to sanctions. In many jurisdictions, you must also identify the individuals who ultimately own or control the business, known as Ultimate Beneficial Owners (UBOs). Beyond regulatory compliance, you can use identity verification to: - Reduce fraud - Protect users from account takeover - Build trust in their platforms *** ## How Identity Verification Works A typical IDV flow includes three components that work together: - **Document verification** confirms that an identity document—such as a passport, driver's license, or national ID—is real. This involves checking the document structure, security features, and data fields against known templates for that document type. It also includes checks for document tampering and forgery. Incode supports verification of [4,600+ document types](/general-reference/supported-ids/) across more than 200 countries and territories, including NFC chip reading for ePassports. - **Biometric verification** confirms that the person presenting the document is the same person pictured in it. The customer takes a selfie, and the platform compares it against the photo on the document using facial recognition. A liveness check—either passive or active—runs at the same time to confirm the selfie is from a live person and not a photograph, screen replay, or synthetic image. Incode's liveness detection is certified to ISO/IEC 30107-3 and ranked among top performers in NIST FRVT testing. - **Data verification (eKYC)** optionally cross-references the identity data extracted from the document against authoritative external sources—government registries, credit bureaus, or watchlists—to further confirm that the identity exists and is in good standing. Incode connects to government sources in [8+ countries](/general-reference/government-verification-sources/), including deep integrations with Mexican government registries (RENAPO, CURP, INE, SAT) not available through any other platform in this space. *** ## What Can Go Wrong—and How Incode Detects It Identity fraud takes several forms, and a production IDV system needs to address all of them, including: - **Document fraud**: Using a forged, altered, or stolen document. Incode's document verification checks physical and digital security features, cross-references OCR-extracted data against document templates, and flags inconsistencies that indicate tampering. - **Presentation attacks**: Holding up a photo, playing a video, or using a mask to defeat the selfie capture. Incode's passive and active liveness detection, including its [Deepsight](/features-and-modules/deepsight/) deepfake defense suite, detects physical attacks (printed photos and masks) and digital attacks (screen replay, injection attacks, and synthetic face generations) as distinct check categories. - **Identity spoofing**: Using another real person's documents. The face match between the selfie and the document photo addresses this directly. For returning users, Incode's 1:N face authentication can identify a person against an entire enrolled database without requiring them to claim an identity first—a capability not offered by any other major IDV platform. This makes it particularly effective for detecting repeat fraud attempts under different identities. - **Synthetic identity fraud**: Combining real and fabricated data to create a fictitious identity. eKYC database checks, combined with device signals and behavioral data captured during the session, help identify patterns that are inconsistent with a genuine user. *** ## The Difference Between Verification, Authentication, and Authorization These three terms are frequently used interchangeably, but they describe distinct steps in a security flow. Knowing the difference between them prevents integration designs that skip steps or assign responsibilities to the wrong layer. Here's what they mean: - **Verification** happens once, or periodically when re-verification is required. It establishes who a user is and creates a durable record of that identity. A government ID is checked, a selfie is captured, and the two are matched. This is the foundation of any good onboarding flow. - **Authentication** happens repeatedly after verification. It confirms that the person accessing your application right now is the same person who was previously verified. Face authentication using a selfie is a common post-verification authentication method. Incode supports both: - **1:1 authentication**: The user claims an identity and the selfie is compared against that specific enrolled identity. - **1:N authentication**: The selfie is compared against all enrolled identities to identify the person without a prior claim. Authentication is also an important part of onboarding flows. - **Authorization** happens after authentication. It determines whether the verified, authenticated person has permission to perform a specific action or access a specific resource. Authorization is a decision your application makes based on the user's role, account status, jurisdiction, or other business rules. It is outside the scope of the IDV platform itself. Incode confirms who someone is; your application decides what they are allowed to do. Depending on why your application is using IDV, authorization may or may not be necessary. > 📘 Example > > First, a new customer completes onboarding and is verified (verification). They return the next day and pass a selfie check (authentication). Your backend then checks whether their account tier permits the transaction they are requesting (authorization). *** ## Privacy and Data Handling Identity verification involves collecting sensitive personal data, such as government ID images, selfie photographs, and biometric templates. Your integration is responsible for handling this data in compliance with applicable regulations, including GDPR in Europe and CCPA in California. Key design considerations include: - **Data minimization**: Only collect what is required for your use case. - **Consent**: Obtain explicit user consent before capturing biometric data. Incode's Workflow builder includes configurable consent modules for this purpose. - **Data residency**: Incode supports U.S., EU, and regional deployment options to satisfy data localization requirements. - **Retention**: Establish and enforce policies for how long verification data is stored. Incode holds SOC 2 Type II certification and is GDPR and CCPA compliant. HIPAA compliance is also available for healthcare use cases. *** ## What Incode Adds to the Picture Most IDV platforms handle the core document-plus-selfie flow. Incode offers the expansion and configurability of what happens around that core: - **Modular Workflow builder**: Configure the exact verification steps your use case requires, with conditional branching logic, without writing orchestration code. - **LATAM government depth**: Direct integrations with government registries in Mexico, Brazil, Argentina, Colombia, Chile, Peru, and more; a coverage depth not available with any competitor. - **Flexible integration**: Seven mobile SDK frameworks (iOS, Android, React Native, Flutter, Xamarin, Cordova, Ionic Capacitor), Web SDK, REST API, hosted no-code Flows, kiosk mode, and an end-to-end encrypted integration variant. - **Session completeness**: A single onboarding session can combine document verification, biometric liveness, eKYC checks, business verification (eKYB), custom forms, consent capture, and a video conference review module if needed. - **Prizma design system**: A documented, token-based UI customization system with light/dark mode support. It lets your integration look and feel native to your application, as opposed to a generic third-party widget. *** Now that you understand what identity verification is and what Incode does, the next step is understanding the [core concepts](/get-started-with-incode/glossary/) specific to building with the Incode platform. --- - Path: `integrate-by-platform/api-batch-processing` - URL: https://developer.incode.com/integrate-by-platform/api-batch-processing/ - Markdown: https://developer.incode.com/integrate-by-platform/api-batch-processing.md # API Batch Processing Incode SDKs use our API to capture and read session data. Therefore, anything added to a session via SDK can also be added via API calls. Batch processing enables you to run a complete onboarding using only API calls in sequential order, without using any of the available SDKs. This section explains how to set up batch processing for a basic onboarding flow. If your flow includes additional modules, you will need to adjust for them. :::warning While batch processing may seem more convenient, Incode cannot guarantee the quality of captured images since you're not using our SDKs. You must already have the user's images before you can run a batch process. Depending on your source for these images, the results of API-based onboardings may be as good as the ones done using the standard, SDK-based onboardings. ::: ## Before You Begin To follow all the steps for setting up batch processing, make sure you have: * An API key (provided by Incode) * A Configuration ID for the flow you want to use. To copy it, go to **Dashboard** > **Flow Builder** > **Flows** or **Workflows**. For Flows, locate the flow you want to use, and click Copy in the Actions column. For Workflows, click the three dots in the Actions column and select **Copy ID**. * Postman. Sample code and `cURL` requests are shared in the following pages. You can use the `cURL` samples to import them into Postman and try them. ## Basic Onboarding Flow The following pages explain each of these steps in a basic onboarding flow from a batch processing perspective. We always recommend using our SDKs instead for the best quality results. * [Start onboarding session](/integrate-by-platform/api-onboarding-start-session/) * [ID Validation](/integrate-by-platform/api-onboarding-id-validation/) * [Face Validation](/integrate-by-platform/api-onboarding-face-validation/), including liveness and face match * [Complete the session](/integrate-by-platform/api-onboarding-complete-session/) --- - Path: `integrate-by-platform/api-onboarding-complete-session` - URL: https://developer.incode.com/integrate-by-platform/api-onboarding-complete-session/ - Markdown: https://developer.incode.com/integrate-by-platform/api-onboarding-complete-session.md # Complete Onboarding Session ## Introduction Onboarding sessions must be completed in order to finalize session processing. Completing the session results in: * The session shows as **COMPLETED** on your Incode Dashboard. * Incode applies any business rules you have set in the Dashboard and recalculates the score based on those rules. * Incode sets the onboarding status to `ONBOADING_FINISHED` and triggers the [onboarding status webhook](/general-reference/onboarding-status-webhook/) with this status. To learn more about what happens when you call the endpoint to complete the session, see the [Mark onboarding complete](ref:finishsession) API documentation. ## Sample Code ```curl curl --location 'https://demo-api.incodesmile.com/0/omni/finish-status' \ --header 'Content-Type: application/json' \ --header 'api-version: 1.0' \ --header 'X-Incode-Hardware-Id: ' ``` ```javascript Nodejs const axios = require('axios'); const config = { method: 'get', url: 'https://demo-api.incodesmile.com/omni/finish-status', headers: { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '', 'X-Incode-Hardware-Id': '' } }; axios(config).then(function (response) { console.log(response.data); }).catch(function (error) { console.log(error); }); ``` ```java var client = HttpClient.newHttpClient(); var request = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/finish-status")) .header("Content-Type", "application/json") .header("api-version", "1.0") .header("x-api-key", "") .header("X-Incode-Hardware-Id", "") .GET() .build(); var response = client.send(request, BodyHandlers.ofString()); System.out.println(response.body()); ``` ```csharp using var client = new HttpClient(); client.DefaultRequestHeaders.Add("Content-Type", "application/json"); client.DefaultRequestHeaders.Add("api-version", "1.0"); client.DefaultRequestHeaders.Add("x-api-key", ""); client.DefaultRequestHeaders.Add("X-Incode-Hardware-Id", ""); var response = await client.GetAsync("https://demo-api.incodesmile.com/omni/finish-status"); var responseString = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseString); ``` ```python import requests url = "https://demo-api.incodesmile.com/omni/finish-status" headers = { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '', 'X-Incode-Hardware-Id': '' } response = requests.get(url, headers=headers) print(response.text) ``` --- - Path: `integrate-by-platform/api-onboarding-face-validation` - URL: https://developer.incode.com/integrate-by-platform/api-onboarding-face-validation/ - Markdown: https://developer.incode.com/integrate-by-platform/api-onboarding-face-validation.md # Face Validation ## Introduction Incode performs two validations related to a face (or selfie image): * **Liveness validation**: Performed as soon as you add a selfie image to a session via the endpoint `/omni/add/face/third-party?imageType=selfie`. It protects you against someone uploading a pre-existing photo and claiming it's a selfie. * **Face Match validation**: Compares the selfie image against the face that appears on an ID uploaded as part of the same session. This check is performed when you call the endpoint `/omni/process/face?imageType=selfie`. It will not work if you have not already uploaded an ID, so it's important to perform these steps in the order we've discussed them (see [ID Validation](/integrate-by-platform/api-onboarding-id-validation/)). Face validation requires these two endpoint calls and you must perform them in the order shown: * Add face/Selfie image * Process face ## Header requirements Both endpoints require these header values: | Header | Value | | :--------------------- | :--------------------------------------------------------------------------------------- | | `x-api-key` | The API key provided to you by Incode. | | `api-version` | "1.0" | | `X-Incode-Hardware-Id` | The Session Token obtained when you started the onboarding session. | ## Body/image requirements Images must be provided in the request body as a base64 encoded string. They must meet these requirements: * Minimum of 1000 pixels on one dimension, either width or height. * Cannot exceed 10 MB ## Sample Code ### Add face ```curl curl --location 'https://demo-api.incodesmile.com/omni/add/face/third-party?imageType=selfie' \ --header 'Content-Type: application/json' \ --header 'api-version: 1.0' \ --header 'x-api-key: ' \ --header 'X-Incode-Hardware-Id: ' \ --data '{ "base64Image": "" }' ``` ```Text Nodejs const axios = require('axios'); const fs = require('fs'); // Read your image file and encode as base64 const imageFilePath = 'path/to/your/image.jpg'; const base64 = fs.readFileSync(imageFilePath, { encoding: 'base64' }); const data = JSON.stringify({ base64Image: base64 }); const config = { method: 'post', url: 'https://demo-api.incodesmile.com/omni/add/face/third-party?imageType=selfie', headers: { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '', 'X-Incode-Hardware-Id': '' }, data : data }; axios(config).then(function (response) { console.log(response.data); }); ``` ```java var client = HttpClient.newHttpClient(); // Read your image file and encode as base64 Path imagePath = Path.of("path/to/your/image.jpg"); String base64 = Base64.getEncoder().encodeToString(Files.readAllBytes(imagePath)); var request = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/face/third-party?imageType=selfie")) .header("Content-Type", "application/json") .header("api-version", "1.0") .header("x-api-key", "") .header("X-Incode-Hardware-Id", "") .POST(BodyPublishers.ofString("{\"base64Image\":\"" + base64 + "\"}")) .build(); var response = client.send(request, BodyHandlers.ofString()); System.out.println(response.body()); ``` ```csharp using var client = new HttpClient(); // Read your image file and encode as base64 var imageFilePath = "path/to/your/image.jpg"; var base64 = Convert.ToBase64String(File.ReadAllBytes(imageFilePath)); var json = "{\"base64Image\":\"" + base64 + "\"}"; var content = new StringContent(json, Encoding.UTF8, "application/json"); client.DefaultRequestHeaders.Add("api-version", "1.0"); client.DefaultRequestHeaders.Add("x-api-key", ""); client.DefaultRequestHeaders.Add("X-Incode-Hardware-Id", ""); var response = await client.PostAsync("https://demo-api.incodesmile.com/omni/add/face/third-party?imageType=selfie", content); var responseString = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseString); ``` ```python import requests import base64 # Read your image file and encode as base64 image_file_path = 'path/to/your/image.jpg' with open(image_file_path, "rb") as image_file: base64 = base64.b64encode(image_file.read()).decode('utf-8') url = "https://demo-api.incodesmile.com/omni/add/face/third-party?imageType=selfie" payload = { "base64Image": base64 } headers = { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '', 'X-Incode-Hardware-Id': '' } response = requests.post(url, json=payload, headers=headers) print(response.text) ``` After a face has been added successfully, you can see the liveness score by going to Dashboard > Sessions, then locating and selecting the session. To learn more the request / response for this endpoint, see the [Add face/Selfie image](/api-reference/add-face-third-party/) API endpoint documentation. ### Process face ```curl curl --location 'https://demo-api.incodesmile.com/omni/process/face?imageType=selfie' \ --header 'Content-Type: application/json' \ --header 'api-version: 1.0' \ --header 'x-api-key: ' \ --header 'X-Incode-Hardware-Id: ' \ --data '{}' ``` ```javascript Nodejs const axios = require('axios'); const data = JSON.stringify({}); const config = { method: 'post', url: 'https://demo-api.incodesmile.com/omni/process/face?imageType=selfie', headers: { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '', 'X-Incode-Hardware-Id': '' }, data : data }; axios(config).then(function (response) { console.log(response.data); }); ``` ```java var client = HttpClient.newHttpClient(); var request = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/process/face?imageType=selfie")) .header("Content-Type", "application/json") .header("api-version", "1.0") .header("x-api-key", "") .header("X-Incode-Hardware-Id", "") .POST(BodyPublishers.ofString("{}")) .build(); var response = client.send(request, BodyHandlers.ofString()); System.out.println(response.body()); ``` ```csharp using var client = new HttpClient(); var json = "{}"; var content = new StringContent(json, Encoding.UTF8, "application/json"); client.DefaultRequestHeaders.Add("api-version", "1.0"); client.DefaultRequestHeaders.Add("x-api-key", ""); client.DefaultRequestHeaders.Add("X-Incode-Hardware-Id", ""); var response = await client.PostAsync("https://demo-api.incodesmile.com/omni/process/face?imageType=selfie", content); var responseString = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseString); ``` ```python import requests url = "https://demo-api.incodesmile.com/omni/process/face?imageType=selfie" payload = {} headers = { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '', 'X-Incode-Hardware-Id': '' } response = requests.post(url, json=payload, headers=headers) print(response.text) ``` After a face has been processed successfully, you can see the face-match score by going to Dashboard > Sessions, then locating and selecting the session. To learn more the request / response for this endpoint, see the [Process face](/api-reference/process-face/) API endpoint documentation. --- - Path: `integrate-by-platform/api-onboarding-id-validation` - URL: https://developer.incode.com/integrate-by-platform/api-onboarding-id-validation/ - Markdown: https://developer.incode.com/integrate-by-platform/api-onboarding-id-validation.md # ID Validation ## Introduction Depending on the type of ID document the user has provided, up to three endpoint calls may be required to validate the ID. If a document only has one side, such as a passport, there is no need to call the `back-id` endpoint. However, endpoints should be called in the general order shown: 1. Add front side of ID `/omni/add/front-id/v2` 2. Add back side of ID `/omni/add/back-id/v2` 3. Process Id `/omni/process/id` > 📘 Can I reprocess an ID using an existing upload? > > No. If you need to reprocess an ID, you must repeat the upload of ID images before calling the `/omni/process/id` endpoint again. ## Header requirements Each of the three endpoints requires these header values. | Header | Value | | :--------------------- | :--------------------------------------------------------------------------------------- | | `x-api-key` | The API key provided to you by Incode | | `api-version` | "1.0" | | `X-Incode-Hardware-Id` | The Session Token obtained when you started the onboarding session. | ## Body/image requirements Images of ID documents must be provided in the request body as a base64 encoded string. Both front and back ID images are subject to these requirements: * Images should be at least 1000 pixels on one dimension, either width or height. * Requests cannot exceed 10 MB. * IDs must be fully visible in the image. No edges or corners should be removed. Otherwise, the image is invalid. * There should be some padding (space) between the image edges and the ID edges, as illustrated here. Otherwise, the image is invalid. | Image | Description | | :----------------------------------------- | :--------------------------------------------------------------------------------------------- | | ![](https://files.readme.io/8e3ae24-1.png) | Valid image. There's a clear padding between the ID and the image borders. Id is fully visible | | ![](https://files.readme.io/93704d9-2.png) | Invalid image. The ID is cropped and not fully visible | | ![](https://files.readme.io/2041e2b-3.png) | Invalid image. While the ID is fully visible, there's no padding with the image borders. | ## Sample Code ### Front Id ```curl curl --location 'https://demo-api.incodesmile.com/omni/add/front-id/v2' \ --header 'Content-Type: application/json' \ --header 'api-version: 1.0' \ --header 'x-api-key: ' \ --header 'X-Incode-Hardware-Id: ' \ --data '{ "base64Image": "" }' ``` ```javascript Nodejs const axios = require('axios'); const fs = require('fs'); // Read your image file and encode as base64 const imageFilePath = 'path/to/your/image.jpg'; const base64 = fs.readFileSync(imageFilePath, { encoding: 'base64' }); const data = JSON.stringify({ base64Image: base64 }); const config = { method: 'post', url: 'https://demo-api.incodesmile.com/omni/add/front-id/v2', headers: { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '', 'X-Incode-Hardware-Id': '' }, data : data }; axios(config) .then(function (response) { console.log(response.data); }) .catch(function (error) { console.log(error); }); ``` ```java var client = HttpClient.newHttpClient(); // Read your image file and encode as base64 Path imagePath = Path.of("path/to/your/image.jpg"); String base64 = Base64.getEncoder().encodeToString(Files.readAllBytes(imagePath)); var request = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/front-id/v2")) .header("Content-Type", "application/json") .header("api-version", "1.0") .header("x-api-key", "") .header("X-Incode-Hardware-Id", "") .POST(BodyPublishers.ofString("{\"base64Image\":\"" + base64 + "\"}")) .build(); var response = client.send(request, BodyHandlers.ofString()); System.out.println(response.body()); ``` ```csharp using var client = new HttpClient(); // Read your image file and encode as base64 var imageFilePath = "path/to/your/image.jpg"; var base64 = Convert.ToBase64String(File.ReadAllBytes(imageFilePath)); var json = "{\"base64Image\":\"" + base64 + "\"}"; var content = new StringContent(json, Encoding.UTF8, "application/json"); client.DefaultRequestHeaders.Add("api-version", "1.0"); client.DefaultRequestHeaders.Add("x-api-key", ""); client.DefaultRequestHeaders.Add("X-Incode-Hardware-Id", ""); var response = await client.PostAsync("https://demo-api.incodesmile.com/omni/add/front-id/v2", content); var responseString = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseString); ``` ```python import requests import base64 # Read your image file and encode as base64 image_file_path = 'path/to/your/image.jpg' with open(image_file_path, "rb") as image_file: base64 = base64.b64encode(image_file.read()).decode('utf-8') url = "https://demo-api.incodesmile.com/omni/add/front-id/v2" payload = { "base64Image": base64 } headers = { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '', 'X-Incode-Hardware-Id': '' } response = requests.post(url, json=payload, headers=headers) print(response.text) ``` You don't need to store anything from the response. To learn more about what the response includes, see the [Add front side of ID](/api-reference/add-front-id-v2/) endpoint documentation. *** ### Back Id ```curl curl --location 'https://demo-api.incodesmile.com/omni/add/back-id/v2' \ --header 'Content-Type: application/json' \ --header 'api-version: 1.0' \ --header 'x-api-key: ' \ --header 'X-Incode-Hardware-Id: ' \ --data '{ "base64Image": "" }' ``` ```javascript Nodejs const axios = require('axios'); const fs = require('fs'); // Read your image file and encode as base64 const imageFilePath = 'path/to/your/image.jpg'; const base64 = fs.readFileSync(imageFilePath, { encoding: 'base64' }); const data = JSON.stringify({ base64Image: base64 }); const config = { method: 'post', url: 'https://demo-api.incodesmile.com/omni/add/back-id/v2', headers: { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '', 'X-Incode-Hardware-Id': '' }, data : data }; axios(config).then(function (response) { console.log(response.data); }); ``` ```java var client = HttpClient.newHttpClient(); // Read your image file and encode as base64 Path imagePath = Path.of("path/to/your/image.jpg"); String base64 = Base64.getEncoder().encodeToString(Files.readAllBytes(imagePath)); var request = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/add/back-id/v2")) .header("Content-Type", "application/json") .header("api-version", "1.0") .header("x-api-key", "") .header("X-Incode-Hardware-Id", "") .POST(BodyPublishers.ofString("{\"base64Image\":\"" + base64 + "\"}")) .build(); var response = client.send(request, BodyHandlers.ofString()); System.out.println(response.body()); ``` ```csharp using var client = new HttpClient(); // Read your image file and encode as base64 var imageFilePath = "path/to/your/image.jpg"; var base64 = Convert.ToBase64String(File.ReadAllBytes(imageFilePath)); var json = "{\"base64Image\":\"" + base64 + "\"}"; var content = new StringContent(json, Encoding.UTF8, "application/json"); client.DefaultRequestHeaders.Add("api-version", "1.0"); client.DefaultRequestHeaders.Add("x-api-key", ""); client.DefaultRequestHeaders.Add("X-Incode-Hardware-Id", ""); var response = await client.PostAsync("https://demo-api.incodesmile.com/omni/add/back-id/v2", content); var responseString = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseString); ``` ```python import requests import base64 # Read your image file and encode as base64 image_file_path = 'path/to/your/image.jpg' with open(image_file_path, "rb") as image_file: base64 = base64.b64encode(image_file.read()).decode('utf-8') url = "https://demo-api.incodesmile.com/omni/add/back-id/v2" payload = { "base64Image": base64 } headers = { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '', 'X-Incode-Hardware-Id': '' } response = requests.post(url, json=payload, headers=headers) print(response.text) ``` You don't need to store anything from the response. To learn more about what the response includes, see the [Add back side of ID](/api-reference/add-back-id-v2/) endpoint documentation. *** ### Process Id ```curl curl --location 'https://demo-api.incodesmile.com/omni/process/id' \ --header 'Content-Type: application/json' \ --header 'api-version: 1.0' \ --header 'x-api-key: ' \ --header 'X-Incode-Hardware-Id: ' \ --data '{}' ``` ```javascript Nodejs const axios = require('axios'); const config = { method: 'post', url: 'https://demo-api.incodesmile.com/omni/process/id', headers: { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '', 'X-Incode-Hardware-Id': '' } }; axios(config).then(function (response) { console.log(response.data); }); ``` ```java var client = HttpClient.newHttpClient(); var request = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/process/id")) .header("Content-Type", "application/json") .header("api-version", "1.0") .header("x-api-key", "") .header("X-Incode-Hardware-Id", "") .POST(BodyPublishers.ofString("{}")) .build(); var response = client.send(request, BodyHandlers.ofString()); System.out.println(response.body()); ``` ```csharp using var client = new HttpClient(); var content = new StringContent("{}", Encoding.UTF8, "application/json"); client.DefaultRequestHeaders.Add("api-version", "1.0"); client.DefaultRequestHeaders.Add("x-api-key", ""); client.DefaultRequestHeaders.Add("X-Incode-Hardware-Id", ""); var response = await client.PostAsync("https://demo-api.incodesmile.com/omni/process/id", content); var responseString = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseString); ``` ```python import requests url = "https://demo-api.incodesmile.com/omni/process/id" headers = { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '', 'X-Incode-Hardware-Id': '' } response = requests.post(url, json={}, headers=headers) print(response.text) ``` This is the final ID validation step. After this step completes successfully, you can see the ID section score by going to **Dashboard** > **Sessions**, then locating and selecting the session. You can also view the score using the [fetch scores api](/api-reference/get-score/). :::warning Do not use these versions unless otherwise stated. They contain variants, beta features and configurations specific for certain use cases. If you have any questions, please contact your CSM. ::: --- - Path: `integrate-by-platform/api-onboarding-start-session` - URL: https://developer.incode.com/integrate-by-platform/api-onboarding-start-session/ - Markdown: https://developer.incode.com/integrate-by-platform/api-onboarding-start-session.md # Start Onboarding Session ## Introduction Batch process onboardings begin with a call to the [start onboarding](/api-reference/start/) endpoint. This call creates a new Incode onboarding session (sometimes called an interview), and returns a JSON response that contains metadata about the newly created session. Check the [start onboarding](/api-reference/start/) documentation for a complete reference of the endpoint's inputs and output. ## Requirements This request uses the following header values and body key/value pairs: ### Headers | Header | Value | | :------------ | :------------------------------------ | | `api-version` | "1.0" | | `x-api-key` | The API Key provided to you by Incode | ### JSON Request Body | Key | Value | | :------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `configurationId` | **Required**: The Incode Flow identifier, also referred to as the Flow ID, for your new sessions. If you don't know the Flow ID, open Dashboard > Flows, locate the Flow you want to reference, and click Copy Flow ID in the Actions column. | | `externalCustomerId` | **Optional**: ID that links the new onboarding session to a specific ID you provide. You can query all the sessions related to this ID on the Incode Dashboard. For example, you may have assigned an ID to the customer in another system and want to be able to find all sessions related to that customer ID. | ## Handling the JSON response The metadata returned in the response includes the Session Token. Store this value. It will be needed in subsequent endpoint calls. ## Sample code ```curl curl --location 'https://demo-api.incodesmile.com/omni/start' \ --header 'Content-Type: application/json' \ --header 'api-version: 1.0' \ --header 'x-api-key: ' \ --data '{ "countryCode": "ALL", "configurationId": "", "externalCustomerId" : "" } ' ``` ```javascript Nodejs const axios = require('axios'); const data = JSON.stringify({ countryCode: "ALL", configurationId: "", externalCustomerId: " }); const config = { method: 'post', url: 'https://demo-api.incodesmile.com/omni/start', headers: { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '' }, data : data }; axios(config).then(function (response) { const token = response.data.token; console.log(token); }).catch(function (error) { console.log(error); }); ``` ```java Java var client = HttpClient.newHttpClient(); var request = HttpRequest.newBuilder() .uri(URI.create("https://demo-api.incodesmile.com/omni/start")) .header("Content-Type", "application/json") .header("api-version", "1.0") .header("x-api-key", "") .POST(BodyPublishers.ofString("{\"countryCode\":\"ALL\",\"configurationId\":\"\", \"externalCustomerId\": \"\"}")) .build(); var response = client.send(request, BodyHandlers.ofString()); var jsonResponse = new JSONObject(response.body()); var token = jsonResponse.getString("token"); System.out.println(token); ``` ```csharp C# using var client = new HttpClient(); var json = "{\"countryCode\":\"ALL\",\"configurationId\":\"\", \"externalCustomerId\": \"\"}"; var content = new StringContent(json, Encoding.UTF8, "application/json"); client.DefaultRequestHeaders.Add("api-version", "1.0"); client.DefaultRequestHeaders.Add("x-api-key", ""); var response = await client.PostAsync("https://demo-api.incodesmile.com/omni/start", content); var responseString = await response.Content.ReadAsStringAsync(); var token = JObject.Parse(responseString)["token"].ToString(); Console.WriteLine(token); ``` ```python Python import requests url = "https://demo-api.incodesmile.com/omni/start" payload = { "countryCode": "ALL", "configurationId": "", "externalCustomerId": "" } headers = { 'Content-Type': 'application/json', 'api-version': '1.0', 'x-api-key': '' } response = requests.post(url, json=payload, headers=headers) token = response.json()['token'] print(token) ``` :::warning Do not use these versions unless otherwise stated. They contain variants, beta features and configurations specific for certain use cases. If you have any questions, please contact your CSM. ::: --- - Path: `integrate-by-platform/backend` - URL: https://developer.incode.com/integrate-by-platform/backend/ - Markdown: https://developer.incode.com/integrate-by-platform/backend.md # Incode Omni API Integration This section covers how to integrate with the Incode Platform using the Omni API. It covers the full onboarding lifecycle: starting a session, generating a URL for that session, running onboarding through direct API calls, and fetching results once onboarding finishes. - **Create an Onboarding Session**: Start a new onboarding session with the `/omni/start` endpoint. This page covers the required headers, request body values, and how to handle the response. - **Generate Onboarding URL**: Generate a unique URL for an onboarding session using the `/omni/onboarding-url` endpoint. This page covers the required headers and includes sample code. - **API Batch Processing**: Run a complete onboarding using only API calls, in sequential order, without an SDK. This page also covers the setup you need before you begin and links to each step in a basic onboarding flow. - **How to Fetch Results and Data**: Learn what data is available once onboarding finishes, including scores, OCR data, device and geolocation data, and uploaded images. This page also covers how to trigger result retrieval, either through a webhook notification or your own app logic. --- - Path: `integrate-by-platform/fetch-device-info` - URL: https://developer.incode.com/integrate-by-platform/fetch-device-info/ - Markdown: https://developer.incode.com/integrate-by-platform/fetch-device-info.md # Fetch Device Information and Geolocation Data ## What is device information and geolocation data? Device information is all data that helps identify the device used for an onboarding session, such as the user cellphone. This data is not secretly collected. Your application should directly report this to Incode with the related SDK methods. Geolocation data is a subset of device information. Expressed as latitude/longitude, geolocation data represents the physical location in the world where the onboarding took place. ### How can I access device information? You can view device information for an onboarding session by going to Dashboard > Sessions. Locate and select the session you want to view, then click the Other tab and scroll down to the Device and Location sections. You can use the [fetch device info](/api-reference/get-device-info/) API endpoint to obtain the information as a JSON response. You can also test the endpoint yourself at preceding link to our API documentation. This is the same API endpoint used by the Incode Dashboard. When you fetch device information for a given onboarding session yourself, you should always pass the session's unique interview ID, also called the Session ID, to the [fetch device info](/api-reference/get-device-info/) API endpoint. If you do not pass the interview ID, we will attempt to extract the interview ID from the session token. ## What device information is available? While device information can vary, you can typically get the following commonly used device information: * IP address of the device * IP geolocation of the device (the latitude and longitude of the device IP may differ from the geolocation data of the device itself) * Device geolocation data * Hash (unique device identifier) * Device (for example, the brand or type of cellphone) * OS Version * Device model * Browser (for websdk-created sessions) * SDK Version --- - Path: `integrate-by-platform/fetch-extracted-ocr` - URL: https://developer.incode.com/integrate-by-platform/fetch-extracted-ocr/ - Markdown: https://developer.incode.com/integrate-by-platform/fetch-extracted-ocr.md # Fetch OCR Data ## What is OCR data? Optical Character Recognition (OCR) data for an onboarding contains all information extracted from the ID document during the session. This includes both text information and available barcode or machine-readable zone (MRZ) data read and decoded from the back of the ID. > 📘 Different documents, different data > > Data in ID documents can vary widely. Therefore, this endpoint's response is dynamic. It will only contain the information relevant to the detected ID. If you use compiled languages (like Java or C#) to consume these endpoint responses, be aware that your JSON parsers could break if a property you expect is missing. ### How can I fetch OCR data? To fetch OCR data for a given onboarding session, you should always pass the session's unique interview ID, also called the Session ID, to the [fetch ocr data](/api-reference/get-ocr-data/) API endpoint. You can also test this endpoint at the preceding link. If you do not pass the interview ID, Incode attempts to extract it from the session token. ## Common use cases ### To extract information from the ID document attached to session The following sample shows some of the most commonly used OCR fields from the ID document. It is not a complete list, since the fields vary from document to document. A longer JSON response example with additional fields is at the end of this article. ```json JSON { "name": { "fullName": "", "firstName": "", "paternalLastName": "", "maternalLastName": "", // Optional "givenName": "", "middleName": "", // Optional "nameSuffix": "", // Optional "machineReadableFullName": "", // Optional, full name from Barcode or MRZ "givenNameMrz": "", // Optional "lastNameMrz": "" // Optional }, "address": "", // Optional, address as read from ID "addressFields": { "street": "", // Optional "colony": "", // Optional, not applicable for all countries "postalCode": "", // Optional "city": "", // Optional "state": "" // Optional }, "typeOfId": "", // Id classification, ie: Drivers License, Voter Identification, etc. "issuedAt": 0, // Issue date, expressed as a epoch timestamp in milliseconds "expireAt": 0, // Expiration date, expressed as a epoch timestamp in milliseconds "issuingCountry": "", // Optional "documentNumber": "", // Optional "fullAddress": true, //Optional. True if address from id is full (has three lines) "cic": "", // Mexican INE only "ocr": "", // Mexican INE only } ``` ### To extract information from the POA document attached to session When you need to extract the address or information from a POA document added to a session, you can access these fields in the JSON response: ```json JSON { "documentType": "", // Classifier of the provided POA document "poaName": "", // The name that appears in the provided POA document "addressStatementEmissionDate": "", // Expiration date, expressed as a epoch timestamp in milliseconds "addressFromStatement": "", // Full address read from statement "addressFieldsFromStatement": { "street": "", "colony": "", "postalCode": "", "city": "", "state": "" }, } ``` These fields should be enough to answer questions like: * What's the address in the POA document? * What name appears in the POA document? * When was the POA document issued? * What kind of document was used as POA? ## Other OCR data extraction endpoints The preceding samples come from the standard [ocr data](/api-reference/get-ocr-data/) endpoint. Incode offers two alternative endpoints for OCR data extraction, although these are less likely to be needed: - [OCR data v2](/api-reference/get-ocr-data-v2/) wraps the response from the `ocr-data` endpoint under an `ocrData` field. It returns the same data as [ocr data](/api-reference/get-ocr-data/) endpoint. - [Second Id's OCR data](/api-reference/get-ocr-data-second-id/) is required if your flow is configured to have two ID documents attached to the same session. This will provide you with OCR data from the second ID. > 📘 Scores and OCR Data > > OCR data shows in the Incode Dashboard along with some scoring. This scoring relates solely to the level of confidence on the data extracted from the captured image of the ID. Level of confidence for OCR data does not directly affect or alter the score of a session. --- - Path: `integrate-by-platform/fetch-images` - URL: https://developer.incode.com/integrate-by-platform/fetch-images/ - Markdown: https://developer.incode.com/integrate-by-platform/fetch-images.md # Fetch Images ## What are onboarding images Any image added to an onboarding session can be retrieved later. Depending the configured flow, images could include selfies, document images, and so on. You can extract these images to store them in your own system. ### How can I fetch onboarding images? Incode offers two main options: * Obtaining images as base64 encoded images * Get temporary links to a URL where you can fetch these images. The links last for only one hour. ### Fetching images as base64 Use the [fetch images](/api-reference/get-images/) API endpoint. You should always pass the session's unique interview ID, also called the Session ID. If you do not pass the interview ID, Incode attempts to extract it from the Session Token. For the payload, pass an array with the images you wish to fetch: `"images": [""]`. You can see what values are allowed inside the `images` array payload in [fetch images](/api-reference/get-images/) API endpoint documentation. You can also test the endpoint yourself at this link. > If the user has multiple images of the same type, such as front id, the endpoint will only return the most recently added image. This sample JSON file shows a formatted request body and response body. ```json json // request body { "images": [ "selfie", "fullFrameFrontID" ] } // response body { "selfie": "", "fullFrameFrontID": "" } ``` > 📘 Fetch as few images as possible per request. > > If the response exceeds 10 MB, you will receive a 502 error (bad gateway). ### Fetching images as links Use the [fetch image links](/api-reference/get-images-v2/) endpoint. You should always pass the session's unique interview ID, also called the Session ID. If you do not pass the interview ID, Incode attempts to extract it from the Session Token. For the payload, pass an array with the images you wish to fetch: `"images": [""]`. When you choose to fetch image links, the response includes **all** previous attempts for a given image type, For example, front-id will have all the attempts registered for the user of the front-id capture. Previous attempts are listed under a `_prevAttemps` field. This is a dictionary where the keys are numeric values representing the timestamp of when the capture was made, shown in [unix time](https://en.wikipedia.org/wiki/Unix_time), in milliseconds. Cropped versions of images are not available for this endpoint. ### Sample ```json json // request body { "images": [ "selfie", "fullFrameFrontID" ] } // response body { "fullFrameFrontID": "", "fullFrameFrontID_prevAttempts": { "1713571344335": "", // latest timestamp, same link as above (fullFrameFrontID) "1713571314141": "" }, "selfie": "", "selfie_prevAttempts": { "1713571323431": "" // succeeded on first try, same link as above (selfie) } } ``` ## Other image extraction endpoints The preceding endpoints can meet the most common requirements to gather onboarding images. Incode offers two additional endpoints related to image extraction, although these are less likely to be needed: 1. [Second Id's images](/api-reference/get-images-second-id/) is required if your flow is configured to have two ID documents attached to the same session. This will provide you with images related to the second IId. 2. [Fetch concatenated images](/api-reference/get-concatenated-images/) fetches all the latest images combined in a single image. --- - Path: `integrate-by-platform/fetch-scores` - URL: https://developer.incode.com/integrate-by-platform/fetch-scores/ - Markdown: https://developer.incode.com/integrate-by-platform/fetch-scores.md # Fetch Score Data ## What is score data? Score data includes all results associated with the checks and validations included in a given flow configuration. ### How can I see score data? You can see this data by either: * Going to Dashboard > Sessions, locating the session you want to review, and selecting it. * Using the [fetch scores](/api-reference/get-score/) API endpoint to obtain the data as a JSON response. You can also test this endpoint yourself at the preceding link. This is the same API endpoint used by the Incode Dashboard. To fetch score data for a given onboarding session, you must pass the session's unique interview ID, also called the Session ID, to the [fetch scores](/api-reference/get-score/) API endpoint. If you do not pass the interview ID, Incode attempts to extract it from the session token. ### When is score data available? Scores are calculated once an onboarding is finished and after rules have been applied. The associated score data can be viewed or fetched once the onboarding session has been marked as complete via the [finish-status endpoint](ref:finishsession) ## How should I interpret score data? In the Incode Dashboard, the Overall Status score is presented using the model of a traffic signal: * **Green**: `OK`; a passing score; that is, a *go* * **Yellow**: `WARN`; there are concerns in the data score; that is, a *caution* * **Red**: `FAIL`; that is, a *stop* Even when you choose to directly fetch the data, keep this model in mind. While there may be dozens of scores and tests in every session, the most important score is always Overall Status. This is a composite score which factors in all the tests included in the settings of your configured flow. Due to the complex nature of flow's and score calculations, we do not recommend you consider the numeric values of individual validations. Although this might be tempting, the Overall Status should be your guide to the outcome of the completed session. ## Sample JSON File Following is a sample JSON file as retrieved using the [fetch scores](/api-reference/get-score/) API endpoint. This sample reflects the settings and results of a given flow. Your files will be based on your flows and may not look exactly like this one. However, the sample gives an idea of how you can use it to check the onboarding session's overall status, as well as the overall status per module validation. It also provides an explanation of the different JSON response parameters. ```json JSON { ..., // subscores fields "idValidation": { "photoSecurityAndQuality": [ ... ], "idSpecific": [ ... ], "overall": { "value": "100.0", // avoid validating against this value "status": "OK" // this is the value you care about } }, "liveness": { ..., "overall": { "value": "100.0", // avoid validating against this value "status": "OK" // this is the value you care about } }, "faceRecognition": { "existingUser": true, // If true. this tells you if the user had a previous approved onboarding session "existingInterviewId": "", // this is the original approved session from this user ..., "overall": { "value": "83.2", // avoid validating against this value "status": "OK" // this is the value you care about } }, "appliedRule": { // When a rule is applied it appears here "name": "Undeage Rule", // Name of the rule that got applied "expression": "underageCheck_STATUS == 'FAIL'", // The expression that got applied "ruleType": "total", // Type of the rule "status": "FAIL", // The new score that got applied "incodeScoreOverall": { // The score before it got triggered "value": "94.4", "status": "OK" } }, "overall": { "value": "94.4", // avoid validating against this value "status": "OK" // this is the value you care about }, "reasonMsg": "" // reason for the obtained overall score } ``` > 📘 Scores and OCR Data > > Optical Character Recognition (OCR) data shows in the Incode Dashboard along with some scoring. This scoring relates solely to the **level of confidence** on the data extracted from the captured image of the ID. Level of confidence for OCR data does not directly affect or alter the score of a session. --- - Path: `integrate-by-platform/fetch-videos` - URL: https://developer.incode.com/integrate-by-platform/fetch-videos/ - Markdown: https://developer.incode.com/integrate-by-platform/fetch-videos.md # Fetch Videoselfie Video File ## What is the videoselfie video file? This file is available only when the videoselfie module is part of your onboarding flow. In this case, you can fetch the final video file once the user has completed the module. The video might not be immediately available, because it can take a period of time for the video encoded video file to be ready. ## How do I know when the video file is ready? You can learn when the file is ready in either of these ways: * Incode can notify you via the [videoselfie upload webhook](/general-reference/video-selfie-webhook/) * You can apply polling to our [fetch scores](/api-reference/get-score/) endpoint, and check for the ` videoFileIsPresent ` flag as shown in the following example: ```json Score Response { // other scores "videoConference": { // ... other scores "videoFileIsPresent": { "status": "OK" // this one is OK once we have the file available for download } } } ``` ## How can I fetch video file? Use the [get download URL of video recording](/api-reference/generatevideoselfiedownloadurl) endpoint to obtain a signed, temporary URL to download the video file. The URL is valid for one hour, but if it expires you can regenerate the URL as many times as needed. ## Sample response ```json { "url": "" } ``` --- - Path: `integrate-by-platform/generate-onboarding-url` - URL: https://developer.incode.com/integrate-by-platform/generate-onboarding-url/ - Markdown: https://developer.incode.com/integrate-by-platform/generate-onboarding-url.md # Generate Onboarding URL ## Introduction A unique URL can be generated for each onboarding session. Most of the values come from the previously created Session Token. For that reason, configurations that you might want attached to the generated URL, such as `configurationId` or ` redirectionUrl`, must be sent in the previous [Start onboarding](https://developer.incode.com/api-reference/start/) step. Check the [fetch onboarding url](https://developer.incode.com/api-reference/onboarding-url/) documentation for a full reference of the endpoint's inputs and output. ## `/omni/onboarding-url` requests This request uses the following header values: ### Headers | Header | Value | | :--------------------- | :-------------------------------------------------------------------- | | `X-Incode-Hardware-Id` | **Required**: The Session Token for this session | | `api-version` | **Required**: 1.0 | | `clientId` | **Required**: Your client ID as provided in the query params. | These are the only required header values unless you are only using a QR code. Additional parameters are recommended if your onboarding Flow includes SMS verification, desktop verification, or both. See the [fetch onboarding url](https://developer.incode.com/api-reference/onboarding-url/) documentation for more information. ## Sample code ```curl curl --location 'https://demo-api.incodesmile.com/0/omni/onboarding-url' \ --header 'Content-Type: application/json' \ --header 'api-version: 1.0' \ --header 'X-Incode-Hardware-Id: <>' \ ``` ```javascript Nodejs const axios = require('axios'); const params = new URLSearchParams({ clientId: < }); const config = { url: 'https://demo-api.incodesmile.com/0/omni/onboarding-url', headers: { 'Content-Type': 'application/json', 'api-version': '1.0', 'X-Incode-Hardware-Id': , } }; axios(config).then(function (response) { const url = response.data.url; console.log(url); }).catch(function (error) { console.log(error); }); ``` --- - Path: `integrate-by-platform/how-to-fetch-onboarding-results-and-data` - URL: https://developer.incode.com/integrate-by-platform/how-to-fetch-onboarding-results-and-data/ - Markdown: https://developer.incode.com/integrate-by-platform/how-to-fetch-onboarding-results-and-data.md # How to Fetch Results and Data ## Available Results and Data Once the onboarding process has finished and all required Incode Modules have been executed, you can get the results. With the Incode Core Modules, you can get the following data: * Scores Results ([`Fetch scores`](/api-reference/get-score/)) * OCR Data ([`Fetch OCR data`](/api-reference/get-ocr-data/)) * Device Information and Geolocation Data ([`Fetch device info`](/api-reference/get-device-info/)) * Uploaded Images (ID, Selfie, PoA) ([`Fetch image links`](/api-reference/get-images-v2/)) Additional results may be available if your Flow called additional Modules. ## How to Fetch Results and Data You can trigger fetching the Onboarding Results by notifying your back end in either of the following ways: * **Incode webhook notification**: In this approach, the Omni Platform notifies your application back end when the onboarding process is finished. [Learn more about Webhooks here](/general-reference/webhooks-overview/). * **Web or mobile orchestrated**: Here your web or mobile app has control of the onboarding process. In this case, your app is responsible for notifying your back end that the process is finished. Then the back end can fetch the results and data. --- - Path: `integrate-by-platform/integrate-by-platform` - URL: https://developer.incode.com/integrate-by-platform/ - Markdown: https://developer.incode.com/integrate-by-platform.md # Integrate by Platform Incode supports multiple integration methods across web and mobile platforms. This section guides you through the setup and implementation details for each approach. Use the tables below to identify the right integration method for your platform and technical requirements. ## Web These integration methods run Incode’s identity verification in a browser environment. They vary in how much code you write and how much control you have over the user experience. | Integration Method | What it is | Technical effort | | ----------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | | [Flows / Workflows](/integrate-by-platform/web-integrations-flows-workflows/) | A hosted, Incode-managed web app your users complete at a URL you share or redirect to. Configured in Dashboard; no front-end code required. | Minimal. Backend session start recommended | | [iFrame](/integrate-by-platform/web-integrations-iframe/) | Embed the Incode-hosted flow inside your own web page using an HTML ` ``` > The `allow` attribute is required. Without `camera` and `microphone` permissions explicitly granted, the browser will block the iFrame from accessing device hardware, and the verification flow will fail. ## Detecting session completion Listen for a `postMessage` event from the iFrame to know when the user has finished: ```jsx window.addEventListener('message', (event) => { if (event.data?.type === 'ONBOARDING_FINISHED') { // Session complete — fetch results or redirect the user } }); ``` For a full list of event types, see the [Onboarding Session Lifecycle](/get-started-with-incode/onboarding-session-lifecycle/). ## Retrieving results Once the session is complete, retrieve results via: - **Webhook**: Configure an [Onboarding Status Webhook](/general-reference/onboarding-status-webhook/) or [Session Webhooks](/general-reference/session-webhooks/) to receive real-time notifications - **API**: Call [How to Fetch Results and Data](/integrate-by-platform/how-to-fetch-onboarding-results-and-data/) endpoints directly from your backend ## When to use this approach The iFrame approach is a good fit when: - You want users to stay on your domain throughout the verification process - You have a backend but want to minimize front-end development - You don't need to customize the verification UI If you need users to complete verification on a separate page, consider [Redirect URL](/integrate-by-platform/web-integrations-redirect-url/) instead. If you need full UI control, see [Web SDK](/integrate-by-platform/web-integrations-websdk/). --- - Path: `integrate-by-platform/web-integrations-localization-and-strings` - URL: https://developer.incode.com/integrate-by-platform/web-integrations-localization-and-strings/ - Markdown: https://developer.incode.com/integrate-by-platform/web-integrations-localization-and-strings.md # Localization and Strings Incode web products will display in the default language set in the browser, however, you can explicitly set up one of the supported translations. Refer to [Supported Languages](/general-reference/supported-languages/) for a full list. > 👍 Pro Tip > > You can explicitly change the language of your application by appending a 2-digit language code in your app's URL. _Example_, lang=fr or lang=pt # Customization in Web In addition to localization support, you may want to change strings to display different words. For example, to change a screen that shows the word "Retake" you can choose to show the word "Try again" instead. Here's how to do that. ```json { "common": { "retake": "Try again", //previously the word "Retake" was here } } ``` ## Translations Tool You can use our [translations tool ](https://translations.poc.incodetest.com/) to search for the strings or keys you would like to personalize an generate a sample translation file for you to personalize. You can then include the language file during the Web SDK's `create()` method, like below: ```javascript import { en } from "./en.js"; const incode = await create({ apiURL: apiURL, translations: en, }); //Allows proper translation loading order await incode.initialize(); ```
          --- - Path: `integrate-by-platform/web-integrations-redirect-url` - URL: https://developer.incode.com/integrate-by-platform/web-integrations-redirect-url/ - Markdown: https://developer.incode.com/integrate-by-platform/web-integrations-redirect-url.md # Redirect URL The Redirect URL integration sends users from your web or mobile app to an Incode-hosted verification flow. Incode manages the verification UI and infrastructure; your app manages the redirect and result handling. There are two sub-patterns depending on whether you need the user to return to your app after verification: - **Redirect only**: Your app redirects the user to the Incode-hosted flow. Results are retrieved server-side via webhook or API. The frontend doesn't need to handle a return. - **Redirect and back**: Your app redirects the user to the flow and receives them back on completion via a `redirectionUrl`. The frontend handles the return and uses the session reference to trigger result fetching. Both patterns work across web and mobile contexts and require a backend to start sessions. ## Choosing a sub-pattern | | Redirect only | Redirect and back | | ------------------------- | ------------------------------------- | --------------------------------------------- | | Frontend handles return | No | Yes | | Results retrieved by | Backend (webhook or API poll) | Backend, triggered by frontend on return | | `redirectionUrl` required | No | Yes | | Best for | Server-driven flows, async processing | Apps that need to react immediately on return | ## Prerequisites Complete the [Dashboard setup steps](/integrate-by-platform/web-integration-overview/#before-you-begin) in Web Integration Overview before starting this integration. These cover creating a Workflow, adding the Data Sharing Consent module, enabling redirect desktop to mobile, and obtaining your API credentials. If you are using the **Redirect and back** sub-pattern, ensure you complete the optional Dashboard setup step 4 to set the **Redirect URL** field in your Workflow settings to your return URL. ### **Nobackend (simple case)** If you only need to send users through a verification flow and view results in Dashboard, you can share a generic [Workflow URL](/dashboard-platform-administration/workflows-20/#other-workflow-actions) directly without starting a session. This approach does not link sessions to specific users in your system. ## Redirect only Your backend starts a session, generates an onboarding URL, and redirects the user to it. When the session completes, Incode notifies your backend via webhook (or your backend polls for the result). The user does not return to your app via redirect. ![](https://developer.incode.com/assets/20a741e8d35186d9599c73a4bc84c8ef.png) ### Step 1: Start a session (backend) Call the [Start Onboarding Session](/integrate-by-platform/single-onboarding/) endpoint: `POST /omni/start`. Request body (key fields): ```json { "configurationId": "YOUR_WORKFLOW_ID", "externalCustomerId": "your-user-id" } ``` Save the `token` and `interviewId` from the response to your database. These are needed later to retrieve results. ### Step 2: Generate the onboarding URL (backend) Call `/omni/onboarding-url` with the session token: ```jsx const response = await fetch(`${API_URL}0/omni/onboarding-url`, { method: "GET", headers: { "Content-Type": "application/json", "api-version": "1.0", "X-Incode-Hardware-Id": token, }, }); const { url } = await response.json(); ``` ### Step 3: Redirect the user (frontend) ```jsx window.location.replace(url); ``` ### Step 4: Retrieve results (backend) Configure an [Onboarding Status Webhook](/general-reference/onboarding-status-webhook/) or [Session Webhooks](/general-reference/session-webhooks/) to receive notification when the session completes, then fetch the results using the `interviewId`. ## Redirect and back Your backend starts a session with a `redirectionUrl` set. When the user finishes verification, Incode redirects them back to that URL. Your frontend reads the session reference it stored before the redirect and calls your backend to fetch results. ![](https://developer.incode.com/assets/a8541b67ff9dae5dd34ec14167623d70.png) ### Step 1: Create a session and generate an onboarding URL (backend) **1.1 — Create the session** Call `/omni/start` with a `redirectionUrl`: ```jsx const params = { configurationId: "YOUR_WORKFLOW_ID", countryCode: "ALL", language: "en-US", externalCustomerId: "your-user-id", redirectionUrl: "https://yourapp.com/verification-complete", }; const response = await fetch(`${API_URL}omni/start`, { method: "POST", headers: { "Content-Type": "application/json", "x-api-key": "YOUR_API_KEY", "api-version": "1.0", }, body: JSON.stringify(params), }); const { token, interviewId } = await response.json(); ``` **1.2 — Save the token and interviewId** Persist the session `token` and `interviewId` to your database, associated with your user. You will need these to retrieve results after the session completes. **1.3 — Generate the onboarding URL** Call `/omni/onboarding-url` with the session token: ```jsx const response = await fetch(`${API_URL}0/omni/onboarding-url`, { method: "GET", headers: { "Content-Type": "application/json", "api-version": "1.0", "X-Incode-Hardware-Id": token, }, }); const { url } = await response.json(); ``` > The `/0/` prefix indicates a zero-configuration endpoint — it only needs the session token and derives all other context from it. **1.4 — Return the URL and interviewId to your frontend** ### Step 2: Store a session reference in the frontend Before redirecting the user, save the `interviewId` so your return page can access it. The return URL will not carry any session information, so the frontend needs its own reference. ```jsx const response = await fetch("https://your.backend.app/create-session"); const { interviewId, url } = await response.json(); localStorage.setItem("interviewId", interviewId); ``` ### Step 3: Redirect the user ```jsx window.location.replace(url); ``` ### Step 4: Receive the user back Create the return page your `redirectionUrl` points to. When the user lands here after completing verification, retrieve the `interviewId` from localStorage and call your backend to fetch results. ```jsx const interviewId = localStorage.getItem("interviewId"); const response = await fetch( `https://your.backend.app/fetch-score?interviewId=${interviewId}` ); const { status } = await response.json(); if (status === "OK") { console.log("Verification passed"); } else { console.log("Verification did not pass"); } ``` ### Step 5: Fetch results in the backend Receive the `interviewId` from the frontend, use it to look up the session `token` from your database, then call the Incode API to retrieve results. ## When to use this approach Redirect URL (either sub-pattern) is a good fit when: - You are comfortable sending users to a separate page for verification - You want minimal front-end code - You are redirecting from a mobile app's browser or WebView - You need to send verification links via SMS, WhatsApp, or email (use the URL directly; no redirect logic needed) If you need users to stay on your domain, consider [iFrame](/integrate-by-platform/web-integrations-iframe/) instead. If you need full UI control, see [Web SDK](/integrate-by-platform/web-integrations-websdk/). --- - Path: `integrate-by-platform/web-integrations-styling` - URL: https://developer.incode.com/integrate-by-platform/web-integrations-styling/ - Markdown: https://developer.incode.com/integrate-by-platform/web-integrations-styling.md # Styling and CSS Customization # Low Code Integrations If you have chosen a low code integration or are using the quick start guide you can style the web flow application though the Dashboard. ## User interface (UI) customization 1. Log in to **Dashboard** > **Configuration** > **Customization**. The first section lets you customize some or all of the elements listed in the next steps. 2. To add your logo, click in the **Logo** field, navigate to and select the saved logo file on your computer, and then click **Open**. The logo must be saved in JPG, PNG, or SVG format. 3. Add a **Subtitle**. 4. Use the **Button** slider to adjust the corner radius. 5. Change the **Button Color** and **Button Color Text**. You can click the colored area on the left of each field to use a selector or enter RGB values, or you can enter a hexadecimal (HEX) color code directly in the field. 6. Click the radio button to include a custom CSS stylesheet. For more information on this advanced option, see the next section on this page. 7. If you don't want the Incode branding to show to your end users, select the **Hide footer branding** checkbox. 8. When you are finished, click **Update UI**. ## Content customization 1. If you haven't already done so, log in to **Dashboard** > **Configuration** > **Customization**. 2. Scroll down to the Content section. This section lets you customize the text fields in your integration. 3. Enter a **Headline** for your finish screen. The default value is _Thank you_. 4. Enter the **Body Text** for your finish screen. The default value is _Your verification is complete_. 5. Enter **SMS Text** for the text message your users receive to start onboarding. 6. When you are finished, click **Update content**. # Use a custom CSS file You can use custom CSS stylesheets to adjust the look and feel of your app. This is an advanced technique. For best results, we recommend that your developers use the developer tools in their browser to identity specific DOM elements which can be styled. In general, all elements prefixed with CSS selector named `Incode` can be referenced and styled in a CSS file, as shown here in the following image. Elements that don't have this prefix are **not** available for customization. ```css Customizable Elements /* */ /* Tutorials */ /* */ /* Tutorial Base */ /* Header Container*/ .IncodeTutorialHeaderContainer { } /* Header */ .IncodeTutorialHeader { } /* Header Title (h1) */ .IncodeTutorialHeaderTitle { } /* Header Subtitle */ .IncodeTutorialHeaderSubtitle { } /* Video */ .IncodeTutorialVideo { } /* Button container */ .IncodeTutorialButtonContainer { } /* Continue Button */ .IncodeTutorialButton { } /* Tutorial Front */ /* Header Container*/ .IncodeTutorialHeaderContainerFront { } /* Header */ .IncodeTutorialHeaderFront { } /* Header Title (h1) */ .IncodeTutorialHeaderTitleFront { } /* Header Subtitle */ .IncodeTutorialHeaderSubtitleFront { } /* Video */ .IncodeTutorialVideoFront { } /* Button container */ .IncodeTutorialButtonContainerFront { } /* Continue Button */ .IncodeTutorialButtonFront { } /* Tutorial Back */ /* Header Container*/ .IncodeTutorialHeaderContainerBack { } /* Header */ .IncodeTutorialHeaderBack { } /* Header Title (h1) */ .IncodeTutorialHeaderTitleBack { } /* Header Subtitle */ .IncodeTutorialHeaderSubtitleBack { } /* Video */ .IncodeTutorialVideoBack { } /* Button container */ .IncodeTutorialButtonContainerBack { } /* Continue Button */ .IncodeTutorialButtonBack { } /* Front tutorial container */ .IncodeCaptureFrontIdTutorial { } /* Back tutorial container */ .IncodeCaptureBackIdTutorial { } /* Tutorial selfie */ /* Button */ .IncodeTutorialButtonSelfie { } /* */ /* OTP */ /* */ /* OTP Container */ .IncodeOTP { } /* OTP content */ .IncodeOTPContent { } /* OTP title */ .IncodeOTPTitle { } /* OTP paragraph of the seconds */ .IncodeOTPSecondsParagraph { } /* OTP Label with instructions */ .IncodeOTPLabel { } /* OTP Code Text p */ .IncodeOTPText { } /* OTP timer */ .IncodeOTPTimer { } /* OTP error text */ .IncodeOTPError { } /* OTP button */ .IncodeOTPButton { } /* Each input in OTP */ .IncodeOTPInput { } /* */ /* Conference */ /* */ /* Modal for exit the conference */ /* Container for modal */ .IncodeAreYouSureModal { } /* Modal overlay */ .IncodeAreYouSureModalOverlay { } /* Modal close icon button */ .IncodeAreYouSureModalCloseIconButton { } /* Modal close icon span */ .IncodeAreYouSureModalCloseIconSpan { } /* Title */ .IncodeAreYouSureModalTitle { } /* Modal subtitle */ .IncodeAreYouSureModalSubtitle { } /* Modal buttons container */ .IncodeAreYouSureModalButtonsContainer { } /* Continue PRocess Button */ .IncodeAreYouSureModalContinueProcessButton { } /* Disconnect Button */ .IncodeAreYouSureModalDisconnectButton { } /* Connecting footer (The one with the SMS message and disconnect button) */ /* Container */ .IncodeSMSMessageContainer { } /* SMS message container (only the one with text about sms) */ .IncodeSMSContainer { } /* SMS Icon */ .IncodeSMSIconImg { } /* SMS text */ .IncodeSmsText { } /* Disconnect button */ .IncodeDisconnectButtonQueue { } /* Conference Connected Video Call view*/ /* container */ .IncodeConferenceContainer { } /* Header */ .IncodeConferenceHeader { } /* User video container */ .IncodeSubscriberContainer { } /* Bandwidth check */ /* Bandwidth check container */ .IncodeBandwithContainer { } /* Bandwidth spinner */ .IncodeBandwidthSpinner { } /* Bandwidth title */ .IncodeBandwithTitle { } /* Bandwidth image */ .IncodeBandwidthImage { } /* Bandwidth subtitle */ .IncodeBandwidthSubtitle { } /* Bandwidth text */ .IncodeBandwithText { } /* Connecting */ /* Connecting title */ .IncodeConnectingTitle { } /* Connecting image */ .IncodeConnectingImage { } /* Connecting loading circle container */ .IncodeLoadingCircleContainer { } /* Connecting loading circle spinner */ .IncodeLoadingCircleSpinnerInner { } /* Connecting loading circle image */ .IncodeLoadingCircleImg { } /* Connecting loading circle text */ .IncodeLoadingCircleConnectingText { } /* Connecting span */ .IncodeConnectingSpan { } /* Connecting SMS container */ .IncodeFooterSmsMessage { } /* Executive Ready */ /* container */ .IncodeExecutiveReadyContainer { } /* Ececutive ready title */ .IncodeExecutiveReadyTitle { } /* Ececutive ready image */ .IncodeExecutiveReadyImage { } /* Ececutive is ready message */ .IncodeExecutiveReadyMessage { } /* Actions container (The one with the connect and disconnect button) */ .IncodeExecutiveReadyButtonContainer { } /* ready to connect button */ .IncodeExecutiveReadyConnectButton { } /* disconnect button (in the executive ready view) */ .IncodeExecutiveReadyDisconnectButton { } /* Common */ /* Checkbox */ .IncodeCheckbox { } /* Notification container */ .IncodeNotificationContainer { } /* Signature */ /* Signature container */ .IncodeSignatureContainer { } /* Signature title */ .IncodeSignatureTitle { } /* Signature subtitle */ .IncodeSignatureSubtitle { } /* Signature canvas container */ .IncodeSignatureCanvasContainer { } /* Signature canvas */ .IncodeSignatureCanvas { } /* Signature buttons container */ .IncodeSignatureButtonsContainer { } /* Signature clear button */ .IncodeSignatureClearButton { } /* Signature done button */ .IncodeSignatureDoneButton { } /* FaceMatch */ /* FaceMatch container */ .IncodeMatchUserContainer { } /* FaceMatch body container */ .IncodeMatchUserBodyContainer { } /* FaceMatch title */ .IncodeMatchUserTitle { } /* FaceMatch message */ .IncodeMatchUserMessage { } /* FaceMatch circles container */ .IncodeMatchUserCirclesContainer { } /* FaceMatch circle with ID */ .IncodeMatchUserIDFace { } /* FaceMatch circle with face */ .IncodeMatchUserFace { } /* FaceMatch circle with second ID */ .IncodeMatchUserIDSecondFace { } /* FaceMatch circle with face match */ .IncodeMatchUserFaceMatch { } /* FaceMatch container circle buttons */ .IncodeMatchUserContainerContinueButton { } /* FaceMatch continue button */ .IncodeMatchUserContinueButton { } /* FaceMatch liveness stripe */ .IncodeMatchUserLivenessStripe { } /* FaceMatch liveness image */ .IncodeMatchUserLivenessImage { } /* CapturePreview */ /* CapturePreview container */ .IncodePreviewContainer { } /* CapturePreview message */ .IncodeCapturePreviewMessage { } /* CapturePreview message image */ .IncodeCapturePreviewMessageImage { } /* CapturePreview image container */ .IncodeCapturePreviewImageContainer { } /* CapturePreview image */ .IncodeCapturePreviewImage { } /* CapturePreview uploading container */ .IncodeCapturePreviewUploadingContainer { } /* CapturePreview uploading text */ .IncodeCapturePreviewUploadingText { } /* CapturePreview uploading bar outside */ .IncodeCapturePreviewUploadingBarOutside { } /* CapturePreview uploading progress bar */ .IncodeCapturePreviewUploadingProgress { } /* Retake */ /* Incode retake container */ .IncodeRetakeContainer { } /* Incode retake title */ .IncodeRetakeTitle { } /* Incode retake subtitle */ .IncodeRetakeSubtitle { } /* Incode retake image container */ .IncodeRetakeImageContainer { } /* Incode retake image */ .IncodeRetakeImage { } /* Incode retake buttons container */ .IncodeRetakeButtonsContainer { } /* Incode retake button */ .IncodeRetakeButton { } /* Incode retake continue button */ .IncodeRetakeContinueContainer { } /* Legal Modal */ /* Legal modal container */ .IncodeLegalModal { } /* Legal modal overlay */ .IncodeLegalModalOverlay { } /* Legal modal title */ .IncodeLegalModalTitle { } /* Legal modal text */ .IncodeLegalModalTermsText { } /* Legal modal buttons container */ .IncodeLegalModalButtonsContainer { } /* Legal modal cancel button */ .IncodeLegalModalCancelButton { } /* Tutorials */ /* Incode iOS Instructions Container */ .IncodeiOSInstructionsContainer { } /* Incode Android Instructions Container */ .IncodeAndroidInstructionsContainer { } /* Incode Permissions Reload Button Container */ .IncodePermissionsReloadButtonContainer { } /* Incode Allow Permissions Container */ .IncodeAllowPermissionsContainer { } /* Incode Allow Permissions Button Container */ .IncodeAllowPermissionsButtonContainer { } /* Incode iOS Permissions Container */ .IncodeiOSPermissionsContainer { } /* Incode Android Permissions Container */ .IncodeAndroidPermissionsContainer { } /* Incode iOS Instructions Content */ .IncodeiOSInstructionsContent { } /* Incode Android Instructions Content */ .IncodeAndroidInstructionsContent { } /* Incode Allow Permissions Button */ .IncodeAllowPermissionsButton { } /* Incode iOS Button */ .IncodeiOSButton { } /* Incode Android Permissions Button */ .IncodeAndroidPermissionsButton { } /* Incode Login */ /* Main container for the Incode login component. */ .IncodeLoginContainer { } /* Container that holds the capture button within the Incode login component. */ .IncodeLoginCaptureButtonContainer { } /* Container holding the webcam view in the Incode login component. */ .IncodeLoginWebcamContainer { } /* Container for borders in the Incode login component. */ .IncodeLoginBordersContainer { } /* Borders during loading states within the Incode login component. */ .IncodeLoginLoadingBorders { } /* This class is used to hide login in the Incode login component. */ .IncodeLoginHidder { } /* Outer part of the oval-shaped camera frame in the Incode login component. */ .IncodeLoginCameraOvalOuter { } /* Inner part of the oval-shaped camera frame in the Incode login component. */ .IncodeLoginCameraOvalInner { } /* Frame that indicates the user's face area during login. */ .IncodeLoginFaceFrame { } /* Webcam in the Incode login component. */ .IncodeLoginWebcam { } /* Text inside the oval-shaped camera frame in the Incode login component. */ .IncodeLoginCameraOvalInnerText { } /* Inline notifications that appear within the Incode login component. */ .IncodeLoginNotificationInline { } /* Incode Login Desktop */ /* Main container for the Incode login component in desktop view. */ .IncodeLoginDesktopContainer { } /* Container that holds the capture button within the Incode login desktop component. */ .IncodeLoginDesktopCaptureButtonContainer { } /* Container holding the webcam view in the Incode login desktop component. */ .IncodeLoginDesktopWebcamContainer { } /* Class used for styling the face mask in the Incode login desktop component. */ .IncodeLoginDesktopFaceMask { } /* Frame that indicates the user's face area during login in the desktop view. */ .IncodeLoginDesktopFaceFrame { } /* Webcam in the Incode login desktop component. */ .IncodeLoginDesktopWebcam { } /* Notifications that appear within the Incode login desktop component. */ .IncodeLoginDesktopNotification { } /* Incode Second Factor */ /* Main container for the second factor authentication component. */ .IncodeSecondFactorContainer { } /* Class for div elements requiring margin in the second factor authentication component. */ .IncodeSecondFactorDivWithMargin { } /* Input element for the second factor authentication component. */ .IncodeSecondFactorInput { } /* Button for the second factor authentication component. */ .IncodeSecondFactorButton { } /* Incode Additional ID */ /* Main container for the additional ID component. */ .IncodeAdditionalIDContainer { } /* Webcam view in the additional ID component. */ .IncodeAdditionalIDWebcam { } /* Preview of the capture in the additional ID component. */ .IncodeAdditionalIDCapturePreview { } /* Fake button shown after autocapture timeout in the additional ID component. */ .IncodeAdditionalIDFakeButton { } /* Notifications within the additional ID component. */ .IncodeAdditionalIDNotification { } /* Incode Capture Desktop Selfie */ /* Main container for the selfie capture on desktop. */ .IncodeCaptureDesktopSelfieContainer { } /* Header for the selfie capture on desktop. */ .IncodeCaptureDesktopSelfieHeader { } /* Selfie container for the selfie capture on desktop. */ .IncodeCaptureDesktopSelfieSelfieContainer { } /* Face mask for the selfie capture on desktop. */ .IncodeCaptureDesktopSelfieFaceMask { } /* Frame that indicates the user's face area during selfie capture on desktop. */ .IncodeCaptureDesktopSelfieFaceFrame { } /* Webcam in the selfie capture on desktop. */ .IncodeCaptureDesktopSelfieWebcam { } /* Notifications in the selfie capture on desktop. */ .IncodeCaptureDesktopSelfieNotification { } /* Container for the capture button in the selfie capture on desktop. */ .IncodeCaptureDesktopSelfieCaptureButtonContainer { } /* Tutorial for the selfie capture on desktop. */ .IncodeCaptureDesktopSelfieTutorial { } /* Incode Capture Document */ /* Main container for the document capture. */ .IncodeCaptureDocumentContainer { } /* Webcam view in the document capture. */ .IncodeCaptureDocumentWebcam { } /* Retake option in the document capture. */ .IncodeCaptureDocumentRetake { } /* Preview of the document capture. */ .IncodeCaptureDocumentPreview { } /* Fake button shown after autocapture timeout in the document capture. */ .IncodeCaptureDocumentFakeButton { } /* Notifications within the document capture. */ .IncodeCaptureDocumentNotification { } /* Incode Capture ID */ /* Main container for the ID capture. */ .IncodeCaptureIdContainer { } /* Native button in the ID capture. */ .IncodeCaptureIdNativeButton { } /* Image of a question mark in the ID capture. */ .IncodeCaptureIdQuestionMarkImg { } /* Webcam view in the ID capture. */ .IncodeCaptureIdWebcam { } /* Mask in the ID capture. */ .IncodeCaptureIdMask { } /* Fake button shown after autocapture timeout in the ID capture. */ .IncodeCaptureIdFakeButton { } /* Message in the fake button in the ID capture. */ .IncodeCaptureIdFakeButtonMessage { } /* Arrow down in the fake button in the ID capture. */ .IncodeCaptureIdFakeButtonArrowDown { } /* Image in the fake button in the ID capture. */ .IncodeCaptureIdFakeButtonImage { } /* Incode Capture Selfie */ /* Main container for the selfie capture. */ .IncodeCaptureSelfieContainer { } /* Container for the capture button in the selfie capture. */ .IncodeCaptureSelfieButtonContainer { } /* Webcam container for the selfie capture. */ .IncodeCaptureSelfieWebcamContainer { } /* Border container for the selfie capture. */ .IncodeCaptureSelfieBordersContainer { } /* Loading borders container for the selfie capture. */ .IncodeCaptureSelfieLoadingBordersContainer { } /* Class used to hide certain elements or sections within the selfie capture. */ .IncodeCaptureSelfieHidder { } /* Outer part of the oval-shaped camera frame in the selfie capture. */ .IncodeCaptureSelfieCameraOvalOuter { } /* Preview image for the selfie capture. */ .IncodeCaptureSelfiePreviewImage { } /* Webcam in the selfie capture. */ .IncodeCaptureSelfieWebcam { } /* Text inside the oval-shaped camera frame in the selfie capture. */ .IncodeCaptureSelfieCameraOvalInnerText { } /* Inline notifications that appear within the selfie capture. */ .IncodeCaptureSelfieNotificationInline { } /* Incode Choose Camera */ /* Main container for the camera selection component. */ .IncodeChooseCameraContainer { } /* Title for the camera selection component. */ .IncodeChooseCameraTitle { } /* Preview video for the camera selection component. */ .IncodeChooseCameraPreviewVideo { } /* Camera selector in the camera selection component. */ .IncodeChooseCameraSelector { } /* Button for the camera selection component. */ .IncodeChooseCameraButton { } /* Incode Common Issues Modal */ /* Main container for the common issues modal. */ .IncodeCommonIssuesModal { } /* Container within the common issues modal. */ .IncodeCommonIssuesModalContainer { } /* Instructions container within the common issues modal. */ .IncodeCommonIssuesModalInstructionsContainer { } /* Button container within the common issues modal. */ .IncodeCommonIssuesModalButtonContainer { } /* Try again container within the common issues modal. */ .IncodeCommonIssuesModalTryAgainContainer { } /* Bottom text within the common issues modal. */ .IncodeCommonIssuesModalBottomText { } /* Native camera button in the common issues modal */ .IncodeCommonIssuesModalNativeCameraButton { } /* Incode Mask */ /* Container for masks in a horizontal layout. */ .IncodeMaskContainerHorizontal { } /* Container for passport mask */ .IncodePassportMaskContainer { } /* Mask for passport-related UI. */ .IncodePassportMask { } /* Mask for desktop-related UI. */ .IncodeDesktopMask { } /* Main container for masks. */ .IncodeMaskContainer { } /* Mask related to barcode UI. */ .IncodeMaskBarcode { } /* Incode Native Camera */ /* Retake action for native camera UI. */ .IncodeNativeCameraRetake { } /* Main container for native camera UI. */ .IncodeNativeCameraContainer { } /* Preview of the capture in the native camera UI. */ .IncodeNativeCameraCapturePreview { } /* Label for button elements in the native camera UI. */ .IncodeNativeCameraLabelButton { } /* Input for native camera UI. */ .IncodeNativeCameraInput { } /* Button for native camera UI. */ .IncodeNativeCameraButton { } /* Tutorial ID */ .IncodeNativeCameraCaptureIdTutorial { } /* Tutorial selfie */ .IncodeNativeSelfieTutorial { } /* Incode Enter Curp */ /* Main container for the CURP (Personal ID code for Mexico) entry UI. */ .IncodeEnterCurpContainer { } /* Status indicators for the CURP entry UI. */ .IncodeEnterCurpStatus { } /* Title for the CURP entry UI. */ .IncodeEnterCurpTitle { } /* Form for CURP entry. */ .IncodeEnterCurpForm { } /* Incode Desktop Detected */ /* Main container for desktop detection UI. */ .IncodeDesktopDetectedContainer { } /* Image related to desktop detection. */ .IncodeDesktopDetectedImage { } /* Text associated with desktop detection. */ .IncodeDesktopDetectedText { } /* Incode Notifications */ /* Notifications UI for Android devices. */ .IncodeAndroidNotification { } /* Notifications UI for iOS devices. */ .IncodeIOSNotification { } /* Fake permissions request modal UI. */ .IncodeFakePermissionsRequestModal { } /* Container for messages within the fake permissions request modal. */ .IncodeFakePermissionsRequestMessageContainer { } /* Incode QR Scanner Tutorial */ /* Main container for the QR scanner tutorial. */ .IncodeQrScannerTutorialContainer { } /* Title for the QR scanner tutorial. */ .IncodeQrScannerTutorialTitle { } /* Subtitle for the QR scanner tutorial. */ .IncodeQrScannerTutorialSubtitle { } /* Container for images within the QR scanner tutorial. */ .IncodeQrScannerTutorialImageContainer { } /* Images for the QR scanner tutorial. */ .IncodeQrScannerTutorialImage { } /* Button for the QR scanner tutorial. */ .IncodeQrScannerTutorialButton { } /* Main container for the QR scanner. */ .IncodeQrScannerContainer { } /* Instructions for the QR scanner. */ .IncodeQrScannerInstructions { } /* Mask for the QR scanner. */ .IncodeQrScannerMask { } /* Webcam for the QR scanner tutorial. */ .IncodeQrScannerTutorialWebcam { } /* Incode Contract */ /* Main container for contract UI. */ .IncodeContractContainer { } /* Title for the contract. */ .IncodeContractTitle { } /* Container for the contract text. */ .IncodeContractTextContainer { } /* Contract text. */ .IncodeContractText { } /* Container for the contract button. */ .IncodeContractButtonContainer { } /* Button for the contract. */ .IncodeContractButton { } /* Incode Recorder ID Mask */ /* Main container for the ID mask in the recorder. */ .IncodeRecorderIdMaskContainer { } /* Text for the ID mask in the recorder. */ .IncodeRecorderIdMaskText { } /* Mask for capturing IDs in the recorder. */ .IncodeRecorderCaptureIdMask { } /* Incode Recorder Microphone */ /* Main container for the microphone in the recorder. */ .IncodeRecorderMicrophoneContainer { } /* Image of the microphone in the recorder. */ .IncodeRecorderMicrophoneImage { } /* Incode Recorder POA Mask */ /* Main container for the POA (Proof of Address) mask in the recorder. */ .IncodeRecorderPOAMaskContainer { } /* Top section of the POA mask in the recorder. */ .IncodeRecorderPOAMaskTop { } /* Text for the POA mask in the recorder. */ .IncodeRecorderPOAMaskText { } /* Bottom section of the POA mask in the recorder. */ .IncodeRecorderPOAMaskBottom { } /* Button for the POA mask in the recorder. */ .IncodeRecorderPOAMaskButton { } /* Incode Recorder Question Mask */ /* Main container for the question mask in the recorder. */ .IncodeRecorderQuestionMaskContainer { } /* Title for the question mask in the recorder. */ .IncodeRecorderQuestionMaskTitle { } /* Button for the question mask in the recorder. */ .IncodeRecorderQuestionMaskButton { } /* Incode Recorder Tutorial */ /* Main container for the recorder tutorial. */ .IncodeRecorderTutorialContainer { } /* Header for the recorder tutorial. */ .IncodeRecorderTutorialHeader { } /* Title for the recorder tutorial. */ .IncodeRecorderTutorialTitle { } /* Body of the recorder tutorial. */ .IncodeRecorderTutorialBody { } /* Image in the recorder tutorial. */ .IncodeRecorderTutorialImage { } /* Button for the recorder tutorial. */ .IncodeRecorderTutorialButton { } /* Incode Video Recorder */ /* Main container for the video recorder. */ .IncodeVideoRecorderContainer { } /* Counter for the video recorder. */ .IncodeVideoRecorderCounter { } /* Image indicating recording status in the video recorder. */ .IncodeVideoRecorderRecordingImage { } /* Face mask in the video recorder. */ .IncodeVideoRecorderFaceMask { } /* Face frame in the video recorder. */ .IncodeVideoRecorderFaceFrame { } /* Incode Redirect */ /* Main container for the redirect component. */ .IncodeRedirectContainer { } /* Container for QR code items in the redirect component. */ .IncodeRedirectQrItemContainer { } /* Title for the redirect component in mobile view. */ .IncodeRedirectTitleMobile { } /* List in the redirect component in mobile view. */ .IncodeRedirectListMobile { } /* Individual list item in the redirect component. */ .IncodeRedirectItem { } /* Container for QR code in the redirect component. */ .IncodeRedirectQrContainer { } /* QR code in the redirect component. */ .IncodeRedirectQRCode { } /* Container for recommendations in the redirect component. */ .IncodeRedirectContainerRecommendation { } /* Title for the redirect component. */ .IncodeRedirectTitle { } /* List in the redirect component. */ .IncodeRedirectList { } /* Paragraph text in the redirect component. */ .IncodeRedirectParagraph1 { } .IncodeRedirectParagraph2 { } .IncodeRedirectParagraph3 { } /* Container for separator line in the redirect component. */ .IncodeRedirectSeparatorContainer { } /* Vertical line in the redirect component. */ .IncodeRedirectVerticalLine { } /* Container for "Send Verification" mobile in the redirect component. */ .IncodeRedirectSendVerificationMobileContainer { } /* Message container for "Send Verification" mobile in the redirect component. */ .IncodeRedirectSendVerificationMobileMessageContainer { } /* Image for "Send Verification" mobile in the redirect component. */ .IncodeRedirectSendVerificationMobileImage { } /* Text for "Send Verification" mobile in the redirect component. */ .IncodeRedirectSendVerificationMobileText { } /* List for "Send Verification" mobile in the redirect component. */ .IncodeRedirectSendVerificationMobileList { } /* List item for "Send Verification" mobile in the redirect component. */ .IncodeRedirectSendVerificationMobileListItem { } /* Container for "Send Verification" desktop in the redirect component. */ .IncodeRedirectSendVerificationDesktopContainer { } /* Image for "Send Verification" desktop in the redirect component. */ .IncodeRedirectSendVerificationDesktopImage { } /* Text for "Send Verification" desktop in the redirect component. */ .IncodeRedirectSendVerificationDesktopText { } /* Container for "Send SMS" in the redirect component. */ .IncodeRedirectSendSMSContainer { } /* Text for "Send SMS" in the redirect component. */ .IncodeRedirectSendSMSText { } /* List for "Send SMS" in the redirect component. */ .IncodeRedirectSendSMSList { } /* List item for "Send SMS" in the redirect component. */ .IncodeRedirectSendSMSListItem { } /* Container for inputs in the redirect component. */ .IncodeRedirectContainerInputs { } /* Input field in the redirect component. */ .IncodeRedirectInput { } /* Container for SMS sent confirmation in the redirect component. */ .IncodeRedirectSmsSentContainer { } /* Paragraph for SMS sent confirmation in the redirect component. */ .IncodeRedirectSmsSentParagraph { } /* Paragraph for resend action in the redirect component. */ .IncodeRedirectResendParagraph { } /* Footer for desktop view in the redirect component. */ .IncodeRedirectFooterDesktop { } /* Incode Redirect Call Finished */ /* Main container for the call finished UI in the redirect component. */ .IncodeRedirectCallFinishedContainer { } /* Title for the call finished UI in the redirect component. */ .IncodeRedirectCallFinishedTitle { } /* Subtitle for the call finished UI in the redirect component. */ .IncodeRedirectCallFinishedSubtitle { } ``` **NOTE** You may need to use the keyword _!important_ to ensure the custom styling is honored property. ## Sample CSS file To see a sample custom CSS implementation, go to: * [https://github.com/Incode-Technologies-Example-Repos/web-resource-samples/blob/main/styles/example.css](https://github.com/Incode-Technologies-Example-Repos/web-resource-samples/blob/main/styles/example.css) --- - Path: `integrate-by-platform/web-integrations-websdk` - URL: https://developer.incode.com/integrate-by-platform/web-integrations-websdk/ - Markdown: https://developer.incode.com/integrate-by-platform/web-integrations-websdk.md # Web SDK The Incode Web SDK integrates identity verification directly into your custom web application. You host the verification UI inside your own app, using the SDK's JavaScript methods to control the flow, handle events, and customize the user experience. This approach gives you the most control of any web integration method. It also requires the most development effort and is best suited to teams with dedicated front-end and back-end developers. ## How it works 1. Your backend starts an onboarding session and returns a session token to your front end. 2. Your front end initializes the Web SDK with that token. 3. The SDK renders verification modules (ID scan, selfie, and so on) directly inside your web app. 4. You handle module completion events and control flow progression in your application code. 5. Your backend fetches results once the session is complete. ## Prerequisites Complete the [Dashboard setup steps](/integrate-by-platform/web-integration-overview/#before-you-begin) in Web Integration Overview before starting this integration. These cover creating a Workflow, adding the Data Sharing Consent module, enabling redirect desktop to mobile, and obtaining your API credentials. In addition, you'll need: - A front-end web application (framework-agnostic; React, Vue, Angular, and vanilla JS are all supported). - HTTPS (required for camera and microphone access in browsers). ## Get started For installation, initialization, method reference, and full integration walkthroughs, see the [Web SDK 2.0 Reference](/sdk-reference/incode-web-sdk-2-reference/). If you are still using Web SDK 1.x, refer to [Web SDK Reference](/sdk-reference/web-sdk-reference/).
          --- - Path: `integrate-by-platform/web-integrations-webviews` - URL: https://developer.incode.com/integrate-by-platform/web-integrations-webviews/ - Markdown: https://developer.incode.com/integrate-by-platform/web-integrations-webviews.md # WebViews A WebView is an embedded browser component within a native mobile application. Rather than building a native SDK integration, you can load Incode’s hosted verification flow (a Workflow or Flow URL) inside a WebView component in their iOS or Android app. Incode officially supports this integration method for the configurations and modules described on this page. :::warning ### **WebView support limitations** The requirements and configurations documented here reflect the first official release of WebView as a supported integration method. Support currently covers v2 integrations only and a defined set of core modules. Contact your Incode representative if you have questions about your specific configuration. ::: ## How it works WebView integration follows the same model as a standard [Flows / Workflows](/integrate-by-platform/web-integrations-flows-workflows/) integration: 1. Your backend starts an onboarding session and generates a Workflow URL. 2. Your native app loads that URL in a WebView component. 3. The user completes identity verification inside the embedded browser. 4. You retrieve results via Dashboard or webhook. The key difference from a standard web integration is that your native app must be configured to grant the WebView access to the device hardware and browser APIs that Incode requires. ## Supported platforms and frameworks | Platform | Supported component | System browser variant | | -------- | -------------------------- | :----------------------- | | Android | `WebView` (Android native) | Chrome Custom Tabs | | iOS | `WKWebView` | `SFSafariViewController` | ## Supported modules The following modules are validated for WebView use: - ID Capture (ID scan) - Face Capture (selfie) - Proof of Address / Document Capture - Deepsight - Face Authentication - CURP Other modules may function in WebView environments but are not covered under validated support at this time. ## System requirements Your native app must meet the following requirements for a WebView integration with Incode to function correctly. ### Required permissions Your native app must request and pass through the following permissions to the WebView: - **Camera**: Required for ID scan and selfie capture - **Microphone**: Required for video selfie and video conference modules - **Screen recording**: Required for Deepsight - **Geolocation**: Required if the Geolocation module is included in your flow Permissions denied at the native app level cannot be recovered inside the WebView. If a user has previously denied a permission, your app must direct them to re-enable it in device settings before launching the WebView. ### Required browser APIs The following web platform APIs must remain enabled in your WebView configuration: - `getUserMedia` (camera and microphone access) - `MediaRecorder` - JavaScript execution (must not be disabled) - Local storage / session storage ### Minimum memory The WebView must have access to sufficient device memory to load Incode's SDK assets and run capture modules. Memory-constrained configurations may cause loading failures, particularly for modules that involve real-time processing (Deepsight, video selfie). - **RAM:** ≥ 2 GB - **Free storage:** ≥ 200 MB (iOS); ≥ 200–300 MB (Android) ### Operating system minimums | Platform | Minimum | Recommended | | :------- | :----------- | :------------- | | Android | 7.0 (API 24) | 8.0+ (API 26+) | | iOS | 14.5 | 15.0+ | ## Known limitations - Custom WebView configurations that disable standard browser APIs are not supported. - Non-standard or deprecated WebView implementations (for example, `UIWebView` on iOS) are not supported. - Third-party in-app browsers (for example, Instagram or TikTok) may have additional constraints and broken UI behavior. They are not officially supported configurations. - WebViews embedded inside game or framework engines (for example, Unity) are not covered by standard WebView support. - Video Selfie and Video Conference module support in WebViews is not yet validated and is excluded from current coverage. - iOS Simulator cannot be used for full module testing (camera, liveness, motion). Use a physical device for Deepsight, liveness, and media module testing. ## Integration guide ### Android (Native WebView) Configure your `WebView` instance to enable the required permissions and APIs before loading the Incode session URL: ```kotlin webView.settings.apply { javaScriptEnabled = true domStorageEnabled = true mediaPlaybackRequiresUserGesture = false allowFileAccess = true allowContentAccess = true setGeolocationEnabled(true) javaScriptCanOpenWindowsAutomatically = true } webView.webChromeClient = object : WebChromeClient() { override fun onPermissionRequest(request: PermissionRequest) { request.grant(request.resources) // Grant camera, microphone, etc. } override fun onShowFileChooser( webView: WebView, filePathCallback: ValueCallback>, fileChooserParams: FileChooserParams ): Boolean { // Handle for document capture return true } } webView.loadUrl(onboardingUrl) ``` Required manifest permissions: - `INTERNET` - `CAMERA` - `RECORD_AUDIO` - `STORAGE` (only if file uploads or downloads to device storage are needed) > **Chrome Custom Tabs:** Runs inside the system Chrome process. Host app has limited control; permissions are system-managed. ### iOS (WKWebView) Configure your `WKWebView` with the appropriate `WKWebViewConfiguration` to allow media capture: ```swift let config = WKWebViewConfiguration() config.allowsInlineMediaPlayback = true config.mediaTypesRequiringUserActionForPlayback = [] config.allowsPictureInPictureMediaPlayback = false let webView = WKWebView(frame: .zero, configuration: config) ``` On iOS 15 and later, implement the following `WKUIDelegate` methods to enable camera/microphone access and Deepsight/liveness support: - `decideMediaCapturePermissionsFor`: enables `getUserMedia` for camera and microphone - `requestDeviceOrientationAndMotionPermissionFor`: required for Deepsight and liveness modules Your `Info.plist` must include usage descriptions for all permissions your WebView will request. Failure to include these will cause the OS to deny the permission silently. Required keys: - `NSCameraUsageDescription` - `NSMicrophoneUsageDescription` - `NSLocationWhenInUseUsageDescription` - `NSMotionUsageDescription` > **SFSafariViewController:** No app-level delegates are required. System Safari handles all permissions using the plist keys above. ## Debugging WebView sessions can be difficult to debug because native browser developer tools are not accessible by default. - **Android**: Enable WebView debugging and connect via Chrome DevTools (`chrome://inspect`). - **iOS**: Enable Web Inspector for your WKWebView and connect via Safari’s Develop menu. Both test applications (Android `webview.apk` and iOS `IncodeVerifyExample`) support console log forwarding. Contact your Incode representative for access to these test applications. ## Contact If you are evaluating or implementing a WebViews integration, contact your Incode representative to discuss your configuration and ensure it falls within supported parameters. --- - Path: `integrate-by-platform/workflow-integration` - URL: https://developer.incode.com/integrate-by-platform/workflow-integration/ - Markdown: https://developer.incode.com/integrate-by-platform/workflow-integration.md # Workflow Implementation Options To utilize the full capabilities of the Incode Omni platform, you can integrate identity verification via Workflows into your application or website. The platform offers a versatile set of integration options, including direct onboarding URLs, iFrame integration, and SDKs for iOS, Android, and React Native platforms. Each method provides a seamless way to incorporate the identity verification process into your user flow, enhancing user experience and security. # Web - Onboarding URL The onboarding URL is a straightforward method to start the identity verification process. By directing users to this URL, they can begin their onboarding session without the need for integrating specific SDKs or custom UI elements into your application. This approach is ideal for quick deployments and can be easily shared via email or text message. For more details on how to generate and use the onboarding URL, refer to the section on Low Code integration in our detailed guide. # Mobile Platforms - iOS, Android, React Native For native mobile applications, the Incode Omni platform provides SDKs for both iOS and Android. These SDKs allow for deep integration into your mobile app, offering a native experience for users and access to additional functionalities that enhance the verification process. The minimum supported Android version is **21**. The minimum supported iOS version is **iOS 13**. React Native developers can take advantage of the dedicated React Native SDK to integrate the onboarding session into cross-platform applications. This SDK combines the ease of development in React Native with the robust features of the Incode Omni platform, ensuring a native-like experience across both iOS and Android devices. Before you start, setup the environment and install the SDK into the project following the details outlined in the environment setup guides. ## Step 1: Initialize the Incode SDK The Incode SDK must be initialized before it can be used. Check the following code on how to initialize the Incode SDK on each platform. ```kotlin Android - Kotlin fun incodeSDKInitialize(app: Application) { try { IncodeWelcome.Builder(app, Constants.API_URL, Constants.API_KEY) .setLoggingEnabled(true) .build() incodeSDKInitialized = true } catch (exception: Exception) { incodeSDKInitialized = false } } private fun setIncodeCommonConfig() { val commonConfig: CommonConfig = Builder() .setShowExitConfirmation(true) .setShowCloseButton(true) .build() IncodeWelcome.getInstance().setCommonConfig(commonConfig) } ``` ```java Android - Java public static void incodeSDKInitialize(Application app) { try { new IncodeWelcome.Builder(app, Constants.API_URL, Constants.API_KEY) .setLoggingEnabled(true) .build(); incodeSDKInitialized = true; } catch (Exception exception) { incodeSDKInitialized = false; } } private void setIncodeCommonConfig() { CommonConfig commonConfig = new CommonConfig.Builder() .setShowExitConfirmation(true) .setShowCloseButton(true) .build(); IncodeWelcome.getInstance().setCommonConfig(commonConfig); } ``` ```swift iOS func incodeSDKInitialize(api_url: String, api_key: String) { IncdOnboardingManager.shared.initIncdOnboarding(url: api_url, apiKey: api_key, loggingEnabled: true, testMode: testMode) { (success, error) in print("IncdOnboarding SDK initialization, success: \(success == true), error: \(error?.description ?? "nil")") self.dispatchGroup.leave() } } func setIncodeCommonConfig() { IncdOnboardingManager.shared.allowUserToCancel = true IncdOnboardingManager.shared.idBackShownAsFrontCheck = true IncdOnboardingManager.shared.idFrontShownAsBackCheck = true } ``` ```javascript React Native const IncodeSDKInitialize = (API_URL, API_KEY) => { IncodeSdk.initialize({ testMode: false, apiConfig: { url: API_URL, key: API_KEY, }, waitForTutorials: true, }) .then((_) => { startWorkflow(); }) .catch((e) => { console.error('Incode SDK failed init', e); }); }; ``` ## Step 2: Create the session Next, a session needs to be created in order for the data to be captured. This requires a Configuration ID, which is also known as a flow ID. To configure a flow, check out the [getting started guide](/get-started-with-incode/quickstart/). ```kotlin Android - Kotlin private fun getSimpleWorkflowSession(): SessionConfig { val sessionConfig: SessionConfig = Builder() .setConfigurationId(Constants.WORKFLOW_ID) .build() return sessionConfig } ``` ```java Android - Java private SessionConfig getSimpleWorkflowSession() { SessionConfig sessionConfig = new SessionConfig.Builder() .setConfigurationId(Constants.WORKFLOW_ID) .build(); return sessionConfig; } ``` ```swift iOS func createWorkflowSessionConfiguration() -> IncdOnboardingSessionConfiguration { return IncdOnboardingSessionConfiguration(configurationId: "PASTE_HERE_WORKFLOW_ID") } ``` ```javascript React Native function getSimpleWorkflowSession() { let sessionConfig: { region: 'ALL', configurationId: WORKFLOW_ID, }; return sessionConfig; } ``` ## Step 3: Execute the Onboarding Once the SDK is initialized, flow is configured, session is created, and callbacks are implemented, then it is ready for the user to start the flow by calling the `startOnboarding` function. ```kotlin Android - Kotlin private fun startWorkflow() { setIncodeCommonConfig() IncodeWelcome.getInstance().startWorkflow( activity, getSimpleWorkflowSession(), getSimpleWorkflowOnboardingListener() ) } ``` ```java Android - Java private void startWorkflow() { setIncodeCommonConfig(); IncodeWelcome.getInstance().startWorkflow( activity, getSimpleWorkflowSession(), getSimpleWorkflowOnboardingListener() ); } ``` ```swift iOS func startStraightforwardOnboarding() { setIncodeCommonConfig() let sessionConfig = createWorkflowSessionConfiguration() IncdOnboardingManager.shared.presentingViewController = self IncdOnboardingManager.shared.startWorkflow(sessionConfig: sessionConfig, delegate: self) } ``` ```javascript React Native function startWorkflow(){ let sessionConfig = getSimpleWorkflowSession(); IncodeSdk.startWorkflow({ sessionConfig: sessionConfig, }) .then((result) => { fetchUserScores(); }) .catch((e) => { // TODO - Manage Onboarding error }); } ``` ## Step 4: Process Results ```kotlin Android - Kotlin private fun fetchUserScores(interviewId: String) { IncodeWelcome.getInstance().getUserScore(FAST, interviewId, object : GetUserScoreListener { override fun onUserScoreFetched(result: UserScoreResult) { Timber.d("onUserScoreFetched: %s", result) validateResultWithBusinessLogic(result) } override fun onUserCancelled() { Timber.d("getUserScore onUserCancelled") } override fun onError(error: Throwable) { Timber.d("getUserScore onError: %s", error) } }) } private fun validateResultWithBusinessLogic(result: UserScoreResult) { // TODO - Apply business rules to check the scores of the session } ``` ```java Android - Java private void fetchUserScores(String interviewId) { IncodeWelcome.getInstance().getUserScore(FAST, interviewId, new GetUserScoreListener() { @Override public void onUserScoreFetched(UserScoreResult result) { Timber.d("onUserScoreFetched: %s", result); validateResultWithBusinessLogic(result); } @Override public void onUserCancelled() { Timber.d("getUserScore onUserCancelled"); } @Override public void onError(Throwable error) { Timber.d("getUserScore onError: %s", error); } }); } private void validateResultWithBusinessLogic(UserScoreResult result) { // TODO - Apply business rules to check the scores of the session } ``` ```swift iOS func fetchUserScore() { IncdOnboardingManager.shared.getUserScore(userScoreFetchMode: UserScoreFetchMode.fast, interviewId: interviewId ,completion: { userScore in if(userScore.error != nil) { validateResultWithBusinessLogic() } else { // TODO - Manage fetch user score error } }) } func validateResultWithBusinessLogic(userScore:UserScore) { // TODO - Apply business rules to check the scores of the session } ``` ```Text React Native function fetchUserScores(interviewId) { IncodeSdk.getUserScore({ mode: 'fast' }) .then((result) => { validateResultWithBusinessLogic(result); }) .catch((e) => { // TODO - Manage getting User Score error }); } function validateResultWithBusinessLogic(result){ // TODO - Apply business rules to check the scores of the session } ``` # Agent initiated Without any integration, onboarding link can be shared with users via SMS directly from Omni dashboard. This is a use case for call centres or customers who must verify their users identity, but not necessary integrate that into their own platform. In the Session list, with option New Manual Session, link for an onboarding can be sent to the user via SMS. 1. Add user phone number 2. Choose a workflow 3. Send SMS 4. Review session result Send the onboarding URL via SMS --- - Path: `release-notes/1790-translations-change-summary` - URL: https://developer.incode.com/release-notes/1790-translations-change-summary/ - Markdown: https://developer.incode.com/release-notes/1790-translations-change-summary.md # EN - English ## 🆕 Added * `capturePreview.acceptedDocuments.BirthCertificate` = `Birth Certificate` * `capturePreview.acceptedDocuments.country` = `{{country}}` * `capturePreview.acceptedDocuments.Currency` = `Currency` * `capturePreview.acceptedDocuments.DriversLicense` = `Drivers License` * `capturePreview.acceptedDocuments.FederalID` = `Federal ID` * `capturePreview.acceptedDocuments.IdentificationCard` = `Identification Card` * `capturePreview.acceptedDocuments.label` = `Accepted documents for:` * `capturePreview.acceptedDocuments.MedicalCard` = `Medical Card` * `capturePreview.acceptedDocuments.Military` = `Military` * `capturePreview.acceptedDocuments.noDocuments` = `No documents accepted for this country. ` * `capturePreview.acceptedDocuments.Other` = `Other` * `capturePreview.acceptedDocuments.Passport` = `Passport` * `capturePreview.acceptedDocuments.Permit` = `Permit` * `capturePreview.acceptedDocuments.ResidenceDocument` = `Residence Document` * `capturePreview.acceptedDocuments.TaxIdentification` = `Tax Identification` * `capturePreview.acceptedDocuments.TravelDocument` = `Travel Document` * `capturePreview.acceptedDocuments.TribalIdentification` = `Tribal Identification` * `capturePreview.acceptedDocuments.Unknown` = `Unknown` * `capturePreview.acceptedDocuments.VehicleRegistration` = `Vehicle Registration` * `capturePreview.acceptedDocuments.Visa` = `Visa` * `capturePreview.acceptedDocuments.VoterIdentification` = `Voter Identification` * `capturePreview.acceptedDocuments.WeaponLicense` = `Weapon License` * `common.refreshPage` = `Refresh` * `commonIssues.idv2.tryAgain` = `Ok, try again` * `errors.dynamicImport.failedToLoad` = `Something unexpected error but we took note of it:` * `errors.dynamicImport.suggestion` = `We'll try again in {{count}} or you can manually refresh` * `errors.dynamicImport.title` = `Sorry, we encountered an issue` * `idv2.capture.autoCapture` = `The photo will be taken automatically` * `idv2.capture.dontMove` = `Don't move your ID for a few seconds` * `idv2.capture.fillFrame` = `Fill the frame with your ID` * `idv2.capture.fillFramePassport` = `Fill the frame with your passport` * `idv2.capture.manualCapture.ariaLabel` = `Manual Capture` * `idv2.capture.manualCapture.title` = `Manual Capture Button` * `idv2.capture.notifications.blur.description` = `Zoom in and out, or tap on the ID` * `idv2.capture.notifications.blur.title` = `ID too blurry` * `idv2.capture.notifications.glare.description` = `Find a better lighting to avoid reflections` * `idv2.capture.notifications.glare.title` = `ID with glare` * `idv2.capture.notifications.notAligned.description` = `Center your ID inside the frame` * `idv2.capture.notifications.notAligned.title` = `ID is not aligned` * `idv2.capture.notifications.showBack.description` = `Flip your ID to show its reverse side` * `idv2.capture.notifications.showBack.title` = `Show the back of ID` * `idv2.capture.notifications.showFront.description` = `Flip your ID to show its front side` * `idv2.capture.notifications.showFront.title` = `Show the front of ID` * `idv2.capture.passport.subtitle` = `Ensure your Passport is readable` * `idv2.capture.passport.title` = `Scan your passport` * `idv2.capture.processing.analyzing` = `Analyzing...` * `idv2.capture.processing.attemptsRemaining` = `{{attempts}}/{{maxAttempts}} attempts remaining` * `idv2.capture.processing.continue` = `Continue` * `idv2.capture.processing.error` = `Error` * `idv2.capture.processing.errors.classification.subtitle` = `Please ensure entire ID is visible and well lit` * `idv2.capture.processing.errors.classification.title` = `ID verification failed` * `idv2.capture.processing.errors.default.subtitle` = `Please try again` * `idv2.capture.processing.errors.default.title` = `There was a problem` * `idv2.capture.processing.errors.glare.subtitle` = `Tilt the ID slightly up or down to minimize the reflection` * `idv2.capture.processing.errors.glare.title` = `Glare present` * `idv2.capture.processing.errors.readability.subtitle` = `Minimize camera shake by holding your phone steady` * `idv2.capture.processing.errors.readability.title` = `Info is not readable` * `idv2.capture.processing.errors.sharpness.subtitle` = `Move ID further away or closer to your phone until the image is focused` * `idv2.capture.processing.errors.sharpness.title` = `Blur present` * `idv2.capture.processing.errors.unacceptable.subtitle` = `Please try with a different document` * `idv2.capture.processing.errors.unacceptable.title` = `ID type is not accepted` * `idv2.capture.processing.errors.upload.subtitle` = `Please check your connection and try again` * `idv2.capture.processing.errors.upload.title` = `ID scan failed` * `idv2.capture.processing.errors.wrongSide.subtitle` = `Capture {{mode}} side of the ID` * `idv2.capture.processing.errors.wrongSide.title` = `Wrong ID side captured` * `idv2.capture.processing.scanBack` = `Scan the back` * `idv2.capture.processing.success` = `Success` * `idv2.capture.processing.successBackSubtitle` = `Now let's continue` * `idv2.capture.processing.successFrontSubtitle` = `Now let's capture the back` * `idv2.capture.processing.successTitle` = `Successfully processed!` * `idv2.capture.processing.tryAgain` = `Try again` * `idv2.capture.takingPhoto` = `Taking photo...` * `idv2.capture.wrongSide.backHint` = `back-id-hint` * `idv2.capture.wrongSide.frontHint` = `front-id-hint` * `idv2.chooser.idButtonDescription` = `National Identity Card, or Driver's License` * `idv2.chooser.idButtonTitle` = `Identity Card` * `idv2.chooser.passportButtonDescription` = `Your country Passport` * `idv2.chooser.passportButtonTitle` = `Passport` * `idv2.permissions.alertAlt` = `fake permission alert` * `idv2.permissions.allow` = `OK, Allow` * `idv2.permissions.denied.allow` = `Allow` * `idv2.permissions.denied.ask` = `Ask` * `idv2.permissions.denied.browser` = `Browser` * `idv2.permissions.denied.camera` = `Camera` * `idv2.permissions.denied.changeTo` = `Change to` * `idv2.permissions.denied.open` = `Open` * `idv2.permissions.denied.or` = `or` * `idv2.permissions.denied.refreshPage` = `Refresh page` * `idv2.permissions.denied.return` = `Return here and press` * `idv2.permissions.denied.scroll` = `Scroll down to select` * `idv2.permissions.denied.settings` = `Settings` * `idv2.permissions.denied.tap` = `Tap` * `idv2.permissions.denied.title` = `Follow the next steps to allow Incode to access your camera` * `idv2.permissions.denied.yourBrowser` = `your browser` * `idv2.permissions.description` = `in order to complete the process` * `idv2.permissions.dontAllow` = `Don't Allow` * `idv2.permissions.fakeDenied.alert` = `alert fake focused` * `idv2.permissions.fakeDenied.allowPermissions` = `Allow permissions` * `idv2.permissions.fakeDenied.quitProcess` = `Quit process` * `idv2.permissions.fakeDenied.title` = `Camera permission is required for your document capture` * `idv2.permissions.fakeDenied.warning` = `warning` * `idv2.permissions.note` = `Note: Depending on your phone, it may say` * `idv2.permissions.or` = `or` * `idv2.permissions.subtitle` = `allow camera permission` * `idv2.permissions.title` = `We need you to` * `idv2.permissions.whileUsing` = `While using the app` * `idv2.tutorial.autoCapture` = `The photo will be taken automatically` * `idv2.tutorial.startScan` = `Let's scan` * `idv2.tutorial.subtitle` = `Ensure your ID is readable` * `idv2.tutorial.title` = `Scan your ID` * `idv2.uploading.analyzing` = `Analyzing...` * `idv2.uploading.imageAlt` = `ID capture` * `onboarding.errors.restartDisabled.message` = `Session restart disabled on Organization level` * `onboarding.errors.restartDisabled.title` = `Can't restart session` * `qes.signatureCheck` = `I agree to the issuance of the required certificate and to signing this document electronically.` * `qes.termsCheck` = `I have read and agree to Incode’s <2>Privacy Policy and Incode’s <6>Terms of Use.` ## ✏️ Modified * `commonIssues.commonIssues`: * Old: `Common Issues` * New: `Common issues` * `commonIssues.infoNotReadable`: * Old: `Info is not readable` * New: `Info not readable` * `commonIssues.takeManually`: * Old: `Take the photo manually` * New: `Take photo manually` * `commonIssues.tryAgain`: * Old: `Ok, try again` * New: `Try again` * `ineCheck.verified`: * Old: `Identity verified!` * New: `Identity submitted for verification` * `notifications.done`: * Old: `Done` * New: `Scan completed` * `notifications.glareDetected`: * Old: `Glare present` * New: `Glare detected` * `notifications.glareDetectedDescription`: * Old: `Tilt the ID slightly up or down to minimize the reflection` * New: `Find a better lighting to avoid reflections` * `notifications.idTypeUnacceptable`: * Old: `ID type is not accepted` * New: `Invalid ID document` * `notifications.idTypeUnacceptableDescription`: * Old: `Please try with a different document` * New: `Try scanning a different one` * `notifications.lowSharpness`: * Old: `Blur present` * New: `Low sharpness` *** --- - Path: `release-notes/bn-bengali` - URL: https://developer.incode.com/release-notes/bn-bengali/ - Markdown: https://developer.incode.com/release-notes/bn-bengali.md # BN - Bengali ## 🆕 Added * `capturePreview.acceptedDocuments.BirthCertificate` = `জন্ম সনদ` * `capturePreview.acceptedDocuments.country` = `{{country}}` * `capturePreview.acceptedDocuments.Currency` = `মুদ্রা` * `capturePreview.acceptedDocuments.DriversLicense` = `ড্রাইভিং লাইসেন্স` * `capturePreview.acceptedDocuments.FederalID` = `ফেডারেল আইডি` * `capturePreview.acceptedDocuments.IdentificationCard` = `পরিচয়পত্র` * `capturePreview.acceptedDocuments.label` = `এর জন্য গৃহীত নথি:` * `capturePreview.acceptedDocuments.MedicalCard` = `মেডিকেল কার্ড` * `capturePreview.acceptedDocuments.Military` = `সামরিক` * `capturePreview.acceptedDocuments.noDocuments` = `এই দেশের জন্য কোনও নথি গ্রহণযোগ্য নয়। ` * `capturePreview.acceptedDocuments.Other` = `অন্যান্য` * `capturePreview.acceptedDocuments.Passport` = `পাসপোর্ট` * `capturePreview.acceptedDocuments.Permit` = `অনুমতি` * `capturePreview.acceptedDocuments.ResidenceDocument` = `বসবাসের নথি` * `capturePreview.acceptedDocuments.TaxIdentification` = `কর শনাক্তকরণ` * `capturePreview.acceptedDocuments.TravelDocument` = `ভ্রমণ নথি` * `capturePreview.acceptedDocuments.TribalIdentification` = `উপজাতি সনাক্তকরণ` * `capturePreview.acceptedDocuments.Unknown` = `অজানা` * `capturePreview.acceptedDocuments.VehicleRegistration` = `যানবাহন নিবন্ধন` * `capturePreview.acceptedDocuments.Visa` = `ভিসা` * `capturePreview.acceptedDocuments.VoterIdentification` = `ভোটার শনাক্তকরণ` * `capturePreview.acceptedDocuments.WeaponLicense` = `অস্ত্র লাইসেন্স` * `common.refreshPage` = `রিফ্রেশ করুন` * `commonIssues.idv2.tryAgain` = `ঠিক আছে, আবার চেষ্টা করুন।` * `errors.dynamicImport.failedToLoad` = `কিছু অপ্রত্যাশিত ত্রুটি কিন্তু আমরা এটি লক্ষ্য করেছি:` * `errors.dynamicImport.suggestion` = `আমরা {{count}} এ আবার চেষ্টা করব অথবা আপনি ম্যানুয়ালি রিফ্রেশ করতে পারেন।` * `errors.dynamicImport.title` = `দুঃখিত, আমরা একটি সমস্যার সম্মুখীন হয়েছি।` * `idv2.capture.autoCapture` = `ছবি স্বয়ংক্রিয়ভাবে তোলা হবে।` * `idv2.capture.dontMove` = `কয়েক সেকেন্ডের জন্য আপনার আইডি সরাবেন না।` * `idv2.capture.fillFrame` = `আপনার পরিচয়পত্র দিয়ে ফ্রেমটি পূরণ করুন।` * `idv2.capture.fillFramePassport` = `আপনার পাসপোর্ট দিয়ে ফ্রেমটি পূরণ করুন।` * `idv2.capture.manualCapture.ariaLabel` = `ম্যানুয়াল ক্যাপচার` * `idv2.capture.manualCapture.title` = `ম্যানুয়াল ক্যাপচার বোতাম` * `idv2.capture.notifications.blur.description` = `জুম ইন এবং আউট করুন, অথবা আইডিতে ট্যাপ করুন` * `idv2.capture.notifications.blur.title` = `আইডি খুব ঝাপসা` * `idv2.capture.notifications.glare.description` = `প্রতিফলন এড়াতে আরও ভালো আলো খুঁজুন।` * `idv2.capture.notifications.glare.title` = `ঝলমলে আইডি` * `idv2.capture.notifications.notAligned.description` = `ফ্রেমের ভেতরে আপনার আইডি কেন্দ্রীভূত করুন` * `idv2.capture.notifications.notAligned.title` = `আইডিটি সারিবদ্ধ নয়` * `idv2.capture.notifications.showBack.description` = `আপনার আইডির উল্টো দিকটি দেখাতে এটি উল্টে দিন।` * `idv2.capture.notifications.showBack.title` = `আইডির পিছনের দিকটি দেখান` * `idv2.capture.notifications.showFront.description` = `আপনার আইডির সামনের দিকটি দেখানোর জন্য উল্টে দিন।` * `idv2.capture.notifications.showFront.title` = `আইডির সামনের অংশ দেখান` * `idv2.capture.passport.subtitle` = `নিশ্চিত করুন যে আপনার পাসপোর্টটি পঠনযোগ্য` * `idv2.capture.passport.title` = `আপনার পাসপোর্ট স্ক্যান করুন` * `idv2.capture.processing.analyzing` = `বিশ্লেষণ করা হচ্ছে...` * `idv2.capture.processing.attemptsRemaining` = `{{attempts}} / {{maxAttempts}} প্রচেষ্টা বাকি আছে` * `idv2.capture.processing.continue` = `চালিয়ে যান` * `idv2.capture.processing.error` = `ত্রুটি` * `idv2.capture.processing.errors.classification.subtitle` = `অনুগ্রহ করে নিশ্চিত করুন যে সম্পূর্ণ আইডি দৃশ্যমান এবং আলোকিত।` * `idv2.capture.processing.errors.classification.title` = `আইডি যাচাইকরণ ব্যর্থ হয়েছে` * `idv2.capture.processing.errors.default.subtitle` = `অনুগ্রহ করে আবার চেষ্টা করুন।` * `idv2.capture.processing.errors.default.title` = `একটা সমস্যা ছিল।` * `idv2.capture.processing.errors.glare.subtitle` = `প্রতিফলন কমাতে আইডিটি সামান্য উপরে বা নীচে কাত করুন।` * `idv2.capture.processing.errors.glare.title` = `ঝলক বর্তমান` * `idv2.capture.processing.errors.readability.subtitle` = `আপনার ফোন স্থির রেখে ক্যামেরার কাঁপুনি কম করুন` * `idv2.capture.processing.errors.readability.title` = `তথ্য পঠনযোগ্য নয়` * `idv2.capture.processing.errors.sharpness.subtitle` = `ছবিটি ফোকাস না করা পর্যন্ত আইডিটি আপনার ফোনের আরও দূরে বা কাছে সরান` * `idv2.capture.processing.errors.sharpness.title` = `ঝাপসা দেখাচ্ছে` * `idv2.capture.processing.errors.unacceptable.subtitle` = `অনুগ্রহ করে অন্য একটি ডকুমেন্ট দিয়ে চেষ্টা করুন।` * `idv2.capture.processing.errors.unacceptable.title` = `আইডি টাইপ গ্রহণযোগ্য নয়` * `idv2.capture.processing.errors.upload.subtitle` = `আপনার সংযোগ পরীক্ষা করে আবার চেষ্টা করুন।` * `idv2.capture.processing.errors.upload.title` = `আইডি স্ক্যান করা যায়নি` * `idv2.capture.processing.errors.wrongSide.subtitle` = `আইডির {{mode}} পাশ ক্যাপচার করুন` * `idv2.capture.processing.errors.wrongSide.title` = `ভুল আইডি সাইড ক্যাপচার করা হয়েছে` * `idv2.capture.processing.scanBack` = `পিছনের দিকটি স্ক্যান করুন` * `idv2.capture.processing.success` = `সাফল্য` * `idv2.capture.processing.successBackSubtitle` = `এবার চলুন শুরু করা যাক` * `idv2.capture.processing.successFrontSubtitle` = `এবার পিছনের দিকটা ধরা যাক।` * `idv2.capture.processing.successTitle` = `সফলভাবে প্রক্রিয়া করা হয়েছে!` * `idv2.capture.processing.tryAgain` = `আবার চেষ্টা করুন` * `idv2.capture.takingPhoto` = `ছবি তোলা হচ্ছে...` * `idv2.capture.wrongSide.backHint` = `ব্যাক-আইডি-ইঙ্গিত` * `idv2.capture.wrongSide.frontHint` = `সামনের-আইডি-ইঙ্গিত` * `idv2.chooser.idButtonDescription` = `জাতীয় পরিচয়পত্র, অথবা ড্রাইভিং লাইসেন্স` * `idv2.chooser.idButtonTitle` = `পরিচয়পত্র` * `idv2.chooser.passportButtonDescription` = `আপনার দেশের পাসপোর্ট` * `idv2.chooser.passportButtonTitle` = `পাসপোর্ট` * `idv2.permissions.alertAlt` = `জাল অনুমতি সতর্কতা` * `idv2.permissions.allow` = `ঠিক আছে, অনুমতি দিন` * `idv2.permissions.denied.allow` = `অনুমতি দিন` * `idv2.permissions.denied.ask` = `জিজ্ঞাসা করুন` * `idv2.permissions.denied.browser` = `ব্রাউজার` * `idv2.permissions.denied.camera` = `ক্যামেরা` * `idv2.permissions.denied.changeTo` = `পরিবর্তন করুন` * `idv2.permissions.denied.open` = `খোলা` * `idv2.permissions.denied.or` = `অথবা` * `idv2.permissions.denied.refreshPage` = `পৃষ্ঠা রিফ্রেশ করুন` * `idv2.permissions.denied.return` = `এখানে ফিরে এসে টিপুন` * `idv2.permissions.denied.scroll` = `নির্বাচন করতে নিচে স্ক্রোল করুন` * `idv2.permissions.denied.settings` = `সেটিংস` * `idv2.permissions.denied.tap` = `ট্যাপ করুন` * `idv2.permissions.denied.title` = `ইনকোডকে আপনার ক্যামেরা অ্যাক্সেস করার অনুমতি দিতে পরবর্তী পদক্ষেপগুলি অনুসরণ করুন।` * `idv2.permissions.denied.yourBrowser` = `তোমার ব্রাউজার` * `idv2.permissions.description` = `প্রক্রিয়াটি সম্পন্ন করার জন্য` * `idv2.permissions.dontAllow` = `অনুমতি দেবেন না` * `idv2.permissions.fakeDenied.alert` = `জাল ফোকাসড সতর্কতা` * `idv2.permissions.fakeDenied.allowPermissions` = `অনুমতি দিন` * `idv2.permissions.fakeDenied.quitProcess` = `প্রক্রিয়াটি বন্ধ করুন` * `idv2.permissions.fakeDenied.title` = `আপনার ডকুমেন্ট ক্যাপচারের জন্য ক্যামেরার অনুমতি প্রয়োজন` * `idv2.permissions.fakeDenied.warning` = `সতর্কতা` * `idv2.permissions.note` = `দ্রষ্টব্য: আপনার ফোনের উপর নির্ভর করে, এটি বলতে পারে` * `idv2.permissions.or` = `অথবা` * `idv2.permissions.subtitle` = `ক্যামেরার অনুমতি দিন` * `idv2.permissions.title` = `আমাদের তোমার দরকার` * `idv2.permissions.whileUsing` = `অ্যাপটি ব্যবহার করার সময়` * `idv2.tutorial.autoCapture` = `ছবি স্বয়ংক্রিয়ভাবে তোলা হবে।` * `idv2.tutorial.startScan` = `স্ক্যান করা যাক।` * `idv2.tutorial.subtitle` = `নিশ্চিত করুন যে আপনার আইডিটি পঠনযোগ্য।` * `idv2.tutorial.title` = `আপনার আইডি স্ক্যান করুন` * `idv2.uploading.analyzing` = `বিশ্লেষণ করা হচ্ছে...` * `idv2.uploading.imageAlt` = `আইডি ক্যাপচার` * `onboarding.errors.restartDisabled.message` = `প্রতিষ্ঠান স্তরে সেশন পুনঃসূচনা অক্ষম করা হয়েছে` * `onboarding.errors.restartDisabled.title` = `সেশন পুনরায় চালু করা যাচ্ছে না` * `qes.signatureCheck` = `আমি প্রয়োজনীয় শংসাপত্র জারি করতে এবং ইলেকট্রনিকভাবে এই নথিতে স্বাক্ষর করতে সম্মত।` * `qes.termsCheck` = `আমি ইনকোডের <2>গোপনীয়তা নীতি পড়েছি এবং তাতে সম্মত। এবং ইনকোডের <6> ব্যবহারের শর্তাবলী .` ## ✏️ Modified * `commonIssues.tryAgain`: * Before: `ঠিক আছে, আবার চেষ্টা করুন` * Now: `আবার চেষ্টা করুন` * `notifications.done`: * Before: `সম্পন্ন` * Now: `স্ক্যান সম্পন্ন হয়েছে` * `notifications.glareDetected`: * Before: `একদৃষ্টি বর্তমান` * Now: `চকচকে ভাব শনাক্ত করা হয়েছে` * `notifications.glareDetectedDescription`: * Before: `প্রতিফলন কমাতে আইডিটিকে সামান্য উপরে বা নিচে কাত করুন` * Now: `প্রতিফলন এড়াতে আরও ভালো আলো খুঁজুন।` * `notifications.idTypeUnacceptable`: * Before: `আইডি টাইপ গ্রহণ করা হয় না` * Now: `অবৈধ আইডি ডকুমেন্ট` * `notifications.idTypeUnacceptableDescription`: * Before: `একটি ভিন্ন নথি দিয়ে চেষ্টা করুন` * Now: `অন্য একটি স্ক্যান করার চেষ্টা করুন` * `notifications.lowSharpness`: * Before: `ব্লার বর্তমান` * Now: `কম তীক্ষ্ণতা` --- - Path: `release-notes/bom-version-mapping` - URL: https://developer.incode.com/release-notes/bom-version-mapping/ - Markdown: https://developer.incode.com/release-notes/bom-version-mapping.md # BOM Version Mapping For those updating dependencies manually, all dependency versions since the inception of the BOM will be documented here. The version of `com.incode.sdk:bom` will always correspond to the version of `com.incode.sdk:welcome` it contains. ### `bom` 5.52.0 Version Mapping * `com.incode.sdk:welcome` -> `5.52.0` * `com.incode.sdk:core-light` -> `3.0.16` * `com.incode.sdk:extensions` -> `1.2.1` * `com.incode.sdk:nfc` -> `1.5.9` * `com.incode.sdk:video-streaming` -> `1.6.0` * `com.incode.sdk:model-face-recognition` -> `3.5.1` * `com.incode.sdk:model-id-face-detection` -> `3.5.1` * `com.incode.sdk:model-liveness-detection` -> `3.2.2` * `com.incode.sdk:model-face-occlusion` -> `0.2.0` * `com.incode.sdk:model-age-estimation` -> `2.2.2` * `com.incode.sdk:wallets` -> `1.0.0` ### `bom` 5.51.0 Version Mapping * `com.incode.sdk:welcome` -> `5.51.0` * `com.incode.sdk:core-light` -> `3.0.16` * `com.incode.sdk:extensions` -> `1.2.1` * `com.incode.sdk:nfc` -> `1.5.7` * `com.incode.sdk:video-streaming` -> `1.6.0` * `com.incode.sdk:model-face-recognition` -> `3.5.1` * `com.incode.sdk:model-id-face-detection` -> `3.5.1` * `com.incode.sdk:model-liveness-detection` -> `3.2.2` * `com.incode.sdk:model-face-occlusion` -> `0.2.0` * `com.incode.sdk:model-age-estimation` -> `2.2.2` * `com.incode.sdk:wallets` -> `1.0.0` ### `bom` 5.50.0 Version Mapping * `com.incode.sdk:welcome` -> `5.50.0` * `com.incode.sdk:core-light` -> `3.0.15` * `com.incode.sdk:extensions` -> `1.2.1` * `com.incode.sdk:nfc` -> `1.5.7` * `com.incode.sdk:video-streaming` -> `1.6.0` * `com.incode.sdk:model-face-recognition` -> `3.5.1` * `com.incode.sdk:model-id-face-detection` -> `3.5.1` * `com.incode.sdk:model-liveness-detection` -> `3.2.2` * `com.incode.sdk:model-face-occlusion` -> `0.2.0` * `com.incode.sdk:model-age-estimation` -> `2.2.2` * `com.incode.sdk:wallets` -> `1.0.0` ### `bom` 5.49.0 Version Mapping * `com.incode.sdk:welcome` -> `5.49.0` * `com.incode.sdk:core-light` -> `3.0.14` * `com.incode.sdk:extensions` -> `1.2.1` * `com.incode.sdk:nfc` -> `1.5.5` * `com.incode.sdk:video-streaming` -> `1.6.0` * `com.incode.sdk:model-face-recognition` -> `3.5.1` * `com.incode.sdk:model-id-face-detection` -> `3.5.1` * `com.incode.sdk:model-liveness-detection` -> `3.2.2` * `com.incode.sdk:model-face-occlusion` -> `0.2.0` * `com.incode.sdk:model-age-estimation` -> `2.2.2` * `com.incode.sdk:wallets` -> `1.0.0` ### `bom` 5.48.0 Version Mapping * `com.incode.sdk:welcome` -> `5.48.0` * `com.incode.sdk:core-light` -> `3.0.13` * `com.incode.sdk:extensions` -> `1.2.1` * `com.incode.sdk:nfc` -> `1.5.4` * `com.incode.sdk:video-streaming` -> `1.6.0` * `com.incode.sdk:model-face-recognition` -> `3.5.1` * `com.incode.sdk:model-id-face-detection` -> `3.5.1` * `com.incode.sdk:model-liveness-detection` -> `3.2.2` * `com.incode.sdk:model-face-occlusion` -> `0.2.0` * `com.incode.sdk:model-age-estimation` -> `2.2.2` * `com.incode.sdk:wallets` -> `1.0.0` ### `bom` 5.47.0 Version Mapping * `com.incode.sdk:welcome` -> `5.47.0` * `com.incode.sdk:core-light` -> `3.0.12` * `com.incode.sdk:extensions` -> `1.2.1` * `com.incode.sdk:nfc` -> `1.5.3` * `com.incode.sdk:video-streaming` -> `1.6.0` * `com.incode.sdk:model-face-recognition` -> `3.5.1` * `com.incode.sdk:model-id-face-detection` -> `3.5.1` * `com.incode.sdk:model-liveness-detection` -> `3.2.2` * `com.incode.sdk:model-face-occlusion` -> `0.2.0` * `com.incode.sdk:model-age-estimation` -> `2.2.2` ### `bom` 5.46.0 Version Mapping * `com.incode.sdk:welcome` -> `5.46.0` * `com.incode.sdk:core-light` -> `3.0.11` * `com.incode.sdk:extensions` -> `1.2.1` * `com.incode.sdk:nfc` -> `1.5.3` * `com.incode.sdk:video-streaming` -> `1.6.0` * `com.incode.sdk:model-face-recognition` -> `3.5.1` * `com.incode.sdk:model-id-face-detection` -> `3.5.1` * `com.incode.sdk:model-liveness-detection` -> `3.2.1` ### `bom` 5.45.1 Version Mapping * `com.incode.sdk:welcome` -> `5.45.1` * `com.incode.sdk:core-light` -> `3.0.10` * `com.incode.sdk:extensions` -> `1.2.1` * `com.incode.sdk:nfc` -> `1.5.3` * `com.incode.sdk:video-streaming` -> `1.6.0` * `com.incode.sdk:model-face-recognition` -> `3.5.1` * `com.incode.sdk:model-id-face-detection` -> `3.5.1` * `com.incode.sdk:model-liveness-detection` -> `3.2.1` ### `bom` 5.45.0 Version Mapping * `com.incode.sdk:welcome` -> `5.45.0` * `com.incode.sdk:core-light` -> `3.0.9` * `com.incode.sdk:extensions` -> `1.2.1` * `com.incode.sdk:nfc` -> `1.5.3` * `com.incode.sdk:video-streaming` -> `1.6.0` * `com.incode.sdk:model-face-recognition` -> `3.5.1` * `com.incode.sdk:model-id-face-detection` -> `3.5.1` * `com.incode.sdk:model-liveness-detection` -> `3.2.1` ### `bom` 5.44.0-hardened Version Mapping * `com.incode.sdk:welcome` -> `5.44.0-hardened` * `com.incode.sdk:core-light` -> `3.0.8` * `com.incode.sdk:extensions` -> `1.2.1` * `com.incode.sdk:nfc` -> `1.5.2` * `com.incode.sdk:video-streaming` -> `1.6.0` * `com.incode.sdk:model-face-recognition` -> `3.5.1` * `com.incode.sdk:model-id-face-detection` -> `3.5.1` * `com.incode.sdk:model-liveness-detection` -> `3.2.1` ### `bom` 5.44.0 Version Mapping * `com.incode.sdk:welcome` -> `5.44.0` * `com.incode.sdk:core-light` -> `3.0.8` * `com.incode.sdk:extensions` -> `1.2.1` * `com.incode.sdk:nfc` -> `1.5.2` * `com.incode.sdk:video-streaming` -> `1.6.0` * `com.incode.sdk:model-face-recognition` -> `3.5.1` * `com.incode.sdk:model-id-face-detection` -> `3.5.1` * `com.incode.sdk:model-liveness-detection` -> `3.2.1` --- - Path: `release-notes/cordova-migration-guide` - URL: https://developer.incode.com/release-notes/cordova-migration-guide/ - Markdown: https://developer.incode.com/release-notes/cordova-migration-guide.md # Migration Guide ## Migration to 4.8.0 ### `setFaceAuthenticationHint` argument renamed to `identityId` The argument is the expected identity ID, not on-screen hint copy: ```diff - setFaceAuthenticationHint(success, error, faceAuthenticationHint) + setFaceAuthenticationHint(success, error, identityId) cordova.exec(success, error, "Cplugin", "setFaceAuthenticationHint", [ - "Look at the camera", + "customer@example.com", ]); ``` ### `setUXConfig` argument renamed to `jsonConfig` ```diff - setUXConfig(success, error, config) + setUXConfig(success, error, jsonConfig) cordova.exec(success, error, "Cplugin", "setUXConfig", [ JSON.stringify({ showFooter: false }), ]); ``` The value is still a JSON string. Only the parameter name changed. ### `initializeSDK()` method parameter `isExternalTokenEnabled` removed External tokens belong on `sessionConfig.token`. Remove the argument and shift subsequent positional args: ```diff cordova.exec(success, error, "Cplugin", "initializeSDK", [ apiKey, apiUrl, loggingEnabled, testMode, - "true", // isExternalTokenEnabled — removed clientExperimentId, e2eeUrl, sslPinningConfig, + "standard", // sdkMode (optional) + "false", // externalAnalyticsEnabled (optional) + "false", // externalScreenshotsEnabled (optional) ]); ``` ### `initializeSDK` error payload format Init failures now return `": "` on both iOS and Android platforms: ```diff - if (err === "configError") { ... } + if (typeof err === "string" && err.indexOf("configError") === 0) { ... } ``` ### Android build requirements raised This release updates the underlying Android SDK to 5.51.0, which raises the minimum Android toolchain your app must build with. There are no JavaScript API changes; all of the work is in your Android build configuration. Update the `android` platform preferences in your app's `config.xml`: ```diff - + + + - + ``` | Requirement | Minimum | Reason| |-------------|---------|-----| | `compileSdk` | 36 | Required by the SDK's updated CameraX and Kotlin dependencies. | | Android Gradle Plugin | 8.9.1 | Required to build against `compileSdk` 36. | | Gradle | 8.14.5 | AGP 8.9.1 is validated against Gradle 8.14.5 for this SDK release. | | Kotlin Gradle plugin | 2.2.21 | The SDK is compiled with Kotlin 2.2.21; any module compiling Kotlin source with the SDK on its classpath must be able to read its Kotlin metadata. | | `kotlinx-coroutines` | 1.9.0 | Required by CameraX 1.6.1. Pulled in transitively; only act if you have explicitly pinned an older version. | | JDK (to run Gradle) | 17 | Required by AGP 8.9.1. The compiled Java source/target level stays at 11. | Pure-Java Cordova apps still need the Kotlin plugin bump. The plugin itself contains Kotlin sources that are compiled with the SDK on the classpath. :::info The preference key that `cordova-android` reads is `AndroidGradlePluginVersion`. If your `config.xml` uses `android-gradlePluginVersion`, it is silently ignored and you will keep building with the platform's default AGP. Rename it. ::: ### OkHttp packaging exclusion: handled by the plugin OkHttp/logging-interceptor 5.3.2 and its transitive JSpecify dependency both ship an identical OSGi manifest at `META-INF/versions/9/OSGI-INF/MANIFEST.MF`, which fails APK packaging with a duplicate-resource error. The plugin now declares this exclusion in its own Gradle configuration, so **no action is required** in a standard Cordova integration. If your build overrides packaging options in a way that drops the plugin's configuration, add the exclusion yourself in `platforms/android/app/build-extras.gradle`: ```groovy android { packaging { resources { excludes += ['META-INF/versions/9/OSGI-INF/MANIFEST.MF'] } } } ``` ### Compose Material3 : Compose minimum versions raised The SDK's Compose-based screens are now built against Compose Material3 1.4.0 and Compose 1.8.0. Cordova apps do not normally resolve Compose directly, so most integrations need no action. Act only if you or another Cordova plugin explicitly pin these libraries below those versions. An older resolved set crashes at runtime (`NoSuchMethodError` / `NoClassDefFoundError` in `androidx.compose.*`) when a Compose screen opens. ## Migration to 4.7.0 ### `initializeSDK()` method parameter `disableJailbreakDetection` removed The `disableJailbreakDetection` parameter has been removed from the `initializeSDK()` method. It has no replacement. If you previously set it, remove it and update your positional arguments. ### Removed deprecated setCommonConfig() method. The deprecated `setCommonConfig()` method that displayed or hid the close button has been removed. Use `showCloseButton()` instead. ## Migration to 4.6.0 ### Renamed `neutral` and `black` color palette tokens on Android The `neutral` and `black` keys in theme's `colorPalette` have been renamed: * `neutral` -> `neutralLight` * `black` -> `neutralDark` If you provided the theme via a JSON config, rename the keys inside `colorPalette`: ```diff "colorPalette": { + "neutralLight": "#ffffff", - "neutral": "#ffffff", + "neutralDark": "#000000", - "black": "#000000", "brand50": "#e5f0ff", ... "positive500": "#189F60", "positive600": "#189F60", "positive800": "#0C5030" } ``` Theme JSON that still uses the old `neutral` and `black` keys will silently fall back to the defaults `#FFFFFF` and `#000000`, because unknown keys are ignored during parsing. Update your JSON to use the new keys to keep your customizations applied. ## Migration to 4.5.0 ### Changed default value for mask check in SelfieScan module The default value for the `maskCheckEnabled` parameter in the `addSelfieScan` module has been changed from `false` to `true`. If you did not previously configure this flag, face mask validation will now be enforced by default during face capture. To preserve the previous behavior, explicitly disable these flags: ```js { module: "addSelfieScan", maskCheckEnabled: "false"} ``` ### Changed default values for face capture checks in FaceAuthentication module The default values for the `faceMaskCheck`, `headCoverCheck`, `lensesCheck`, and `eyesClosedCheck` parameters in the `addFaceAuthentication` module have been changed from `false` to `true`. If you did not previously configure these flags, these validations will now be enforced by default during face authentication. To preserve the previous behavior, explicitly disable these flags: ```js { module: "addFaceAuthentication", faceMaskCheck: "false", headCoverCheck: "false", lensesCheck: "false", eyesClosedCheck: "false" } ``` ### SQLCipher attribution required if you ship an open-source licenses screen on Android Local Room databases used by the SDK are now encrypted at rest with [SQLCipher for Android](https://github.com/sqlcipher/sqlcipher-android), distributed under a BSD-style license. The license requires consumers that redistribute binaries, such as your application, to reproduce its copyright notice "in the documentation and/or other materials provided with the distribution". If your application includes an "Open Source Licenses" screen, please add the SQLCipher notice listed in [Licenses](/sdk-reference/android-licenses/#sqlcipher-for-android-netzeteticsqlcipher-android). No code change is needed if you do not ship such a screen. ## Migration to 4.3.0 ### Removed localization keys on iOS * `incdOnboarding.nameInfo.lastnamePlaceholder` * `incdOnboarding.ccv.invalidCCV` ### Renamed localization keys on iOS * `incdOnboarding.email.title` -> `incdOnboarding.userInformation.email.title` * `incdOnboarding.email.invalidEmail` -> `incdOnboarding.userInformation.email.wrongFormat` * `incdOnboarding.ccv.title` -> `incdOnboarding.userInformation.securityCode.title` * `incdOnboarding.nameInfo.title` -> `incdOnboarding.userInformation.fullName.title` * `incdOnboarding.nameInfo.subtitle` -> `incdOnboarding.userInformation.fullName.subtitle` * `incdOnboarding.nameInfo.namePlaceholder` -> `incdOnboarding.userInformation.fullName.placeholder` * `incdOnboarding.nameInfo.continue` -> `incdOnboarding.userInformation.continue` * `incdOnboarding.ekyc.input.label.fillYourCredentials` -> `incdOnboarding.ekyc.input.title` ## Migration to 4.2.0 ### Updates to document chooser behavior in `IdScan` module The **Show document chooser screen** setting in Dashboard or `showIdTypeChooser` in the SDK now control if the document chooser screen appears. Setting `idType` alone no longer hides the chooser and will be ignored. If you previously pre-set `idType` (either using `idType: ...` in the SDK or in Dashboard) and expected the chooser to be hidden, you must now explicitly disable it or update the Flow configuration accordingly: ```js { module: "addId", idType: "passport", showIdTypeChooser: "false" } ``` ### Android color palette changes If you previously customized the application appearance using a config JSON: ```json { "colorPalette": { "negative500": "#FF5A5F", "negative600": "#E71111", "positive500": "#189F60", "positive600": "#189F60" } } ``` These keys have now been migrated to the following values: * `negative500` -> `negative400` * `negative600` -> `negative500` * `positive500` -> `positive400` * `positive600` -> `positive500` ### iOS color palette changes V2 theme default `colorPalette` values and the JSON keys used for positive and negative semantic colors have changed. If you customize the V2 theme, update your palette to match [About Colors](https://github.com/Incode-Technologies-Example-Repos/Incode-Welcome-Example-iOS/blob/release/5.41.0/USER_GUIDE_CUSTOMIZATION_V2.md#about-colors) in the iOS Customization Guide v2. ### `ID Capture` V2 - Error Screen Customization for Android **Wrong document side customization** If you previously customized the `Wrong document side` error screen, add the following new string resources: ```xml Capture the front side of the ID Capture the back side of the ID ``` This previous string is longer used: ```xml You’ve scanned the wrong document side. Please scan your document again. ``` **No internet connection customization** If you previously customized the `No internet connection` error screen, add the following new string resource: ```xml No internet connection ``` This previously used string is still in use for other error screens and should be kept in your resources: ```xml There was a problem ``` **Retry button customization** The retry button is now customized using a different string resource: ```xml Refresh ``` This previously used string is still in use for other error screens and should be kept in your resources: ```xml Retry ``` ### `Selfie` V2 - Error Screen Customization for Android **No internet connection customization** If you previously customized the `No internet connection` error screen, add the following new string resource: ```xml No internet connection ``` This previously used string is still in use for other error screens and should be kept in your resources: ```xml There was a problem ``` ### Changes in behavior for device environment detection for Android The behavior when detecting device environment vulnerabilities has changed: * **Hook or virtual environment detection**: Detecting hook or virtual environment vulnerabilities in the SDK triggers a native crash, which cannot be caught or handled by application code, resulting in immediate app termination. * **Emulator and root detection**: The flow is not aborted when emulator and root checks are detected. The onboarding process continues normally. ### API Changes The following `initializeSDK()` method optional parameters have been removed: * `disableVirtualEnvironmentDetection` * `disableRootDetection` * `disableEmulatorDetection` * `disableHookCheck` If you were using these parameters in your code, remove them from your `initializeSDK()` method call. Device environment checks can no longer be disabled. ### Added ability to pass `SessionConfig` to `startFaceLogin()` method for Android Now you can supply an optional `sessionConfig` parameter to the `startFaceLogin()`, like this: ```js let sessionConfig = {}; // Optional cordova.exec( function (result) { console.log("Face login Success: " + result); }, function (error) { console.log("Face login Error: " + error); }, "Cplugin", "startFaceLogin", [sessionConfig] ); ``` This allows enabling of end-to-end encryption (E2EE) in Face Login mode on Android. ### Added ability to pass `showIdTypeChooser` parameter to the `addId` module Now you can supply an optional `showIdTypeChooser` parameter to the `addId` module. It will be used by the SDK to decide whether to show the document type chooser. By default, if not supplied, `showIdTypeChooser` param is `true`. ```js { module: "addId", idType: "passport", showIdTypeChooser: "false" } ``` ### `setupOnboardingSession` now accepts a session config object The `setupOnboardingSession` method now expects a **JSON object** as the first argument instead of a plain string `configurationId`. If you previously passed `configurationId` as a string, the method will silently fall back to an empty session configuration, which may cause unexpected behavior. **Before:** ```js cordova.exec(resolve, reject, "Cplugin", "setupOnboardingSession", ["your-config-id"]); ``` **After:** ```js var sessionConfig = { configurationId: "your-config-id", // other optional fields: // token: "...", // e2eEncryptionEnabled: true, // mergeSessionRecordings: false, // validationModules: [...], // externalId: "...", // externalCustomerId: "...", // interviewId: "...", }; cordova.exec(resolve, reject, "Cplugin", "setupOnboardingSession", [sessionConfig]); ``` **Migration:** Wrap your `configurationId` and any other session parameters in a JSON object and pass that object as the first element of the arguments array. The same applies to `startWorkflow` and `startFlow`, which also accept a session config object as the first argument. ### Updated `startOnboardingSection` method with additional parameters You now have to provide `recordSessionConfig` and `sectionTag` parameters when calling `startOnboardingSection` to set the session recording configuration and section tagging. ### Expected crashes when running in a virtual environment on Android It is expected that the app crashes with the following stacktraces when a virtual environment is used. For example: ``` java.lang.NullPointerException at com.incode.welcome_sdk.ThemeConfiguration$Builder.setLabelSmallStyle(SourceFile:1066) at com.incode.welcome_sdk.f.c(SourceFile:150) at com.incode.welcome_sdk.data.local.m.as(SourceFile:22) at com.incode.welcome_sdk.IncodeWelcome.startOnboardingSection(SourceFile:18) ``` ``` java.lang.NullPointerException: Attempt to get length of null array at com.incode.welcome_sdk.data.IncodeWelcomeRepository.d(SourceFile:320) at com.incode.welcome_sdk.data.IncodeWelcomeRepository.i(SourceFile:214) ``` ### `Selfie` V2: No Internet Error Screen Retry Button Change on Android The retry button label shown on the Selfie Scan "No internet" error screen now uses a dedicated string resource: ```xml Refresh ``` The previous string was: ```xml Try again ``` If you overrode `onboard_sdk_try_again` to customize the retry button on the no internet screen, you must now override `onboard_sdk_face_scan_retry` instead. The `onboard_sdk_try_again` string is still used for other retry scenarios. ### `Selfie` V2 - Capture-Only Mode Success Screen Text Change on Android In capture-only mode, the Selfie Scan success screen now uses a different string resource: ```xml Face captured! ``` This previously used string is still in use for non-capture-only mode and should be kept in your resources: ```xml Success! ``` ### `ID Capture` and `Selfie` V2: Permission Open Settings Screen Text Change on Android The Open settings label shown on the Permission open settings screen now uses a dedicated string resource: ```xml Allow permission ``` This previously used string is still in use for the `Geolocation` module and should be kept in your resources: ```xml Open settings ``` ### String Customization on iOS Removed localization key `incdOnboarding.curp.add.generate`. Renamed localization keys: * `incdOnboarding.curp.generation.last.name.placeholder` -> `incdOnboarding.curp.generation.first.last.name.placeholder` * `incdOnboarding.curp.generation.name.placeholder` -> `incdOnboarding.curp.generation.first.name.placeholder` ## Migration to 4.1.0 ### Upload error screen customization on Android: If you previously customized the upload error screen, add the following new string resource: *Add this string:* ```Scan your ID``` *Previous string:* ```Scan your ID``` This string is now used only for customizing the ID Capture V2 tutorial screen title. ### Changed default values in FaceMatch module config on Android (optional) With the move to UxV2, the showUserExists config is now false by default. ### Migrate any custom ThemeConfiguration to the V2 equivalent on Android If your previous integration had any UI customization in supported modules through Theme Configuration, these customizations will now need to be migrated to the equivalents in UXv2. See the Migrating Theme Configurations to UXv2 Guide for more details. ## Migration to 4.0.0 ### Update string resources for the "Need Help" screen in the `IdScan` v2 module on Android The "Need Help" screen has been redesigned on Android, and the customizable strings have been replaced. If you override any of the following strings in your app, replace them with the new ones listed below. No action is required if you do not override these strings. #### Replaced string resources Replace overrides of: ```xml Need help? Some considerations Take the photo manually Center your document in the frame The photo will be taken automatically Avoid blurriness on the document Zoom in and out, or tap on the document Avoid glare on the document Find a better lighting to avoid reflections Avoid darkness on the document Find a place with better lighting ``` with: ```xml Common issues Glare present Tilt the ID slightly up or down to minimize the reflection Blur present Move ID further away or closer to your phone until the image is focused Info is not readable Minimize camera shake by holding your phone steady @string/onboard_sdk_try_again ``` ### Upgrade compileSdk on Android With the update of the internal CameraX dependencies, you will need to upgrade your project's `compileSdk` to level 35: ```groovy compileSdk 35 ``` ### Update Gradle Wrapper on Android Android Gradle Wrapper `8.6.0` requires Gradle `8.7` or higher. Update your Gradle wrapper configuration in `gradle/wrapper/gradle-wrapper.properties`: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip ``` ### If you use any of the following optional dependencies on Android, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:nfc:1.5.2' ``` ### Response Key Name Changes (Breaking Changes) This version introduces **breaking changes** to ensure cross-platform consistency between Android and iOS response structures. The following response keys have been renamed: #### Phone Number Module **Before:** ```javascript { "phone": { "phone": "+1234567890" } } ``` **After:** ```javascript { "phoneData": { "phone": "+1234567890" } } ``` **Migration:** Update your code to use `phoneData` instead of `phone` when accessing phone number results. ```diff cordova.exec(function(winParam) { - const phoneNumber = winParam.phone.phone; + const phoneNumber = winParam.phoneData.phone; }, function(err) { console.log("Error: "+ err); }, "Cplugin", "startOnboardingSection", [{"module":"addPhone"}]); ``` #### Signature Module **Before:** ```javascript { "signaturePath": { "status": "success" } } ``` **After:** ```javascript { "signatureData": { "status": "success" } } ``` **Migration:** Update your code to use `signatureData` instead of `signaturePath` when accessing signature results. ```diff cordova.exec(function(winParam) { - const status = winParam.signaturePath.status; + const status = winParam.signatureData.status; }, function(err) { console.log("Error: "+ err); }, "Cplugin", "startOnboardingSection", [{"module":"addSignature"}]); ``` #### Face Match Module - Existing User Field **Before:** ```javascript { "faceMatchData": { "status": "match", "confidence": 1, "isExistingUser": true, "isFaceMatched": true, "isNameMatched": true } } ``` **After:** ```javascript { "faceMatchData": { "status": "match", "confidence": 1, "existingUser": true, "isFaceMatched": true, "isNameMatched": true } } ``` **Migration:** Update your code to use `existingUser` instead of `isExistingUser` when accessing face match results. ```diff cordova.exec(function(winParam) { - const isExisting = winParam.faceMatchData.isExistingUser; + const isExisting = winParam.faceMatchData.existingUser; }, function(err) { console.log("Error: "+ err); }, "Cplugin", "startOnboardingSection", [{"module":"addFaceMatch"}]); ``` #### Geolocation Module **Before:** ```javascript { "geodata": { "addressFields": { "city": "Belgrade", "colony": "Zvezdara", "postalCode": "", "street": "Banjska", "state": "" } } } ``` **After:** ```javascript { "geoLocationData": { "addressFields": { "city": "Belgrade", "colony": "Zvezdara", "postalCode": "", "street": "Banjska", "state": "" } } } ``` **Migration:** Update your code to use `geoLocationData` instead of `geodata` when accessing geolocation results. ```diff cordova.exec(function(winParam) { - const city = winParam.geodata.addressFields.city; + const city = winParam.geoLocationData.addressFields.city; }, function(err) { console.log("Error: "+ err); }, "Cplugin", "startOnboardingSection", [{"module":"addGeolocation"}]); ``` #### User Consent Module (New Standardized Key) **Before:** ```javascript // User consent result was previously returned inconsistently or not at all ``` **After:** ```javascript { "userConsentData": { "status": true } } ``` **Migration:** If you're using the user consent module, the result is now consistently returned under the `userConsentData` key on both platforms. ```javascript cordova.exec(function(winParam) { const consentGiven = winParam.userConsentData.status; // Process consent status }, function(err) { console.log("Error: "+ err); }, "Cplugin", "startOnboardingSection", [ {"module":"addUserConsent", "title":"Privacy Policy", "content":"..."} ]); ``` ### Why These Changes? These changes ensure that the JavaScript layer receives identical response structures from both Android and iOS platforms, making it easier to write cross-platform code without platform-specific conditionals. #### Document Validation Module - `documentData` Structure **After (Version 4.0.0):** ```javascript { "documentData": { "type": "addressStatement", "image": "", "address": { "city": "", "colony": "", "postalCode": "", "street": "", "state": "" }, "data": "" } } ``` **Migration:** The structure is now standardized with clear field names. The `type` field indicates the document type (e.g., "addressStatement", "medicalDoc", "paymentProof"), `image` contains the base64-encoded image, and `address` contains structured address information when available. #### ID Scan Module - `frontIdData` and `backIdData` Structure **Before:** ```javascript { "frontIdData": { "scanStatus": "success", "idImageBase64": "", // ... other Gson-serialized fields } } ``` **After (Version 4.0.0):** ```javascript { "frontIdData": { "status": "ok", // Renamed from 'scanStatus'. On success: "ok", on error: "unknown", "errorClassification", "errorGlare", "errorSharpness", "errorReadability", "errorInCapture" (iOS only), "errorUnacceptableID" (iOS only), "wrongSide" (iOS only) "image": "", // Renamed from 'idImageBase64' "classifiedIdType": "ID", // Classified document type "idCategory": "primary", // 'primary' or 'secondary' "chosenIdType": "id" // Chosen ID type: 'id' or 'passport' } } ``` **Migration:** Update your code to use the new field names: ```diff cordova.exec(function(winParam) { - const scanStatus = winParam.frontIdData.scanStatus; + const scanStatus = winParam.frontIdData.status; - const idImage = winParam.frontIdData.idImageBase64; + const idImage = winParam.frontIdData.image; + const idCategory = winParam.frontIdData.idCategory; }, function(err) { console.log("Error: "+ err); }, "Cplugin", "startOnboardingSection", [{"module":"addFrontId"}]); ``` **Note:** The same structure applies to `backIdData`. #### ID Process Module - `processIdData` Structure **After (Version 4.0.0):** ```javascript { "processIdData": { "extendedOcrData": "", // Extended OCR data as JSON string "data": { // Structured OCR data "address": { // Address fields "city": "", "colony": "", "postalCode": "", "street": "", "state": "" }, "fullAddress": "", // Complete address string "birthDate": 0, // Timestamp in milliseconds "expirationDate": 0, // Unix timestamp "gender": "", "name": "", // Full name "issueDate": 0, // Unix timestamp "numeroEmisionCredencial": "" // Credential emission number } } } ``` **Migration:** The OCR data is now structured with clear field names and types. Date fields are provided as timestamps for easier manipulation. Access the structured data through the `data` field: ```javascript cordova.exec(function(winParam) { const ocrData = winParam.processIdData.data; const fullName = ocrData.name; const birthDate = new Date(ocrData.birthDate); const address = ocrData.address.city; }, function(err) { console.log("Error: "+ err); }, "Cplugin", "startOnboardingSection", [{"module":"processId"}]); ``` #### Selfie Scan Module - `selfieData` Structure **After (Version 4.0.0):** ```javascript { "selfieData": { "status": "success", "image": "", "spoofAttempt": false } } ``` **Migration:** The structure now includes explicit status and spoof detection fields for better fraud prevention handling. #### Government Validation Module - `govresult` Structure **Before:** ```javascript { "govresult": true } ``` **After (Version 4.0.0):** ```javascript { "govresult": { "status": true } } ``` **Migration:** Update your code to access the status field within the govresult object: ```diff cordova.exec(function(winParam) { - const isValidated = winParam.govresult; + const isValidated = winParam.govresult.status; }, function(err) { console.log("Error: "+ err); }, "Cplugin", "startOnboardingSection", [{"module":"governmentValidation"}]); ``` #### Approve Module - `approveData` Structure **After (Version 4.0.0):** ```javascript { "approveData": { "status": "approved", "id": "", "customerToken": "" } } ``` **Migration:** The approve result is now structured with clear field names. Previously all fields from the ApproveResult object were serialized via Gson. Now only the essential fields are exposed with consistent naming. ```javascript cordova.exec(function(winParam) { const approvalStatus = winParam.approveData.status; const sessionId = winParam.approveData.id; const token = winParam.approveData.customerToken; }, function(err) { console.log("Error: "+ err); }, "Cplugin", "startOnboardingSection", [{"module":"approve"}]); ``` #### NFC Scan Module - `nfcData` Structure **After (Version 4.0.0):** ```javascript { "nfcData": { "birthDate": "", "compositeCheckDigit": "", "dateOfBirthCheckDigit": "", "documentCode": "", "documentNumber": "", "documentNumberCheckDigit": "", "expirationDateCheckDigit": "", "expireAt": "", "gender": "", "issuingStateOrOrganization": "", "nationality": "", "optionalData1": "", "optionalData2": "", "personalNumber": "", "personalNumberCheckDigit": "", "primaryIdentifier": "", "secondaryIdentifier": "", "status": true } } ``` **Migration:** The NFC data structure provides comprehensive passport/ID chip information read from NFC-enabled documents. All fields are extracted from the MRZ (Machine Readable Zone) and chip data. ## Migration to 3.0.0 - It is mandatory that all sample apps now have to provide a source from where to fetch Incode's Android dependency from. For suggested method please check out the README.md [page](/sdk-reference/cordova-sdk/) and its Additional Steps for Android section. ## Migration to 2.9.0 ### Optional dependencies For Android, if you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:video-streaming:1.6.0' implementation 'com.incode.sdk:extensions:1.2.1' implementation 'com.incode.sdk:model-face-recognition:3.5.1' implementation 'com.incode.sdk:model-id-face-detection:3.5.1' implementation 'com.incode.sdk:model-liveness-detection:3.2.1' ``` ### Android minSdk changes For Android, if you use the video-streaming dependency, you need to upgrade your minSdk to 24 or higher. The requirement is coming from the OpenTok dependency, which now requires a minimum SDK version of 24. This update is necessary to ensure compatibility with the 16KB page size support mandated by Google starting from November 1st 2025. More info (https://developer.android.com/guide/practices/page-sizes). ## Migration to 2.7.0 For Android, if you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:model-face-recognition:3.5.0' implementation 'com.incode.sdk:model-id-face-detection:3.5.0' ``` The `qr-face-login` dependency is no longer available and has been removed in this version of the SDK. Please update your project configuration accordingly. Remove the `qr-face-login` dependency from your `build.gradle`: - Update Android `minSdkVersion` in you Android projects's `build.gradle`: ```diff buildscript { ext { - minSdkVersion = 21 + minSdkVersion = 23 } } ``` Remove `com.incode.sdk:camera:1.1.0` dependency in your app’s `build.gradle` file: ```diff dependencies { - implementation 'com.incode.sdk:camera:1.1.0' } ``` ## Migration to 2.5.0 - Update Android to `compileSdk=34`. It can be done by updating `cordova-android` package in `package.json`: ```diff + "cordova-android": "^13.0.0", ``` - Update iOS deployment target to minimum version `13.0` and swift version to `5.0`. Update `config.xml`: ```diff + + + + ``` --- - Path: `release-notes/de-german` - URL: https://developer.incode.com/release-notes/de-german/ - Markdown: https://developer.incode.com/release-notes/de-german.md # DE - German ## 🆕 Added * `capturePreview.acceptedDocuments.BirthCertificate` = `Geburtsurkunde` * `capturePreview.acceptedDocuments.country` = `{{country}}` * `capturePreview.acceptedDocuments.Currency` = `Währung` * `capturePreview.acceptedDocuments.DriversLicense` = `Führerschein` * `capturePreview.acceptedDocuments.FederalID` = `Bundesausweis` * `capturePreview.acceptedDocuments.IdentificationCard` = `Identifikationskarte` * `capturePreview.acceptedDocuments.label` = `Akzeptierte Dokumente für:` * `capturePreview.acceptedDocuments.MedicalCard` = `Medizinische Karte` * `capturePreview.acceptedDocuments.Military` = `Militär` * `capturePreview.acceptedDocuments.noDocuments` = `Für dieses Land werden keine Dokumente akzeptiert. ` * `capturePreview.acceptedDocuments.Other` = `Andere` * `capturePreview.acceptedDocuments.Passport` = `Reisepass` * `capturePreview.acceptedDocuments.Permit` = `Erlaubnis` * `capturePreview.acceptedDocuments.ResidenceDocument` = `Aufenthalt Dokument` * `capturePreview.acceptedDocuments.TaxIdentification` = `Steuerliche Identifizierung` * `capturePreview.acceptedDocuments.TravelDocument` = `Reisedokument` * `capturePreview.acceptedDocuments.TribalIdentification` = `Stammesangehörige Identifikation` * `capturePreview.acceptedDocuments.Unknown` = `Unbekannt` * `capturePreview.acceptedDocuments.VehicleRegistration` = `Fahrzeugzulassung` * `capturePreview.acceptedDocuments.Visa` = `Visum` * `capturePreview.acceptedDocuments.VoterIdentification` = `Wähleridentifikation` * `capturePreview.acceptedDocuments.WeaponLicense` = `Waffenschein` * `common.refreshPage` = `Auffrischen` * `commonIssues.idv2.tryAgain` = `Ok, versuchen Sie es noch einmal` * `errors.dynamicImport.failedToLoad` = `Ein unerwarteter Fehler, aber wir haben ihn zur Kenntnis genommen:` * `errors.dynamicImport.suggestion` = `Wir versuchen es erneut unter {{count}} oder Sie können manuell aktualisieren` * `errors.dynamicImport.title` = `Entschuldigung, wir haben ein Problem` * `idv2.capture.autoCapture` = `Das Foto wird automatisch aufgenommen` * `idv2.capture.dontMove` = `Bewegen Sie Ihren Ausweis ein paar Sekunden lang nicht.` * `idv2.capture.fillFrame` = `Füllen Sie den Rahmen mit Ihrer ID` * `idv2.capture.fillFramePassport` = `Füllen Sie den Rahmen mit Ihrem Reisepass` * `idv2.capture.manualCapture.ariaLabel` = `Manuelle Erfassung` * `idv2.capture.manualCapture.title` = `Manuelle Aufnahmetaste` * `idv2.capture.notifications.blur.description` = `Vergrößern und verkleinern, oder tippen Sie auf die ID` * `idv2.capture.notifications.blur.title` = `ID zu unscharf` * `idv2.capture.notifications.glare.description` = `Finden Sie eine bessere Beleuchtung, um Reflexionen zu vermeiden.` * `idv2.capture.notifications.glare.title` = `ID mit Blendung` * `idv2.capture.notifications.notAligned.description` = `Zentrieren Sie Ihre ID innerhalb des Rahmens` * `idv2.capture.notifications.notAligned.title` = `ID ist nicht ausgerichtet` * `idv2.capture.notifications.showBack.description` = `Drehen Sie Ihren Ausweis um, damit er die Rückseite zeigt.` * `idv2.capture.notifications.showBack.title` = `Zeigen Sie die Rückseite des Ausweises` * `idv2.capture.notifications.showFront.description` = `Drehen Sie Ihren Ausweis um, damit er die Vorderseite zeigt.` * `idv2.capture.notifications.showFront.title` = `Zeigen Sie die Vorderseite des Ausweises` * `idv2.capture.passport.subtitle` = `Stellen Sie sicher, dass Ihr Reisepass lesbar ist` * `idv2.capture.passport.title` = `Scannen Sie Ihren Reisepass` * `idv2.capture.processing.analyzing` = `Analysieren...` * `idv2.capture.processing.attemptsRemaining` = `{{attempts}}/{{maxAttempts}} verbleibende Versuche` * `idv2.capture.processing.continue` = `Weiter` * `idv2.capture.processing.error` = `Fehler` * `idv2.capture.processing.errors.classification.subtitle` = `Bitte stellen Sie sicher, dass der gesamte Ausweis sichtbar und gut beleuchtet ist.` * `idv2.capture.processing.errors.classification.title` = `ID-Überprüfung fehlgeschlagen` * `idv2.capture.processing.errors.default.subtitle` = `Bitte versuchen Sie es erneut` * `idv2.capture.processing.errors.default.title` = `Es gab ein Problem` * `idv2.capture.processing.errors.glare.subtitle` = `Neigen Sie den Ausweis leicht nach oben oder unten, um die Reflexion zu minimieren.` * `idv2.capture.processing.errors.glare.title` = `Blendung vorhanden` * `idv2.capture.processing.errors.readability.subtitle` = `Minimieren Sie Kameraverwacklungen, indem Sie Ihr Telefon ruhig halten.` * `idv2.capture.processing.errors.readability.title` = `Info ist nicht lesbar` * `idv2.capture.processing.errors.sharpness.subtitle` = `Bewegen Sie die ID weiter weg oder näher an Ihr Handy heran, bis das Bild scharf ist.` * `idv2.capture.processing.errors.sharpness.title` = `Unschärfe vorhanden` * `idv2.capture.processing.errors.unacceptable.subtitle` = `Bitte versuchen Sie es mit einem anderen Dokument` * `idv2.capture.processing.errors.unacceptable.title` = `ID-Typ wird nicht akzeptiert` * `idv2.capture.processing.errors.upload.subtitle` = `Bitte überprüfen Sie Ihre Verbindung und versuchen Sie es erneut` * `idv2.capture.processing.errors.upload.title` = `ID-Scan fehlgeschlagen` * `idv2.capture.processing.errors.wrongSide.subtitle` = `Erfassen Sie {{mode}} Seite der ID` * `idv2.capture.processing.errors.wrongSide.title` = `Falsche ID-Seite erfasst` * `idv2.capture.processing.scanBack` = `Scannen Sie die Rückseite` * `idv2.capture.processing.success` = `Erfolg` * `idv2.capture.processing.successBackSubtitle` = `Jetzt geht es weiter` * `idv2.capture.processing.successFrontSubtitle` = `Jetzt wollen wir die Rückseite erfassen` * `idv2.capture.processing.successTitle` = `Erfolgreich bearbeitet!` * `idv2.capture.processing.tryAgain` = `Erneut versuchen` * `idv2.capture.takingPhoto` = `Das Fotografieren...` * `idv2.capture.wrongSide.backHint` = `back-id-hint` * `idv2.capture.wrongSide.frontHint` = `front-id-Hinweis` * `idv2.chooser.idButtonDescription` = `Nationale Identitätskarte oder Führerschein` * `idv2.chooser.idButtonTitle` = `Identitätskarte` * `idv2.chooser.passportButtonDescription` = `Ihr Land Reisepass` * `idv2.chooser.passportButtonTitle` = `Reisepass` * `idv2.permissions.alertAlt` = `Warnung vor gefälschten Genehmigungen` * `idv2.permissions.allow` = `OK, Zulassen` * `idv2.permissions.denied.allow` = `Erlauben Sie` * `idv2.permissions.denied.ask` = `Fragen Sie` * `idv2.permissions.denied.browser` = `Browser` * `idv2.permissions.denied.camera` = `Kamera` * `idv2.permissions.denied.changeTo` = `Wechseln zu` * `idv2.permissions.denied.open` = `Öffnen Sie` * `idv2.permissions.denied.or` = `oder` * `idv2.permissions.denied.refreshPage` = `Seite aktualisieren` * `idv2.permissions.denied.return` = `Kehren Sie hierher zurück und drücken Sie` * `idv2.permissions.denied.scroll` = `Scrollen Sie nach unten und wählen Sie` * `idv2.permissions.denied.settings` = `Einstellungen` * `idv2.permissions.denied.tap` = `Tippen Sie auf .` * `idv2.permissions.denied.title` = `Folgen Sie den nächsten Schritten, um Incode den Zugriff auf Ihre Kamera zu ermöglichen` * `idv2.permissions.denied.yourBrowser` = `Ihr Browser` * `idv2.permissions.description` = `um den Vorgang abzuschließen` * `idv2.permissions.dontAllow` = `Erlauben Sie nicht` * `idv2.permissions.fakeDenied.alert` = `alert fake fokussiert` * `idv2.permissions.fakeDenied.allowPermissions` = `Berechtigungen zulassen` * `idv2.permissions.fakeDenied.quitProcess` = `Beenden des Prozesses` * `idv2.permissions.fakeDenied.title` = `Für Ihre Dokumentenerfassung ist eine Kameraerlaubnis erforderlich` * `idv2.permissions.fakeDenied.warning` = `Warnung` * `idv2.permissions.note` = `Hinweis: Je nach Handy kann es sein, dass es heißt` * `idv2.permissions.or` = `oder` * `idv2.permissions.subtitle` = `Kamerazulassung erlauben` * `idv2.permissions.title` = `Wir brauchen Sie, um` * `idv2.permissions.whileUsing` = `Während der Nutzung der App` * `idv2.tutorial.autoCapture` = `Das Foto wird automatisch aufgenommen` * `idv2.tutorial.startScan` = `Scannen wir` * `idv2.tutorial.subtitle` = `Stellen Sie sicher, dass Ihre ID lesbar ist` * `idv2.tutorial.title` = `Scannen Sie Ihre ID` * `idv2.uploading.analyzing` = `Analysieren...` * `idv2.uploading.imageAlt` = `ID-Erfassung` * `onboarding.errors.restartDisabled.message` = `Sitzungsneustart auf Organisationsebene deaktiviert` * `onboarding.errors.restartDisabled.title` = `Sitzung kann nicht neu gestartet werden` * `qes.signatureCheck` = `Ich erkläre mich mit der Ausstellung der erforderlichen Bescheinigung und mit der elektronischen Unterzeichnung dieses Dokuments einverstanden.` * `qes.termsCheck` = `Ich habe die <2>Datenschutzrichtlinien von Incode und die <6>Nutzungsbedingungen von Incode gelesen und stimme diesen zu.` ## ✏️ Modified * `commonIssues.infoNotReadable`: * Before: `Info ist nicht lesbar` * Now: `Info nicht lesbar` * `commonIssues.takeManually`: * Before: `Nehmen Sie das Foto manuell auf` * Now: `Manuelles Fotografieren` * `commonIssues.tryAgain`: * Before: `Ok, versuchen Sie es noch einmal` * Now: `Erneut versuchen` * `ineCheck.verified`: * Before: `Identität bestätigt!` * Now: `Zur Überprüfung vorgelegte Identität` * `notifications.done`: * Before: `Erledigt` * Now: `Scan abgeschlossen` * `notifications.glareDetected`: * Before: `Blendung vorhanden` * Now: `Blendung erkannt` * `notifications.glareDetectedDescription`: * Before: `Neigen Sie den Ausweis leicht nach oben oder unten, um die Reflexion zu minimieren.` * Now: `Finden Sie eine bessere Beleuchtung, um Reflexionen zu vermeiden.` * `notifications.idTypeUnacceptable`: * Before: `ID-Typ wird nicht akzeptiert` * Now: `Ungültiges ID-Dokument` * `notifications.idTypeUnacceptableDescription`: * Before: `Bitte versuchen Sie es mit einem anderen Dokument` * Now: `Versuchen Sie, einen anderen zu scannen` * `notifications.lowSharpness`: * Before: `Unschärfe vorhanden` * Now: `Geringe Schärfe` --- - Path: `release-notes/en-bz-englishbelize` - URL: https://developer.incode.com/release-notes/en-bz-englishbelize/ - Markdown: https://developer.incode.com/release-notes/en-bz-englishbelize.md # EN-BZ - English (Belize) ## 🆕 Added * `capturePreview.acceptedDocuments.BirthCertificate` = `Birth Certificate` * `capturePreview.acceptedDocuments.country` = `{{country}}` * `capturePreview.acceptedDocuments.Currency` = `Currency` * `capturePreview.acceptedDocuments.DriversLicense` = `Drivers License` * `capturePreview.acceptedDocuments.FederalID` = `Federal ID` * `capturePreview.acceptedDocuments.IdentificationCard` = `Identification Card` * `capturePreview.acceptedDocuments.label` = `Accepted documents for:` * `capturePreview.acceptedDocuments.MedicalCard` = `Medical Card` * `capturePreview.acceptedDocuments.Military` = `Military` * `capturePreview.acceptedDocuments.noDocuments` = `No documents accepted for this country. ` * `capturePreview.acceptedDocuments.Other` = `Other` * `capturePreview.acceptedDocuments.Passport` = `Passport` * `capturePreview.acceptedDocuments.Permit` = `Permit` * `capturePreview.acceptedDocuments.ResidenceDocument` = `Residence Document` * `capturePreview.acceptedDocuments.TaxIdentification` = `Tax Identification` * `capturePreview.acceptedDocuments.TravelDocument` = `Travel Document` * `capturePreview.acceptedDocuments.TribalIdentification` = `Tribal Identification` * `capturePreview.acceptedDocuments.Unknown` = `Unknown` * `capturePreview.acceptedDocuments.VehicleRegistration` = `Vehicle Registration` * `capturePreview.acceptedDocuments.Visa` = `Visa` * `capturePreview.acceptedDocuments.VoterIdentification` = `Voter Identification` * `capturePreview.acceptedDocuments.WeaponLicense` = `Weapon License` * `common.refreshPage` = `Refresh` * `commonIssues.idv2.tryAgain` = `Ok, try again` * `errors.dynamicImport.failedToLoad` = `Something unexpected error but we took note of it:` * `errors.dynamicImport.suggestion` = `We'll try again in {{count}} or you can manually refresh` * `errors.dynamicImport.title` = `Sorry, we encountered an issue` * `idv2.capture.autoCapture` = `The photo will be taken automatically` * `idv2.capture.dontMove` = `Don't move your ID for a few seconds` * `idv2.capture.fillFrame` = `Fill the frame with your ID` * `idv2.capture.fillFramePassport` = `Fill the frame with your passport` * `idv2.capture.manualCapture.ariaLabel` = `Manual Capture` * `idv2.capture.manualCapture.title` = `Manual Capture Button` * `idv2.capture.notifications.blur.description` = `Zoom in and out, or tap on the ID` * `idv2.capture.notifications.blur.title` = `ID too blurry` * `idv2.capture.notifications.glare.description` = `Find a better lighting to avoid reflections` * `idv2.capture.notifications.glare.title` = `ID with glare` * `idv2.capture.notifications.notAligned.description` = `Center your ID inside the frame` * `idv2.capture.notifications.notAligned.title` = `ID is not aligned` * `idv2.capture.notifications.showBack.description` = `Flip your ID to show its reverse side` * `idv2.capture.notifications.showBack.title` = `Show the back of ID` * `idv2.capture.notifications.showFront.description` = `Flip your ID to show its front side` * `idv2.capture.notifications.showFront.title` = `Show the front of ID` * `idv2.capture.passport.subtitle` = `Ensure your Passport is readable` * `idv2.capture.passport.title` = `Scan your passport` * `idv2.capture.processing.analyzing` = `Analyzing...` * `idv2.capture.processing.attemptsRemaining` = `{{attempts}}/{{maxAttempts}} attempts remaining` * `idv2.capture.processing.continue` = `Continue` * `idv2.capture.processing.error` = `Error` * `idv2.capture.processing.errors.classification.subtitle` = `Please ensure entire ID is visible and well lit` * `idv2.capture.processing.errors.classification.title` = `ID verification failed` * `idv2.capture.processing.errors.default.subtitle` = `Please try again` * `idv2.capture.processing.errors.default.title` = `There was a problem` * `idv2.capture.processing.errors.glare.subtitle` = `Tilt the ID slightly up or down to minimize the reflection` * `idv2.capture.processing.errors.glare.title` = `Glare present` * `idv2.capture.processing.errors.readability.subtitle` = `Minimize camera shake by holding your phone steady` * `idv2.capture.processing.errors.readability.title` = `Info is not readable` * `idv2.capture.processing.errors.sharpness.subtitle` = `Move ID further away or closer to your phone until the image is focused` * `idv2.capture.processing.errors.sharpness.title` = `Blur present` * `idv2.capture.processing.errors.unacceptable.subtitle` = `Please try with a different document` * `idv2.capture.processing.errors.unacceptable.title` = `ID type is not accepted` * `idv2.capture.processing.errors.upload.subtitle` = `Please check your connection and try again` * `idv2.capture.processing.errors.upload.title` = `ID scan failed` * `idv2.capture.processing.errors.wrongSide.subtitle` = `Capture {{mode}} side of the ID` * `idv2.capture.processing.errors.wrongSide.title` = `Wrong ID side captured` * `idv2.capture.processing.scanBack` = `Scan the back` * `idv2.capture.processing.success` = `Success` * `idv2.capture.processing.successBackSubtitle` = `Now let's continue` * `idv2.capture.processing.successFrontSubtitle` = `Now let's capture the back` * `idv2.capture.processing.successTitle` = `Successfully processed!` * `idv2.capture.processing.tryAgain` = `Try again` * `idv2.capture.takingPhoto` = `Taking photo...` * `idv2.capture.wrongSide.backHint` = `back-id-hint` * `idv2.capture.wrongSide.frontHint` = `front-id-hint` * `idv2.chooser.idButtonDescription` = `National Identity Card, or Driver's License` * `idv2.chooser.idButtonTitle` = `Identity Card` * `idv2.chooser.passportButtonDescription` = `Your country Passport` * `idv2.chooser.passportButtonTitle` = `Passport` * `idv2.permissions.alertAlt` = `fake permission alert` * `idv2.permissions.allow` = `OK, Allow` * `idv2.permissions.denied.allow` = `Allow` * `idv2.permissions.denied.ask` = `Ask` * `idv2.permissions.denied.browser` = `Browser` * `idv2.permissions.denied.camera` = `Camera` * `idv2.permissions.denied.changeTo` = `Change to` * `idv2.permissions.denied.open` = `Open` * `idv2.permissions.denied.or` = `or` * `idv2.permissions.denied.refreshPage` = `Refresh page` * `idv2.permissions.denied.return` = `Return here and press` * `idv2.permissions.denied.scroll` = `Scroll down to select` * `idv2.permissions.denied.settings` = `Settings` * `idv2.permissions.denied.tap` = `Tap` * `idv2.permissions.denied.title` = `Follow the next steps to allow Incode to access your camera` * `idv2.permissions.denied.yourBrowser` = `your browser` * `idv2.permissions.description` = `in order to complete the process` * `idv2.permissions.dontAllow` = `Don't Allow` * `idv2.permissions.fakeDenied.alert` = `alert fake focused` * `idv2.permissions.fakeDenied.allowPermissions` = `Allow permissions` * `idv2.permissions.fakeDenied.quitProcess` = `Quit process` * `idv2.permissions.fakeDenied.title` = `Camera permission is required for your document capture` * `idv2.permissions.fakeDenied.warning` = `warning` * `idv2.permissions.note` = `Note: Depending on your phone, it may say` * `idv2.permissions.or` = `or` * `idv2.permissions.subtitle` = `allow camera permission` * `idv2.permissions.title` = `We need you to` * `idv2.permissions.whileUsing` = `While using the app` * `idv2.tutorial.autoCapture` = `The photo will be taken automatically` * `idv2.tutorial.startScan` = `Let's scan` * `idv2.tutorial.subtitle` = `Ensure your ID is readable` * `idv2.tutorial.title` = `Scan your ID` * `idv2.uploading.analyzing` = `Analyzing...` * `idv2.uploading.imageAlt` = `ID capture` * `onboarding.errors.restartDisabled.message` = `Session restart disabled on Organization level` * `onboarding.errors.restartDisabled.title` = `Can't restart session` * `qes.signatureCheck` = `I agree to the issuance of the required certificate and to signing this document electronically.` * `qes.termsCheck` = `I have read and agree to Incode’s <2>Privacy Policy and Incode’s <6>Terms of Use.` ## ✏️ Modified * `commonIssues.commonIssues`: * Before: `Common Issues` * Now: `Common issues` * `commonIssues.infoNotReadable`: * Before: `Info is not readable` * Now: `Info not readable` * `commonIssues.takeManually`: * Before: `Take the photo manually` * Now: `Take photo manually` * `commonIssues.tryAgain`: * Before: `Ok, try again` * Now: `Try again` * `ineCheck.verified`: * Before: `Identity verified!` * Now: `Identity submitted for verification` * `notifications.done`: * Before: `Done` * Now: `Scan completed` * `notifications.glareDetected`: * Before: `Glare present` * Now: `Glare detected` * `notifications.glareDetectedDescription`: * Before: `Tilt the ID slightly up or down to minimize the reflection` * Now: `Find a better lighting to avoid reflections` * `notifications.idTypeUnacceptable`: * Before: `ID type is not accepted` * Now: `Invalid ID document` * `notifications.idTypeUnacceptableDescription`: * Before: `Please try with a different document` * Now: `Try scanning a different one` * `notifications.lowSharpness`: * Before: `Blur present` * Now: `Low sharpness` --- - Path: `release-notes/en-english` - URL: https://developer.incode.com/release-notes/en-english/ - Markdown: https://developer.incode.com/release-notes/en-english.md # EN - English ## 🆕 Added * `idv2.permissions.fakeDenied.alert` = `alert fake focused` * `idv2.permissions.fakeDenied.allowPermissions` = `Allow permissions` * `idv2.permissions.fakeDenied.quitProcess` = `Quit process` * `idv2.permissions.fakeDenied.title` = `Camera permission is required for your document capture` * `idv2.permissions.fakeDenied.warning` = `warning` --- - Path: `release-notes/en-english-1` - URL: https://developer.incode.com/release-notes/en-english-1/ - Markdown: https://developer.incode.com/release-notes/en-english-1.md # EN - English ## 🆕 Added * `documentCapture.multiPageDocument.step1.description` = `Make sure the entire document is in the frame` * `documentCapture.multiPageDocument.step1.title` = `Prepare first page` * `documentCapture.multiPageDocument.step2.description` = `Make sure the entire document is in the frame` * `documentCapture.multiPageDocument.step2.title` = `Prepare second page` * `face.tutorial.startCapture` = `Take selfie` * `face.tutorial.subtitle` = `This allows you to sign in using your face.` * `face.tutorial.title` = `Take a selfie` * `idv2.flipAnimation.title` = `Show the back of your ID` --- - Path: `release-notes/en-english-10` - URL: https://developer.incode.com/release-notes/en-english-10/ - Markdown: https://developer.incode.com/release-notes/en-english-10.md # EN - English ## 🆕 Added * `aes.confirmSignature.finishSigning` = `Finish signing` * `aes.reviewDocument.subtitle` = `Make sure you've selected the correct file before you continue to sign.` * `aes.reviewDocument.title` = `Review your document` * `biometricConsent. consentOptions` = `Consent Options` * `common.done` = `Done!` * `common.wontTakeLong` = `This won't take long` * `curp.verifyManually` = `Verify Manually` * `customFields.completed` = `Completed!` * `customFields.continue` = `Continue` * `customFields.processing` = `Processing...` * `customFields.title` = `Enter your information` * `customWatchlist.done` = `Done!` * `customWatchlist.wontTake` = `This won't take long` * `digilocker.denied.tryAgain` = `Try again` * `documentCapture.button.allPagesCaptured` = `All pages captured` * `documentCapture.button.nextPage` = `Next page` * `documentCapture.tutorial.continue` = `Continue` * `documentCapture.tutorial.multiPageDocument.optionalPage.subtitle` = `If there’s another page with relevant information, you can capture it now.` * `ekyb.addAnotherDirector` = `Add another Director (Optional)` * `ekyb.directorNameWithNumber` = `Director {{number}} Name` * `ekyb.directorSurnameWithNumber` = `Director {{number}} Surname` * `ekyb.error.taxId-cn` = `Enter a valid Chinese Unified Social Credit Code (18 alphanumeric characters)` * `ekyb.error.taxId-de` = `Enter a valid German tax ID: VAT (DE + 9 digits), HRB (3–6 digits), HRB (6 digits + letter), or HRA (4–6 digits)` * `ekyb.error.taxId-es` = `Enter a valid Spanish tax ID: NIF (letter + 8 digits), NIE (letter + 7 digits + letter), or DNI (8 digits + letter)` * `ekyb.error.taxId-gb` = `Enter a valid UK tax ID: Registration Number (7–8 digits) or VAT Number (GB followed by 9 digits, or 9 digits alone)` * `ekyb.error.taxId-il` = `Enter a valid Israeli Mispar Osek (9 digits)` * `ekyb.error.taxId-it` = `Enter a valid Italian tax ID: CCIAA/NREA (2 letters + 6–7 digits), company ID (IT + 8 digits), or tax code/VAT (11 digits)` * `ekyb.error.taxId-mx` = `Enter a valid Mexican RFC: Individual (4 letters + 6 digits + 3 alphanumeric) or Business (3 letters + 6 digits + 3 alphanumeric)` * `ekyb.error.taxId-ng` = `Enter a valid Nigerian tax ID (10 digits)` * `ekyb.error.taxId-nl` = `Enter a valid Dutch tax ID: VAT number (NL + 9 digits + B + 2 digits) or KvK number (8 digits)` * `email.placeholder` = `Email` * `forms.placeholder.select` = `Select an option` * `identityReuse.cta.continue` = `Continue with fast verification` * `identityReuse.cta.verify` = `Verify using ID` * `identityReuse.description` = `We will only transfer the data requested by {{companyName}} to complete your verification` * `identityReuse.subtitle` = `You previously verified with one of our partners. Share your data to save time and verify faster.` * `identityReuse.title` = `Share your details for a faster verification` * `idOcr.title` = `Please check your data` * `idv2.capture.expiredId.idScanFailed` = `ID scan failed` * `idv2.capture.expiredId.pleaseTryWithADifferentId` = `Please try with a different document` * `idv2.capture.notifications.idScanFailed` = `ID scan failed` * `idv2.capture.processing.attemptsRemainingLabel` = `attempts remaining` * `idv2.capture.processing.noAttemptsRemaining` = `No attempts remaining` * `idv2.chooser.appleWallet` = `Apple Wallet` * `idv2.chooser.deviceWalletTag` = `Instant` * `idv2.chooser.googleWallet` = `Google Wallet` * `idv2.digilocker.consentDeniedDescription` = `Consent to share documents via DigiLocker was not provided. You can try again or choose another way to verify.` * `idv2.digilocker.consentDeniedTitle` = `Consent denied` * `idv2.digilocker.openingDigilockerForAuthentication` = `Opening DigiLocker for authentication..` * `idv2.digilocker.sessionErrorDescription` = `Unable to restore session. Please restart the verification process.` * `idv2.digilocker.sessionErrorTitle` = `Session Error` * `idv2.digilocker.takingYouToDigilocker` = `Taking you to DigiLocker..` * `idv2.digilocker.timeoutDescription` = `The DigiLocker request did not complete within the expected time. Please retry or select an alternate verification method.` * `idv2.digilocker.timeoutTitle` = `Session timed out..` * `idv2.digilocker.verificationCompleteTitle` = `Identity successfully verified` * `idv2.digitalIdUpload.fileTooLargeScreen.cta` = `Choose another file` * `idv2.digitalIdUpload.fileTooLargeScreen.subtitle` = `The selected file is larger than 5 MB, please upload a smaller one` * `idv2.digitalIdUpload.fileTooLargeScreen.title` = `File is too large` * `idv2.permissions.denied.cameraFindSiteAllow` = `Camera Find site Allow` * `loadingCircle.preparingCamera` = `Preparing camera` * `manualIdUpload.generic` = `Please upload the correct document` * `manualIdUpload.glareDetected` = ` Glare present` * `manualIdUpload.hintIdReadable` = `Ensure text on ID is readable.` * `manualIdUpload.hintPassportReadable` = `Ensure text on Passport is readable.` * `manualIdUpload.hintSharpAndGlareFree` = `Photo must be sharp and glare-free.` * `manualIdUpload.lowSharpness` = `Blur present` * `manualIdUpload.qualityRejected` = `Image quality is too low.` * `manualIdUpload.readabilityIssue` = `Info is not readable` * `manualIdUpload.subtitle` = `Ensure your ID is readable` * `manualIdUpload.uploadingSubtitle` = `Uploading your file` * `manualIdUpload.uploadingTitle` = `Hold on a sec...` * `manualIdUpload.wrongDocument` = `Please upload the correct document` * `onboarding.errors.onboardingUrlAlreadyUsed.message` = `It looks like this URL is already in use` * `onboarding.errors.onboardingUrlAlreadyUsed.title` = `Your URL is invalid` * `otp.resendCodeAvailable` = `You can now resend the code` * `otp.timerFiveSeconds` = `5 seconds remaining` * `otp.timerStarted` = `You can request a new code in {{ time }} seconds` * `otp.timerTenSeconds` = `10 seconds remaining before you can request a new code` * `otp.verificationCode` = `Verification code` * `phone.invalidPhone` = `Invalid phone number. Try again.` * `phone.optIn` = `I agree to receive SMS notifications` * `phone.serverError` = `Something went wrong. Try again later.` * `qes.documentsReviewedCheck` = `I confirm that I have reviewed the documents to be signed listed above before signing.` * `qes.issuanceCheck` = `I agree to the issuance of a Qualified Certificate for electronic signatures by Incode Czech Republic s.r.o., acting as a Qualified Trust Service Provider (QTSP).` * `qes.newTermsCheck` = `I have read, understood, and agree to the <2>Terms of Use and <6>Privacy Policy applicable to the issuance and use of this certificate.` * `qes.qesAcknowledgementCheck` = `I acknowledge that this process will result in a Qualified Electronic Signature (QES), which has the same legal effect as a handwritten signature under EU law (eIDAS, Regulation (EU) 910/2014).` * `qes.qscdConfirmationCheck` = `I confirm that the signature is created using a Qualified Signature Creation Device (QSCD) and that I maintain sole control over the signing process.` * `redirect.didntReceiveLinkActions` = `Didn't receive the link? Resend or Change phone number` * `redirect.linkResent` = `Link successfully resent` * `redirect.linkSentTo` = `To : {{phone}}` * `signature.fullSignaturePlaceholder` = `Sign here` * `signature.fullSignatureTitle` = `Draw your signature` * `signature.initialsPlaceholder` = `Draw your initials here` * `signature.initialsTitle` = `Write your initials` * `signature.subtitle` = `Use your finger or mouse` * `signature.successTitle` = `Signed successfully!` * `userData.cpf` = `CPF` * `v2.redirectToMobile.continueOnDesktop` = `Continue on desktop` * `v2.redirectToMobile.qr.description` = `Scan the QR code to verify on your mobile device.` * `v2.redirectToMobile.sms.description` = `Enter your phone number to receive a link to verify via SMS` * `v2.redirectToMobile.sms.sendSms` = `Send link via SMS` * `v2.redirectToMobile.subtitle` = `You’ll need a valid government-issued ID and a selfie.` * `v2.redirectToMobile.tabs.0` = `Scan QR` * `v2.redirectToMobile.tabs.1` = `Send SMS` * `v2.redirectToMobile.title` = `Verify your identity` * `v2.settings.language` = `Language` * `validation.invalidDate` = `Invalid date` * `verification.errors.countryNotSupported` = `Request unsuccessful. Country not supported for EKYC.` * `verification.errors.exactly10Characters` = `Must be exactly 10 characters` * `verification.errors.fieldRequiredDynamic` = `{{fieldName}} is required` * `verification.errors.idNumRequired` = `National ID number required` * `verification.errors.invalidPostalCodeFixedLength` = `Please enter a {{length}} digit Postal Code` * `verification.errors.onlyLettersAndNumbers` = `Only letters and numbers are allowed` * `verification.errors.taxIdRequired` = `Tax ID is required` * `verification.labels.panNumber` = `PAN number` * `watchlistForBusiness.title` = `Watchlist for Business` ## ✏️ Modified * `aes.confirmSignature.addDocument`: * Old: `Add document` * New: `Upload document` * `aes.confirmSignature.fail`: * Old: `Something went wrong..` * New: `Something went wrong` * `aes.confirmSignature.subtitle`: * Old: `The following documents will be signed` * New: `Please accept the terms below to complete your signature.` * `aes.confirmSignature.terms1.title`: * Old: `I accept the terms and conditions of the Trust Center` * New: `I accept the terms and conditions of the <2>Trust Center` * `aes.confirmSignature.title`: * Old: `Confirm your signature` * New: `Accept and sign` * `aes.confirmSignature.uploadDescription`: * Old: `PDF format supported` * New: `Supports PDF files` * `aes.confirmSignature.viewDocument`: * Old: `View doc` * New: `View` * `documentCapture.review.error.description`: * Old: `Make sure all the information on the document is clear and legible.` * New: `Some pages were unclear or incomplete. Recapture all document pages to continue.` * `documentCapture.review.error.title`: * Old: `Unable to process` * New: `Document needs to be recaptured` * `documentCapture.review.tryAgain`: * Old: `Try again` * New: `Recapture document` * `idv2.chooser.digitalIdButtonTitle`: * Old: `Digital Id` * New: `Digital ID` * `manualCapture.ariaLabel`: * Old: `manual capture button` * New: `capture photo` * `manualIdUpload.uploadPassport`: * Old: `Upload passport` * New: `Passport` * `userData.sex`: * Old: `Sex` * New: `Gender` * `v2.idError.attemptsLeft_other`: * Old: `{{count}} attempt remaining` * New: `{{count}} attempts remaining` --- - Path: `release-notes/en-english-2` - URL: https://developer.incode.com/release-notes/en-english-2/ - Markdown: https://developer.incode.com/release-notes/en-english-2.md # EN - English ## 🆕 Added * `common.attemptsRemaining_other` = `{{count}} attempts remaining` * `common.attemptsRemaining_one` = `1 attempt remaining` * `idv2.capture.processing.errors.wrongSide.back.subtitle` = `Capture back side of the ID` * `idv2.capture.processing.errors.wrongSide.front.subtitle` = `Capture front side of the ID` * `idv2.needHelp.open` = `Open Need help modal` * `notifications.centerFaceV2` = `Make sure you align the face within the silhouette` * `notifications.cropDescription` = `Please try again with your face centered in the frame` * `notifications.multipleDescription` = `Make sure only one face is visible in the frame` * `notifications.onFaceAngleV2` = `Align face within the white silhouette` * `notifications.portraitDescription` = `Please hold your device in portrait mode` * `notifications.selfie.manualCaptureButtonLabel` = `Manual capture button` * `notifications.selfie.manualCaptureLabel` = `Manual capture on. Press button to take photo.` * `notifications.unableToCropDescription` = `Please try again with your face clearly visible` * `retake.titleFrontLabel` = `Review front ID photo` * `selfiev2.manualCapture.instructions` = `Center your face in the silhouette and press the button to capture` * `tutorial.back.titleLabel` = `Now scan the back side of your ID` * `webviews.step1` = `Go to 'Settings' → 'Apps'` * `webviews.step2` = `Search for the App` * `webviews.step3` = `Allow camera permission` --- - Path: `release-notes/en-english-3` - URL: https://developer.incode.com/release-notes/en-english-3/ - Markdown: https://developer.incode.com/release-notes/en-english-3.md # EN - English ## 🆕 Added * `errors.dynamicImport.suggestion_one` = `We'll try again in {{count}} second or you can manually refresh` * `errors.dynamicImport.suggestion_other` = `We'll try again in {{count}} seconds or you can manually refresh` * `idv2.commonIssues.firstStep` = `1. Fill the frame with your ID` * `idv2.commonIssues.secondStep` = `2. Press the button` * `verification.labels.gender` = `Gender` * `verification.labels.idNum` = `National ID Number` * `verification.labels.idNum1` = `TAX ID Number` ## ✏️ Modified * `notifications.selfieCaptureFailedDescription`: * Before: `We couldn't capture the selfie` * Now: `Your selfie will be manually reviewed later` * `notifications.spoof`: * Before: `Selfie capture failed` * Now: `Selfie processing failed` * `notifications.spoofDescription`: * Before: `We couldn’t capture selfie. Please try again.` * Now: `We couldn’t process your selfie. Please try again` * `notifications.spoofDescriptionNoTries`: * Before: `We couldn’t capture selfie.` * Now: `Your selfie will be manually reviewed later` * `retake.titleBack`: * Before: `Review <1>BACK ID photo` * Now: `Review BACK ID photo` * `retake.titleFront`: * Before: `Review <1>FRONT ID photo` * Now: `Review FRONT ID photo` * `retake.titlePassport`: * Before: `Review <1>PASSPORT photo` * Now: `Review PASSPORT photo` * `selfie.spoof`: * Before: `Selfie capture failed` * Now: `Selfie processing failed` * `selfie.spoofDescription`: * Before: `We couldn’t capture selfie. Please try again.` * Now: `We couldn’t process your selfie. Please try again` * `tutorial.back.title`: * Before: `Now scan the <1>back side of your ID` * Now: `Now scan the back side of your ID` * `videoSelfie.errors.noInternetConnectionDescription`: * Before: `Wait for the internet to return to continue the process or connect to an available network` * Now: `Wait for the internet to return to continue the process or connect to an available network.` --- - Path: `release-notes/en-english-4` - URL: https://developer.incode.com/release-notes/en-english-4/ - Markdown: https://developer.incode.com/release-notes/en-english-4.md # EN - English ## 🆕 Added * `documentCapture.skip` = `Skip This Step` * `idv2.capture.processing.uploading` = `Uploading...` * `idv2.deepsightPermissions.subtitle` = `permission` * `idv2.deepsightPermissions.title` = `Allow camera and motion ` * `idv2.permissions.allowPermissionsV2` = `Allow camera permissions` * `idv2.permissions.inOrderToCompleteTheProcess` = `in order to complete the process` * `idv2.unacceptedId.acceptedDocuments` = `Accepted documents for:` * `idv2.unacceptedId.attemptsLeft_other` = `({{count}} attempts left)` * `idv2.unacceptedId.attemptsLeft_one` = `({{count}} attempt left)` * `idv2.unacceptedId.birthCertificate` = `Birth Certificate` * `idv2.unacceptedId.changeMethod` = `Change verification method` * `idv2.unacceptedId.currency` = `Currency` * `idv2.unacceptedId.driversLicense` = `Driver's License` * `idv2.unacceptedId.federalId` = `Federal ID` * `idv2.unacceptedId.identificationCard` = `Identification Card` * `idv2.unacceptedId.identificationCardDescription` = `Only INE issued from 2017 onwards.` * `idv2.unacceptedId.medicalCard` = `Medical Card` * `idv2.unacceptedId.military` = `Military` * `idv2.unacceptedId.multipleNationalities` = `Multiple nationalities?` * `idv2.unacceptedId.noDocuments` = `No documents accepted for this country` * `idv2.unacceptedId.other` = `Other` * `idv2.unacceptedId.passport` = `Passport` * `idv2.unacceptedId.passportDescription` = `Only Passports issued in 2014.` * `idv2.unacceptedId.permit` = `Permit` * `idv2.unacceptedId.residenceDocument` = `Residence Document` * `idv2.unacceptedId.seeDifferentCountry` = `See a different country` * `idv2.unacceptedId.taxIdentification` = `Tax Identification` * `idv2.unacceptedId.travelDocument` = `Travel Document` * `idv2.unacceptedId.tribalIdentification` = `Tribal Identification` * `idv2.unacceptedId.tryAgain` = `Try again` * `idv2.unacceptedId.unknown` = `Unknown` * `idv2.unacceptedId.unknownCountry` = `Unknown` * `idv2.unacceptedId.vehicleRegistration` = `Vehicle Registration` * `idv2.unacceptedId.visa` = `Visa` * `idv2.unacceptedId.voterIdentification` = `Voter Identification` * `idv2.unacceptedId.weaponLicense` = `Weapon License` * `notifications.accessDenied` = `Access Denied` * `notifications.accessDeniedDescription` = `We couldn’t process your selfie. Please try again` * `notifications.lowQualityImage` = `Low quality conditions` * `notifications.lowQualityImageDescription` = `Stay still for the capture, and make sure your face is clear and visible` * `notifications.noAttemptsRemaining` = `No attempts remaining` * `videoSelfie.processingStep` = `Processing...` ## ✏️ Modified * `errors.dynamicImport.failedToLoad`: * Old: `Something unexpected error but we took note of it:` * New: `Some unexpected error happened, but we took note of it:` * `idv2.capture.processing.errors.unacceptable.subtitle`: * Old: `Please try with a different document` * New: `Scan another one from the accepted list` * `idv2.capture.processing.errors.unacceptable.title`: * Old: `ID type is not accepted` * New: `ID document not accepted` * `idv2.permissions.denied.cameraAllow`: * Old: `Tap Camera → Allow` * New: `Tap Camera Allow` * `idv2.permissions.denied.siteSettings`: * Old: `Settings → Site settings` * New: `Settings Site settings` --- - Path: `release-notes/en-english-5` - URL: https://developer.incode.com/release-notes/en-english-5/ - Markdown: https://developer.incode.com/release-notes/en-english-5.md # EN - English ## 🆕 Added * ` desktop.idv2.digitalIdUpload.successfullyProcessed` = `Successfully processed!` * `email.verified` = `Email verified!` * `email.verify` = `Verify your email` * `email.willSendCode` = `We'll send you a code to ensure it's yours` * `geolocationv2.addressBar` = `On your address bar tap on AA` * `geolocationv2.allowLocationAccess` = `Allow location access` * `geolocationv2.allowUsing` = `Choose Allow while using` * `geolocationv2.appsBrowser` = `Go to Apps Your browser` * `geolocationv2.appsChrome` = `Go to Apps Chrome` * `geolocationv2.appsFirefox` = `Go to Apps Firefox` * `geolocationv2.appsOpera` = `Go to Apps Opera` * `geolocationv2.choosePermissions` = `Choose Ask next time or While using the app` * `geolocationv2.determineLocation` = `We need to determine your current location` * `geolocationv2.goBackSafari` = `Back to Settings Safari` * `geolocationv2.instructions.allowLocation` = `Allow Location Permissions` * `geolocationv2.locationOn` = `Make sure Location Services is on` * `geolocationv2.openSettings` = `Open Settings` * `geolocationv2.openSettingsAndroid` = `Open your device settings` * `geolocationv2.permissionsLocation` = `Tap Permissions Location` * `geolocationv2.privacySecurity` = `Open Privacy & Security` * `geolocationv2.refreshPage` = `Refresh page` * `geolocationv2.returnAndRefresh` = `Return here and Refresh page` * `geolocationv2.scrollDownChrome` = `Scroll down and tap Chrome` * `geolocationv2.scrollDownFirefox` = `Scroll down and tap Firefox` * `geolocationv2.scrollDownOpera` = `Scroll down and tap Opera` * `geolocationv2.skip` = `Skip this step` * `geolocationv2.tapLocation` = `Tap Location` * `geolocationv2.tapLocationAllow` = `Tap Location and choose Allow` * `geolocationv2.tapSettings` = `Tap Website Settings
          Allow Location Permissions
          ` * `idv2.capture.notifications.expiredId` = `Expired ID document` * `idv2.capture.notifications.useDifferent` = `Use a different ID` * `idv2.capture.processing.processing` = `Processing...` * `idv2.capture.processing.scanFront` = `Scan the front` * `idv2.capture.processing.successBackSubtitleScanFront` = `Now let’s capture the front` * `idv2.chooser.chooseHowToVerifyTitle` = `Choose how to verify` * `idv2.chooser.digitalIdUploadButtonTitle` = `Upload Digital ID` * `idv2.chooser.manualUploadButtonTitle` = `Upload ID` * `idv2.digitalIdUpload.analyzing` = `Analyzing...` * `idv2.digitalIdUpload.digitalIdUploadButtonTitle` = `Upload digital ID` * `idv2.digitalIdUpload.errorScreen.scanId` = `Scan your ID` * `idv2.digitalIdUpload.loadingSuccess.letsContinue` = `Let's continue` * `idv2.digitalIdUpload.reviewScreen.description` = `Make sure this is the correct file before you continue verification process.` * `idv2.digitalIdUpload.reviewScreen.replaceButton` = `Replace file` * `idv2.digitalIdUpload.reviewScreen.replaceFileButton` = `Continue` * `idv2.digitalIdUpload.reviewScreen.title` = `Review your document` * `idv2.digitalIdUpload.screenDescription` = `A government-issued PDF file or photo with your details, picture and a QR code` * `idv2.digitalIdUpload.screenTitle` = `Upload your digital ID` * `idv2.digitalIdUpload.supportedFileTypesCopy` = `PDF file or JPG, PNG photo` * `idv2.digitalIdUpload.unknownDocumentTypeScreen.errorTitle` = `Couldn’t verify your ID` * `idv2.digitalIdUpload.wrongDocumentType` = `ID document not accepted` * `idv2.digitalIdUpload.wrongDocumentTypeScreen.errorSubtitle` = `Use a different ID from the accepted list:` * `idv2.digitalIdUpload.wrongDocumentTypeScreen.errorTitle` = `ID document not accepted` * `idv2.digitalIdUpload.wrongDocumentTypeScreen.tryAgainButton` = `Try again` * `idv2.manualUploadLoading.subtitle` = `Uploading your file` * `idv2.permissions.denied.chrome.fifthStep` = `Then, refresh the page` * `idv2.permissions.denied.chrome.firstStep` = `At the top left of the website click the lock` * `idv2.permissions.denied.chrome.fourthStep` = `Click it, and choose Allow` * `idv2.permissions.denied.chrome.secondStep` = `A small menu will open` * `idv2.permissions.denied.chrome.thirdStep` = `Look for Camera` * `idv2.permissions.denied.firefox.fifthStep` = `Then, refresh the page` * `idv2.permissions.denied.firefox.firstStep` = `Click the camera or the lock icon` * `idv2.permissions.denied.firefox.fourthStep` = `Click it, and choose Allow` * `idv2.permissions.denied.firefox.secondStep` = `A menu will open` * `idv2.permissions.denied.firefox.thirdStep` = `Look for Camera` * `idv2.permissions.denied.opera.fifthStep` = `Then, refresh the page` * `idv2.permissions.denied.opera.firstStep` = `Click the lock icon` * `idv2.permissions.denied.opera.fourthStep` = `Click it, and choose Allow` * `idv2.permissions.denied.opera.secondStep` = `A small menu will open` * `idv2.permissions.denied.opera.thirdStep` = `Look for Camera` * `idv2.permissions.denied.safari.fifthStep` = `Click it, and choose Allow` * `idv2.permissions.denied.safari.firstStep` = `At the top left, click Safari` * `idv2.permissions.denied.safari.fourthStep` = `Find where it says Camera` * `idv2.permissions.denied.safari.secondStep` = `Click Settings for This Website…` * `idv2.permissions.denied.safari.sixthStep` = `Then, refresh the page` * `idv2.permissions.denied.safari.thirdStep` = `A box will pop up` * `nameCapturev2.title` = `Enter your name` * `nameCapturev2.verified` = `Name verified!` * `otp.didntReceive` = `Didn’t receive the code?` * `otp.enterCodeEmail` = `Enter the code we've sent to your email` * `otp.errorv2` = `Code expired, please try again` * `otp.resendCode` = `Resend code` * `otp.resendCountdown` = `Resend code in {{time}}s` * `redirect.didntReceive` = `Didn’t receive the link?` * `redirect.enterPhoneNumber` = `Enter your phone number to receive a link to verify via SMS` * `redirect.linkSent` = `Link sent!` * `redirect.phishingResistance.explanation1` = `You’ll need a valid government-issued ID and a selfie.` * `redirect.phishingResistance.recommendedBrowser` = `We recommend using Safari on iOS and Chrome on Android.` * `redirect.phishingResistance.titleClient` = `Verify your identity` * `redirect.resend` = `Resend` * `redirect.scanQRTitle` = `Scan QR` * `redirect.scanQrv2` = `Scan the QR code to verify on your mobile device.` * `redirect.sendLinkSms` = `Send link via SMS` * `redirect.sendSms` = `Send SMS` --- - Path: `release-notes/en-english-6` - URL: https://developer.incode.com/release-notes/en-english-6/ - Markdown: https://developer.incode.com/release-notes/en-english-6.md # EN - English ## 🆕 Added * `curp.continue` = `Continue` * `curp.dontHave` = `I don't have a CURP` * `curp.enterCurp` = `Enter your CURP` * `curp.generate` = `Generate your CURP` * `curp.generateCta` = `Generate` * `curp.labels.birthState` = `Birth state` * `curp.labels.dob` = `Date of birth` * `curp.labels.femaleV2` = `Female` * `curp.labels.firstLast` = `First lastname` * `curp.labels.firstName` = `First name` * `curp.labels.genderV2` = `Gender` * `curp.labels.maleV2` = `Male` * `curp.labels.other` = `Non-binary/Other` * `curp.labels.secondLast` = `Second lastname` * `curp.placeholder.curp` = `Your CURP` * `curp.placeholder.firstLast` = `Your first lastname` * `curp.placeholder.firstName` = `Your first name` * `curp.placeholder.gender` = `Choose gender` * `curp.placeholder.secondLast` = `Your second lastname` * `curp.placeholder.state` = `Select state` * `curp.status.checkInfo` = `Please check entered information` * `curp.status.confirm` = `Confirm your CURP` * `curp.status.couldntGenerate` = `Couldn't generate CURP` * `curp.status.edit` = `Edit information` * `curp.status.generating` = `Generating CURP...` * `curp.status.notVerified` = `CURP not verified` * `curp.status.tryAgain` = `Try again` * `curp.status.verified` = `CURP verified!` * `curp.status.verifying` = `Verifying your CURP...` * `faceMatch.continue` = `Continue` * `faceMatch.facesNoMatch` = `Faces do not match` * `faceMatch.firstId` = `First ID` * `faceMatch.id` = `ID` * `faceMatch.matched` = `Matched!` * `faceMatch.matching` = `Verifying identity` * `faceMatch.processing` = `Processing...` * `faceMatch.secondId` = `Second ID` * `faceMatch.selfie` = `Selfie` * `face.tutorial.ageAssuranceStartCapture` = `Verify age` * `face.tutorial.ageAssuranceSubtitle` = `Your image will not be stored or shared with any third-party to protect your privacy` * `face.tutorial.ageAssuranceTitle` = `Take a selfie to verify your age` * `face.tutorial.autoCapture` = `Stay still, selfie will be taken automatically` * `home.start` = `Start` * `idv2.ageVerificationPage.ageVerification` = `Age verification` * `idv2.ageVerificationPage.Continue` = `Continue` * `idv2.ageVerificationPage.showYourIdAndScanIt` = `Show your ID and scan it` * `idv2.ageVerificationPage.TheRestOfYourInformationWillBeDeletedToEnsureYourPrivacy` = `The rest of your information will be deleted to ensure your privacy` * `idv2.ageVerificationPage.weNeedToScanYourIDToKnowYourAge` = `We need to scan your ID to know your age` * `idv2.ageVerificationPage.weOnlyUseTheDateOfBirthInformation` = `We only use the date of birth information` * `idv2.barCodeDetection.processingSubtitle` = `We’re verifying your identity` * `idv2.barCodeDetection.processingTitle` = `Hold on a sec...` * `idv2.capture.processing.verifying` = `Verifying...` * `idv2.digitalIdUpload.continue` = `Continue` * `idv2.digitalIdUpload.errorScreen.pleaseTryScanning` = ` Please try scanning a different document` * `idv2.digitalIdUpload.errorScreen.thisIdMustBeScanned` = `This ID must be scanned` * `idv2.digitalIdUpload.reviewScreen.continue` = `Continue` * `idv2.digitalIdUpload.successfullyProcessed` = `Successfully processed!` * `onboarding.errors.invalidQRuuid.message` = `It looks like your URL is not valid or expired` * `onboarding.errors.invalidQRuuid.title` = `Your URL is invalid` * `otp.enterCodeSMS` = `Enter the code we’ve sent via SMS` * `phone.verify` = `Verify your phone number` * `redirect.resendCountdown` = `Resend link in {{time}}s` * `verification.failureTitle` = `Something went wrong` * `verification.labels.addressDetailsSection` = `Address Details` * `verification.labels.dlDetailsSection` = `Driver's License Details` * `verification.placeholder.email` = `email@example.com` * `verification.placeholder.firstName` = `Your first name` * `verification.placeholder.lastName` = `Your last name` * `verification.placeholder.maternalSurname` = `Your maternal surname` * `verification.placeholder.middleName` = `Your middle name` * `verification.placeholder.stateCode` = `e.g. {{states}}` * `verification.placeholder.surname` = `Your surname` * `verification.submitButton` = `Continue` * `verification.successTitle` = `eKYC verified!` * `verification.tryAgain` = `Try again` ## ✏️ Modified * `idv2.chooser.chooseHowToVerifyTitle`: * Old: `Choose how to verify` * New: `Select how to verify` * `idv2.digitalIdUpload.reviewScreen.title`: * Old: `Review your document` * New: `Review document` * `idv2.digitalIdUpload.screenDescription`: * Old: `A government-issued PDF file or photo with your details, picture and a QR code` * New: `A government-issued PDF file with your details, picture and a QR code` * `idv2.digitalIdUpload.screenTitle`: * Old: `Upload your digital ID` * New: `Upload Digital ID` * `otp.resendCountdown`: * Old: `Resend code in {{time}}s` * New: `Resend code in {{time}}s` * `verification.labels.state`: * Old: `State Code (e.g. {{states}})` * New: `State Code` --- - Path: `release-notes/en-english-7` - URL: https://developer.incode.com/release-notes/en-english-7/ - Markdown: https://developer.incode.com/release-notes/en-english-7.md # EN - English ## 🆕 Added * `commonIssues.blurPresent` = `Blur present` * `commonIssues.blurPresentDescription` = `Move ID further away or closer to your phone until the image is focused` * `commonIssues.glarePresent` = `Glare present` * `commonIssues.glarePresentDescription` = `Tilt the ID slightly up or down to minimize the reflection` * `commonIssues.notReadable` = `Info is not readable` * `commonIssues.notReadableDescription` = `Minimize camera shake by holding your phone steady` * `encryptionLabel.encryptedPhotos` = `All data is encrypted` * `home.goToSettings` = `Go to settings` * `idv2.backTutorial.disclaimer` = `The capture will happen automatically` * `idv2.backTutorial.subtitle` = `Ensure your ID is readable` * `idv2.backTutorial.title` = `Show the back of your ID` * `idv2.capture.allDataIsEncrypted` = `All data is encrypted` * `idv2.permissions.allowV2` = `Allow` * `idv2.permissions.subtitleV2` = `This lets the camera perform the capture required for verification` * `idv2.reverseFlipAnimation.title` = `Show the front of your ID` * `notifications.faceOccluded` = `Face covered` * `notifications.faceOccludedDescription` = `Make sure your face is clear and visible` * `selfiev2.manualCapture.captureButton` = `Take photo` ## ✏️ Modified * `commonIssues.takeManually`: * Old: `Take photo manually` * New: `Take the photo manually` * `face.tutorial.subtitle`: * Old: `This allows you to sign in using your face.` * New: `Keep a neutral expression, find balanced light and remove any glasses and hats` * `idv2.capture.autoCapture`: * Old: `The photo will be taken automatically` * New: `The capture will happen automatically` * `idv2.capture.fillFrameBack`: * Old: `Fill the frame with your back ID` * New: `Frame the back of your ID` * `idv2.capture.fillFrameFront`: * Old: `Fill the frame with your ID` * New: `Frame the front of your ID` * `idv2.permissions.allowPermissionsV2`: * Old: `Allow camera permissions` * New: `Allow camera access` * `idv2.permissions.dontAllow`: * Old: `Don't Allow` * New: `Don't allow` * `idv2.permissions.learnMorePage.instructions.1`: * Old: `We only use the camera to capture your ID for secure verification` * New: `We only use the camera for the verification process.` * `idv2.permissions.learnMorePage.instructions.2`: * Old: `It helps verify document authenticity and prevent identity fraud` * New: `The verification process makes sure you are who you say you are.` * `idv2.tutorial.autoCapture`: * Old: `The photo will be taken automatically` * New: `The capture will happen automatically` * `idv2.tutorial.title`: * Old: `Scan your ID` * New: `Show the front of your ID` * `notifications.selfieCaptureFailedDescription`: * Old: `Your selfie will be manually reviewed later` * New: `Maximum number of attempts reached` * `notifications.spoofDescriptionNoTries`: * Old: `Your selfie will be manually reviewed later` * New: `Maximum number of attempts reached` --- - Path: `release-notes/en-english-8` - URL: https://developer.incode.com/release-notes/en-english-8/ - Markdown: https://developer.incode.com/release-notes/en-english-8.md # EN - English ## 🆕 Added * `ekyb.addressDetails` = `Address Details` * `ekyb.continue` = `Continue` * `ekyb.error.title` = `Something went wrong` * `ekyb.processing` = `Processing` * `ekyb.success` = `Success` * `ekyb.tryAgain` = `Try again` * `idv2.capture.manualCapture.modeSwitchAriaAnnouncement` = `Now using manual capture mode. Press the button to capture photo.` * `idv2.capture.v2.autoCapture` = `The photo will be taken automatically` * `idv2.capture.v2.fillFrameBack` = `Fill the frame with your back ID` * `idv2.capture.v2.fillFrameFront` = `Fill the frame with your ID` * `idv2.tutorial.v2.autocapture` = `The photo will be taken automatically` * `idv2.tutorial.v2.title` = `Scan your ID` * `otp.groupLabel` = `{{charLength}}-digit verification code` * `v2.capture.label` = `All photos are encrypted` * `v2.idError.attemptsLeft_one` = `{{count}} attempt remaining` * `v2.idError.attemptsLeft_other` = `{{count}} attempt remaining` * `v2.idSuccess.subtitle` = `Now let's capture the back` * `v2.idSuccess.subtitleBack` = `Let's continue` * `v2.idSuccess.title` = `Successfully processed!` * `v2.selfie.camera.loading` = `Loading...` ## ✏️ Modified * `ekyb.title`: * Old: `eKYB verification` * New: `eKYB Verification` --- - Path: `release-notes/en-english-9` - URL: https://developer.incode.com/release-notes/en-english-9/ - Markdown: https://developer.incode.com/release-notes/en-english-9.md # EN - English ## 🆕 Added * `biometricConsent.subtitle` = `Your verification is powered by Incode. To comply with state regulations, we need your consent for biometric processing.` * `documentCapture.camera.subtitle` = `Make sure it's fully visible and press the button` * `documentCapture.camera.title` = `Show your full document` * `documentCapture.commonIssues.dirtyPresent` = `Camera lens is dirty` * `documentCapture.commonIssues.dirtyPresentDescription` = `Clean your camera lens for a sharper image.` * `documentCapture.commonIssues.farPresent` = `Document is too far or out of frame` * `documentCapture.commonIssues.farPresentDescription` = `Make sure all edges are visible on screen.` * `documentCapture.commonIssues.foldedIdPresent` = `Document is folded` * `documentCapture.commonIssues.foldedIdPresentDescription` = `Flatten your document and make sure it’s fully open and straight.` * `documentCapture.commonIssues.shadowPresent` = `Shadows on the document` * `documentCapture.commonIssues.shadowPresentDescription` = `Move to a brighter area and avoid casting shadows over your document.` * `documentCapture.errors.fileSizeExceed` = `File exceeds maximum size of {{maxSize}}` * `documentCapture.review.analyzing` = `Analyzing...` * `documentCapture.review.continue` = `Continue` * `documentCapture.review.error.description` = `Make sure all the information on the document is clear and legible.` * `documentCapture.review.error.title` = `Unable to process` * `documentCapture.review.errorTitle` = `Something went wrong` * `documentCapture.review.errorUpload` = `An error occurred when processing your document.` * `documentCapture.review.replace` = `Replace` * `documentCapture.review.retake` = `Retake` * `documentCapture.review.subtitleCaptured` = `Make sure that entire document fits the view, and that the text is readable.` * `documentCapture.review.subtitleImageUpload` = `Make sure that entire document fits the view, and that the text is readable.` * `documentCapture.review.subtitlePdfUpload` = `Make sure you’ve selected the correct file before you continue verification process.` * `documentCapture.review.successTitle` = `Successfully processed!` * `documentCapture.review.titleCaptured` = `Review your document` * `documentCapture.review.titleImageUpload` = `Review your selected photo` * `documentCapture.review.titlePdfUpload` = `Review your document` * `documentCapture.review.tryAgain` = `Try again` * `documentCapture.review.uploading` = `Uploading...` * `documentCapture.tutorial.captureButton` = `Capture document` * `documentCapture.tutorial.chooseFile` = `Choose from device` * `documentCapture.tutorial.multiPageDocument.subtitle` = `Take a photo of the next page to continue.` * `documentCapture.tutorial.multiPageDocument.title` = `Next document page` * `documentCapture.tutorial.skipButton` = `Skip this step` * `documentCapture.tutorial.subtitle` = `Take a photo or upload a PDF, JPG or PNG` * `documentCapture.tutorial.takePhoto` = `Take photo` * `documentCapture.tutorial.title` = `Verify your document` * `documentCapture.tutorial.uploadButton` = `Upload document` * `documentCapture.tutorial.uploadDocument` = `Upload document` * `ekyb.error.USTaxId` = `Invalid Tax ID. Tax ID should be 9 digits.` * `idv2.ageVerificationPage.step1of3` = `Step 1 of 3: ` * `idv2.ageVerificationPage.step2of3` = `Step 2 of 3: ` * `idv2.ageVerificationPage.step3of3` = `Step 3 of 3: ` * `idv2.chooser.digitalIdButtonTitle` = `Digital Id` * `idv2.chooser.loadingDigitalWallet` = `Loading digital wallet...` * `idv2.flipAnimation.titleToFront` = `Show the front of your ID` * `idv2.permissions.allowEveryTime` = `Allow every time` * `idv2.permissions.allowOnlyWhileUsingTheApp` = `Allow only while using the app` * `idv2.permissions.denied.onDevice` = `on device` * `idv2.permissions.denied.opera.appsOpera` = `Apps Opera` * `idv2.permissions.denied.permissionsCamera` = `Persmissions Camera` * `idv2.permissions.denied.persmissionsCamera` = `Persmissions Camera` * `idv2.permissions.denied.settingsApp` = `Settings app` * `idv2.permissions.denied.setTo` = `Set to` * `idv2.permissions.denied.sitePermissions` = `Site permissions` * `idv2.permissions.denied.sitesAndDownloads` = `Sites and downloads` * `idv2.tutorial.subtitleBack` = `Ensure your ID is readable` * `idv2.tutorial.v2.titleBack` = `Show the back of your ID` * `manualIdUpload.frontRequiredFirst` = `Please upload front of ID first` * `manualIdUpload.uploadBackId` = `Upload back of ID` * `manualIdUpload.uploadFrontId` = `Upload front of ID` * `manualIdUpload.uploadPassport` = `Upload passport` * `notifications.noTries` = `Maximum number of attempts reached` * `selfiev2.autoCapture.defaultAriaInstructions` = `Center your face in the frame.` * `selfiev2.capture.title` = `Face Capture` * `verification.errors.ARPostalCodeInvalidFormat` = `Please enter a valid Argentina Postal Code (format: A1111AAA)` * `verification.errors.CAPostalCodeInvalidFormat` = `Please enter a valid Canadian postal code (format: A1A 1A1).` * `verification.errors.ESPostalCodeInvalidFormat` = `Please enter a 5 digit Postal Code` * `verification.errors.UKPostalCodeInvalidFormat` = `Please enter a valid UK Postal Code.` * `verification.noFormFields` = `No fields were configured for this form.` * `watchlistBusiness.businessName` = `Business Name` * `watchlistBusiness.businessNameRequired` = `Business Name field is required` * `watchlistBusiness.continue` = `Continue` * `watchlistBusiness.watchlistForBusiness` = `Watchlist for Business` ## ✏️ Modified * `idv2.permissions.denied.cameraAllow`: * Old: `Tap Camera Allow` * New: `Camera Allow` * `idv2.permissions.learnMorePage.instructions.1`: * Old: `We only use the camera for the verification process.` * New: `We only use the camera to capture your ID for secure verification` * `idv2.permissions.learnMorePage.instructions.2`: * Old: `The verification process makes sure you are who you say you are.` * New: `It helps verify document authenticity and prevent identity fraud` * `idv2.permissions.subtitleV2`: * Old: `This lets the camera perform the capture required for verification` * New: `This lets you take a photo of your ID and face for verification purposes.` * `otp.errorv2`: * Old: `Code expired, please try again` * New: `Something went wrong` --- - Path: `release-notes/es-es-spanish-spain` - URL: https://developer.incode.com/release-notes/es-es-spanish-spain/ - Markdown: https://developer.incode.com/release-notes/es-es-spanish-spain.md # ES-ES - Spanish (Spain) ## 🆕 Added * `capturePreview.acceptedDocuments.BirthCertificate` = `Partida de nacimiento` * `capturePreview.acceptedDocuments.country` = `{{country}}` * `capturePreview.acceptedDocuments.Currency` = `Moneda` * `capturePreview.acceptedDocuments.DriversLicense` = `Permiso de conducir` * `capturePreview.acceptedDocuments.FederalID` = `Identificación federal` * `capturePreview.acceptedDocuments.IdentificationCard` = `Tarjeta de identificación` * `capturePreview.acceptedDocuments.label` = `Documentos aceptados para:` * `capturePreview.acceptedDocuments.MedicalCard` = `Tarjeta sanitaria` * `capturePreview.acceptedDocuments.Military` = `Militar` * `capturePreview.acceptedDocuments.noDocuments` = `No se aceptan documentos para este país. ` * `capturePreview.acceptedDocuments.Other` = `Otros` * `capturePreview.acceptedDocuments.Passport` = `Pasaporte` * `capturePreview.acceptedDocuments.Permit` = `Permiso` * `capturePreview.acceptedDocuments.ResidenceDocument` = `Documento de residencia` * `capturePreview.acceptedDocuments.TaxIdentification` = `Identificación fiscal` * `capturePreview.acceptedDocuments.TravelDocument` = `Documento de viaje` * `capturePreview.acceptedDocuments.TribalIdentification` = `Identificación tribal` * `capturePreview.acceptedDocuments.Unknown` = `Desconocido` * `capturePreview.acceptedDocuments.VehicleRegistration` = `Matriculación de vehículos` * `capturePreview.acceptedDocuments.Visa` = `Visa` * `capturePreview.acceptedDocuments.VoterIdentification` = `Identificación de los votantes` * `capturePreview.acceptedDocuments.WeaponLicense` = `Licencia de armas` * `common.refreshPage` = `Actualizar` * `commonIssues.idv2.tryAgain` = `Bien, inténtalo de nuevo.` * `errors.dynamicImport.failedToLoad` = `Un error algo inesperado pero del que tomamos nota:` * `errors.dynamicImport.suggestion` = `Lo intentaremos de nuevo en {{count}} o puedes actualizar manualmente` * `errors.dynamicImport.title` = `Lo sentimos, hemos encontrado un problema` * `idv2.capture.autoCapture` = `La foto se tomará automáticamente` * `idv2.capture.dontMove` = `No muevas tu ID durante unos segundos` * `idv2.capture.fillFrame` = `Rellena el marco con tu DNI` * `idv2.capture.fillFramePassport` = `Rellena el marco con tu pasaporte` * `idv2.capture.manualCapture.ariaLabel` = `Captura manual` * `idv2.capture.manualCapture.title` = `Botón de captura manual` * `idv2.capture.notifications.blur.description` = `Acercar o alejar la imagen, o pulsar sobre el ID` * `idv2.capture.notifications.blur.title` = `Identificación demasiado borrosa` * `idv2.capture.notifications.glare.description` = `Busca una mejor iluminación para evitar reflejos` * `idv2.capture.notifications.glare.title` = `Identificación con deslumbramiento` * `idv2.capture.notifications.notAligned.description` = `Centra tu ID dentro del marco` * `idv2.capture.notifications.notAligned.title` = `El ID no está alineado` * `idv2.capture.notifications.showBack.description` = `Dale la vuelta a tu DNI para mostrar su reverso` * `idv2.capture.notifications.showBack.title` = `Mostrar el reverso del DNI` * `idv2.capture.notifications.showFront.description` = `Dale la vuelta a tu DNI para mostrar su anverso` * `idv2.capture.notifications.showFront.title` = `Mostrar el anverso del DNI` * `idv2.capture.passport.subtitle` = `Asegúrese de que su pasaporte es legible` * `idv2.capture.passport.title` = `Escanee su pasaporte` * `idv2.capture.processing.analyzing` = `Analizar...` * `idv2.capture.processing.attemptsRemaining` = `{{attempts}}/{{maxAttempts}} intentos restantes` * `idv2.capture.processing.continue` = `Continúe en` * `idv2.capture.processing.error` = `Error` * `idv2.capture.processing.errors.classification.subtitle` = `Asegúrese de que toda la identificación sea visible y esté bien iluminada` * `idv2.capture.processing.errors.classification.title` = `Error en la verificación de la identidad` * `idv2.capture.processing.errors.default.subtitle` = `Por favor, inténtelo de nuevo` * `idv2.capture.processing.errors.default.title` = `Hubo un problema` * `idv2.capture.processing.errors.glare.subtitle` = `Inclina el ID ligeramente hacia arriba o hacia abajo para minimizar el reflejo` * `idv2.capture.processing.errors.glare.title` = `Resplandor presente` * `idv2.capture.processing.errors.readability.subtitle` = `Minimiza el movimiento de la cámara sujetando el teléfono con firmeza` * `idv2.capture.processing.errors.readability.title` = `La información no es legible` * `idv2.capture.processing.errors.sharpness.subtitle` = `Aleja o acerca el ID al teléfono hasta que la imagen esté enfocada` * `idv2.capture.processing.errors.sharpness.title` = `Desenfoque presente` * `idv2.capture.processing.errors.unacceptable.subtitle` = `Inténtelo con otro documento` * `idv2.capture.processing.errors.unacceptable.title` = `No se acepta el tipo de identificación` * `idv2.capture.processing.errors.upload.subtitle` = `Compruebe su conexión y vuelva a intentarlo.` * `idv2.capture.processing.errors.upload.title` = `Error en el escaneado de ID` * `idv2.capture.processing.errors.wrongSide.subtitle` = `Captura {{mode}} lado de la identificación` * `idv2.capture.processing.errors.wrongSide.title` = `Lado de identificación incorrecto capturado` * `idv2.capture.processing.scanBack` = `Escanear el reverso` * `idv2.capture.processing.success` = `Éxito` * `idv2.capture.processing.successBackSubtitle` = `Ahora continuemos` * `idv2.capture.processing.successFrontSubtitle` = `Ahora vamos a capturar la parte de atrás` * `idv2.capture.processing.successTitle` = `Procesado con éxito.` * `idv2.capture.processing.tryAgain` = `Inténtalo de nuevo` * `idv2.capture.takingPhoto` = `Hacer fotos...` * `idv2.capture.wrongSide.backHint` = `back-id-hint` * `idv2.capture.wrongSide.frontHint` = `front-id-hint` * `idv2.chooser.idButtonDescription` = `Documento nacional de identidad o permiso de conducir` * `idv2.chooser.idButtonTitle` = `Documento de identidad` * `idv2.chooser.passportButtonDescription` = `Pasaporte de su país` * `idv2.chooser.passportButtonTitle` = `Pasaporte` * `idv2.permissions.alertAlt` = `alerta de permiso falso` * `idv2.permissions.allow` = `OK, Permitir` * `idv2.permissions.denied.allow` = `Permitir` * `idv2.permissions.denied.ask` = `Pregunte a` * `idv2.permissions.denied.browser` = `Navegador` * `idv2.permissions.denied.camera` = `Cámara` * `idv2.permissions.denied.changeTo` = `Cambiar a` * `idv2.permissions.denied.open` = `Abrir` * `idv2.permissions.denied.or` = `o` * `idv2.permissions.denied.refreshPage` = `Actualizar página` * `idv2.permissions.denied.return` = `Vuelva aquí y pulse` * `idv2.permissions.denied.scroll` = `Desplácese hacia abajo para seleccionar` * `idv2.permissions.denied.settings` = `Ajustes` * `idv2.permissions.denied.tap` = `Toque` * `idv2.permissions.denied.title` = `Siga los siguientes pasos para permitir que Incode acceda a su cámara` * `idv2.permissions.denied.yourBrowser` = `su navegador` * `idv2.permissions.description` = `para completar el proceso` * `idv2.permissions.dontAllow` = `No permita` * `idv2.permissions.fakeDenied.alert` = `alerta falsa centrada` * `idv2.permissions.fakeDenied.allowPermissions` = `Permitir permisos` * `idv2.permissions.fakeDenied.quitProcess` = `Abandonar el proceso` * `idv2.permissions.fakeDenied.title` = `Se requiere permiso de cámara para la captura de documentos` * `idv2.permissions.fakeDenied.warning` = `advertencia` * `idv2.permissions.note` = `Nota: Dependiendo de su teléfono, puede decir` * `idv2.permissions.or` = `o` * `idv2.permissions.subtitle` = `permitir permiso de cámara` * `idv2.permissions.title` = `Necesitamos que` * `idv2.permissions.whileUsing` = `Al utilizar la aplicación` * `idv2.tutorial.autoCapture` = `La foto se tomará automáticamente` * `idv2.tutorial.startScan` = `Escaneemos` * `idv2.tutorial.subtitle` = `Asegúrese de que su documento de identidad sea legible` * `idv2.tutorial.title` = `Escanee su DNI` * `idv2.uploading.analyzing` = `Analizar...` * `idv2.uploading.imageAlt` = `Captura de ID` * `onboarding.errors.restartDisabled.message` = `Reinicio de sesión desactivado a nivel de organización` * `onboarding.errors.restartDisabled.title` = `No se puede reiniciar la sesión` * `qes.signatureCheck` = `Acepto la expedición del certificado requerido y la firma electrónica de este documento.` * `qes.termsCheck` = `He leído y acepto la <2>Política de privacidad y las <6>Condiciones de uso de Incode.` ## ✏️ Modified * `commonIssues.infoNotReadable`: * Before: `La información no es legible` * Now: `Información no legible` * `commonIssues.takeManually`: * Before: `Hacer la foto manualmente` * Now: `Haz la foto manualmente` * `commonIssues.tryAgain`: * Before: `Bien, inténtalo de nuevo.` * Now: `Inténtalo de nuevo` * `ineCheck.verified`: * Before: `¡Identidad verificada!` * Now: `Identidad sometida a verificación` * `notifications.done`: * Before: `Hecho` * Now: `Escaneado finalizado` * `notifications.glareDetected`: * Before: `Brillo detectado` * Now: `Deslumbramiento detectado` * `notifications.glareDetectedDescription`: * Before: `Inclina el ID levemente arriba y abajo para minimizar el reflejo` * Now: `Busca una mejor iluminación para evitar reflejos` * `notifications.idTypeUnacceptable`: * Before: `No se acepta el tipo de identificación` * Now: `Documento no válido` * `notifications.idTypeUnacceptableDescription`: * Before: `Por favor intenta con otro documento` * Now: `Intenta escanear otro` * `notifications.lowSharpness`: * Before: `Fuera de foco` * Now: `Baja nitidez` --- - Path: `release-notes/es-es-spanish-spain-1` - URL: https://developer.incode.com/release-notes/es-es-spanish-spain-1/ - Markdown: https://developer.incode.com/release-notes/es-es-spanish-spain-1.md # ES-ES - Spanish (Spain) ## 🆕 Added * `idv2.permissions.fakeDenied.alert` = `alerta falsa centrada` * `idv2.permissions.fakeDenied.allowPermissions` = `Permitir permisos` * `idv2.permissions.fakeDenied.quitProcess` = `Abandonar el proceso` * `idv2.permissions.fakeDenied.title` = `Se requiere permiso de cámara para la captura de documentos` * `idv2.permissions.fakeDenied.warning` = `advertencia` ## ✏️ Modified * `idv2.chooser.idButtonDescription`: * Before: `ID o licencia de conducir` * Now: `Documento nacional de identidad o permiso de conducir` --- - Path: `release-notes/es-es-spanish-spain-10` - URL: https://developer.incode.com/release-notes/es-es-spanish-spain-10/ - Markdown: https://developer.incode.com/release-notes/es-es-spanish-spain-10.md # ES - ES - Spanish (Spain) ## 🆕 Added * `biometricConsent.subtitle` = `Su verificación es impulsada por Incode. Para cumplir la normativa estatal, necesitamos su consentimiento para el procesamiento biométrico.` * `documentCapture.camera.subtitle` = `Asegúrate de que está totalmente visible y pulsa el botón` * `documentCapture.camera.title` = `Muestre su documento completo` * `documentCapture.commonIssues.dirtyPresent` = `El objetivo de la cámara está sucio` * `documentCapture.commonIssues.dirtyPresentDescription` = `Limpia el objetivo de tu cámara para obtener una imagen más nítida.` * `documentCapture.commonIssues.farPresent` = `El documento está demasiado lejos o fuera de cuadro` * `documentCapture.commonIssues.farPresentDescription` = `Asegúrese de que todos los bordes son visibles en la pantalla.` * `documentCapture.commonIssues.foldedIdPresent` = `El documento está plegado` * `documentCapture.commonIssues.foldedIdPresentDescription` = `Aplana el documento y asegúrate de que está completamente abierto y recto.` * `documentCapture.commonIssues.shadowPresent` = `Sombras sobre el documento` * `documentCapture.commonIssues.shadowPresentDescription` = `Desplázate a una zona más luminosa y evita proyectar sombras sobre tu documento.` * `documentCapture.errors.fileSizeExceed` = `El archivo supera el tamaño máximo de {{maxSize}}` * `documentCapture.review.analyzing` = `Analizar...` * `documentCapture.review.continue` = `Continúe en` * `documentCapture.review.error.description` = `Asegúrese de que toda la información del documento es clara y legible.` * `documentCapture.review.error.title` = `No se puede procesar` * `documentCapture.review.errorTitle` = `Algo salió mal` * `documentCapture.review.errorUpload` = `Se ha producido un error al procesar su documento.` * `documentCapture.review.replace` = `Sustituir` * `documentCapture.review.retake` = `Retomar` * `documentCapture.review.subtitleCaptured` = `Asegúrese de que todo el documento se ajusta a la vista y de que el texto es legible.` * `documentCapture.review.subtitleImageUpload` = `Asegúrese de que todo el documento se ajusta a la vista y de que el texto es legible.` * `documentCapture.review.subtitlePdfUpload` = `Asegúrese de haber seleccionado el archivo correcto antes de continuar con el proceso de verificación.` * `documentCapture.review.successTitle` = `Procesado con éxito.` * `documentCapture.review.titleCaptured` = `Revise su documento` * `documentCapture.review.titleImageUpload` = `Revisar la foto seleccionada` * `documentCapture.review.titlePdfUpload` = `Revise su documento` * `documentCapture.review.tryAgain` = `Inténtalo de nuevo` * `documentCapture.review.uploading` = `Cargando...` * `documentCapture.tutorial.captureButton` = `Capturar documento` * `documentCapture.tutorial.chooseFile` = `Elegir dispositivo` * `documentCapture.tutorial.multiPageDocument.subtitle` = `Haz una foto de la página siguiente para continuar.` * `documentCapture.tutorial.multiPageDocument.title` = `Página siguiente` * `documentCapture.tutorial.skipButton` = `Omitir este paso` * `documentCapture.tutorial.subtitle` = `Haz una foto o sube un PDF, JPG o PNG` * `documentCapture.tutorial.takePhoto` = `Tomar foto` * `documentCapture.tutorial.title` = `Verifique su documento` * `documentCapture.tutorial.uploadButton` = `Cargar documento` * `documentCapture.tutorial.uploadDocument` = `Cargar documento` * `ekyb.error.USTaxId` = `NIF no válido. El NIF debe tener 9 dígitos.` * `idv2.ageVerificationPage.step1of3` = `Paso 1 de 3: ` * `idv2.ageVerificationPage.step2of3` = `Paso 2 de 3: ` * `idv2.ageVerificationPage.step3of3` = `Paso 3 de 3: ` * `idv2.chooser.digitalIdButtonTitle` = `Identificación digital` * `idv2.chooser.loadingDigitalWallet` = `Cargando monedero digital...` * `idv2.flipAnimation.titleToFront` = `Muestre el anverso de su documento de identidad` * `idv2.permissions.allowEveryTime` = `Permitir siempre` * `idv2.permissions.allowOnlyWhileUsingTheApp` = `Permitir sólo mientras se utiliza la aplicación` * `idv2.permissions.denied.onDevice` = `en el dispositivo` * `idv2.permissions.denied.opera.appsOpera` = `Aplicaciones Opera` * `idv2.permissions.denied.permissionsCamera` = `Persmisiones Cámara` * `idv2.permissions.denied.persmissionsCamera` = `Persmisiones Cámara` * `idv2.permissions.denied.settingsApp` = `Aplicación Ajustes` * `idv2.permissions.denied.setTo` = `Ajustar a` * `idv2.permissions.denied.sitePermissions` = `Autorizaciones` * `idv2.permissions.denied.sitesAndDownloads` = `Sitios y descargas` * `idv2.tutorial.subtitleBack` = `Asegúrese de que su documento de identidad sea legible` * `idv2.tutorial.v2.titleBack` = `Muestre el reverso de su documento de identidad` * `manualIdUpload.frontRequiredFirst` = `Cargue primero el anverso del documento de identidad` * `manualIdUpload.uploadBackId` = `Cargar el reverso del DNI` * `manualIdUpload.uploadFrontId` = `Cargar anverso del DNI` * `manualIdUpload.uploadPassport` = `Cargar pasaporte` * `notifications.noTries` = `Número máximo de intentos alcanzado` * `selfiev2.autoCapture.defaultAriaInstructions` = `Centra tu cara en el encuadre.` * `selfiev2.capture.title` = `Captura facial` * `verification.errors.ARPostalCodeInvalidFormat` = `Introduzca un código postal argentino válido (formato: A1111AAA)` * `verification.errors.CAPostalCodeInvalidFormat` = `Introduzca un código postal canadiense válido (formato: A1A 1A1).` * `verification.errors.ESPostalCodeInvalidFormat` = `Introduzca un código postal de 5 dígitos` * `verification.errors.UKPostalCodeInvalidFormat` = `Introduzca un código postal válido del Reino Unido.` * `verification.noFormFields` = `No se ha configurado ningún campo para este formulario.` * `watchlistBusiness.businessName` = `Nombre comercial` * `watchlistBusiness.businessNameRequired` = `El campo Nombre de la empresa es obligatorio` * `watchlistBusiness.continue` = `Continúe en` * `watchlistBusiness.watchlistForBusiness` = `Lista de vigilancia para empresas` ## ✏️ Modified * `ekyb.continue`: * Old: `Continúe en` * New: `Continuar` * `faceMatch.continue`: * Old: `Continúe en` * New: `Continuar` * `idv2.ageVerificationPage.Continue`: * Old: `Continúe en` * New: `Continuar` * `idv2.capture.processing.continue`: * Old: `Continúe en` * New: `Continuar` * `idv2.digitalIdUpload.reviewScreen.replaceFileButton`: * Old: `Continúe en` * New: `Continuar` * `idv2.permissions.denied.cameraAllow`: * Old: `Pulse Cámara Permitir` * New: `Cámara Permitir` * `idv2.permissions.learnMorePage.instructions.1`: * Old: `Sólo utilizamos la cámara para el proceso de verificación.` * New: `Sólo utilizamos la cámara para capturar su identificación para la verificación segura` * `idv2.permissions.learnMorePage.instructions.2`: * Old: `El proceso de verificación garantiza que usted es quien dice ser.` * New: `Ayuda a verificar la autenticidad de los documentos y a prevenir el fraude de identidad.` * `idv2.permissions.subtitleV2`: * Old: `Esto permite a la cámara realizar la captura necesaria para la verificación` * New: `Te permite hacer una foto de tu DNI y de tu cara con fines de verificación.` * `matchUser.continue`: * Old: `CONTINÚE` * New: `Continuar` * `otp.errorv2`: * Old: `Código caducado, inténtelo de nuevo` * New: `Algo salió mal` * `verification.submitButton`: * Old: `Continúe en` * New: `Continuar` --- - Path: `release-notes/es-es-spanish-spain-11` - URL: https://developer.incode.com/release-notes/es-es-spanish-spain-11/ - Markdown: https://developer.incode.com/release-notes/es-es-spanish-spain-11.md # ES - ES - Spanish (Spain) ## 🆕 Added * `aes.confirmSignature.finishSigning` = `Terminar de firmar` * `aes.reviewDocument.subtitle` = `Asegúrate de que has seleccionado el archivo correcto antes de seguir firmando.` * `aes.reviewDocument.title` = `Revise su documento` * `biometricConsent. consentOptions` = `Opciones de consentimiento` * `common.done` = `¡Hecho!` * `common.wontTakeLong` = `Esto no llevará mucho tiempo.` * `curp.verifyManually` = `Verificar manualmente` * `customFields.completed` = `¡Terminado!` * `customFields.continue` = `Continúe en` * `customFields.processing` = `Procesando...` * `customFields.title` = `Introduzca sus datos` * `customWatchlist.done` = `¡Hecho!` * `customWatchlist.wontTake` = `Esto no llevará mucho tiempo.` * `digilocker.denied.tryAgain` = `Inténtalo de nuevo` * `documentCapture.button.allPagesCaptured` = `Todas las páginas capturadas` * `documentCapture.button.nextPage` = `Página siguiente` * `documentCapture.tutorial.continue` = `Continúe en` * `documentCapture.tutorial.multiPageDocument.optionalPage.subtitle` = `Si hay otra página con información relevante, puede capturarla ahora.` * `ekyb.addAnotherDirector` = `Añadir otro Director (Opcional)` * `ekyb.directorNameWithNumber` = `Director {{number}} Nombre` * `ekyb.directorSurnameWithNumber` = `Director {{number}} Apellidos` * `ekyb.error.taxId-cn` = `Introduzca un código de crédito social unificado chino válido (18 caracteres alfanuméricos)` * `ekyb.error.taxId-de` = `Introduzca un número de identificación fiscal alemán válido: IVA (DE + 9 dígitos), HRB (3-6 dígitos), HRB (6 dígitos + letra) o HRA (4-6 dígitos).` * `ekyb.error.taxId-es` = `Introduzca un NIF español válido: NIF (letra + 8 dígitos), NIE (letra + 7 dígitos + letra), o DNI (8 dígitos + letra)` * `ekyb.error.taxId-gb` = `Introduzca un número de identificación fiscal válido en el Reino Unido: Número de registro (7-8 dígitos) o Número de IVA (GB seguido de 9 dígitos, o 9 dígitos solos).` * `ekyb.error.taxId-il` = `Introduzca un Mispar Osek israelí válido (9 dígitos)` * `ekyb.error.taxId-it` = `Introduzca un número de identificación fiscal italiano válido: CCIAA/NREA (2 letras + 6-7 dígitos), identificación de la empresa (IT + 8 dígitos) o código fiscal/IVA (11 dígitos).` * `ekyb.error.taxId-mx` = `Introduzca un RFC mexicano válido: Individual (4 letras + 6 dígitos + 3 alfanuméricos) o Empresarial (3 letras + 6 dígitos + 3 alfanuméricos).` * `ekyb.error.taxId-ng` = `Introduzca un NIF nigeriano válido (10 dígitos)` * `ekyb.error.taxId-nl` = `Introduzca un número de identificación fiscal holandés válido: Número de IVA (NL + 9 dígitos + B + 2 dígitos) o número KvK (8 dígitos)` * `email.placeholder` = `Correo electrónico` * `forms.placeholder.select` = `Seleccione una opción` * `identityReuse.cta.continue` = `Continuar con la verificación rápida` * `identityReuse.cta.verify` = `Verificar con el DNI` * `identityReuse.description` = `Sólo transferiremos los datos solicitados por {{companyName}} para completar su verificación` * `identityReuse.subtitle` = `Se ha verificado previamente con uno de nuestros socios. Comparte tus datos para ahorrar tiempo y verificar más rápido.` * `identityReuse.title` = `Comparte tus datos para una verificación más rápida` * `idOcr.title` = `Compruebe sus datos` * `idv2.capture.expiredId.idScanFailed` = `Error en el escaneado de ID` * `idv2.capture.expiredId.pleaseTryWithADifferentId` = `Inténtelo con otro documento` * `idv2.capture.notifications.idScanFailed` = `Error en el escaneado de ID` * `idv2.capture.processing.attemptsRemainingLabel` = `intentos restantes` * `idv2.capture.processing.noAttemptsRemaining` = `No quedan intentos` * `idv2.chooser.appleWallet` = `Cartera Apple` * `idv2.chooser.deviceWalletTag` = `Instantáneo` * `idv2.chooser.googleWallet` = `Google Wallet` * `idv2.digilocker.consentDeniedDescription` = `No se ha proporcionado el consentimiento para compartir documentos a través de DigiLocker. Puede volver a intentarlo o elegir otra forma de verificación.` * `idv2.digilocker.consentDeniedTitle` = `Consentimiento denegado` * `idv2.digilocker.openingDigilockerForAuthentication` = `Abrir DigiLocker para la autenticación..` * `idv2.digilocker.sessionErrorDescription` = `No se ha podido restaurar la sesión. Por favor, reinicie el proceso de verificación.` * `idv2.digilocker.sessionErrorTitle` = `Error de sesión` * `idv2.digilocker.takingYouToDigilocker` = `Llevándote a DigiLocker..` * `idv2.digilocker.timeoutDescription` = `La solicitud de DigiLocker no se ha completado en el tiempo previsto. Vuelva a intentarlo o seleccione un método de verificación alternativo.` * `idv2.digilocker.timeoutTitle` = `La sesión ha terminado..` * `idv2.digilocker.verificationCompleteTitle` = `Identidad verificada correctamente` * `idv2.digitalIdUpload.fileTooLargeScreen.cta` = `Elija otro archivo` * `idv2.digitalIdUpload.fileTooLargeScreen.subtitle` = `El archivo seleccionado pesa más de 5 MB, cargue uno más pequeño` * `idv2.digitalIdUpload.fileTooLargeScreen.title` = `El archivo es demasiado grande` * `idv2.permissions.denied.cameraFindSiteAllow` = `Cámara Buscar sitio Permitir` * `loadingCircle.preparingCamera` = `Preparar la cámara` * `manualIdUpload.generic` = `Por favor, cargue el documento correcto` * `manualIdUpload.glareDetected` = ` Resplandor presente` * `manualIdUpload.hintIdReadable` = `Asegúrese de que el texto de la identificación sea legible.` * `manualIdUpload.hintPassportReadable` = `Asegúrese de que el texto del pasaporte es legible.` * `manualIdUpload.hintSharpAndGlareFree` = `La foto debe ser nítida y sin reflejos.` * `manualIdUpload.lowSharpness` = `Desenfoque presente` * `manualIdUpload.qualityRejected` = `La calidad de la imagen es demasiado baja.` * `manualIdUpload.readabilityIssue` = `La información no es legible` * `manualIdUpload.subtitle` = `Asegúrese de que su documento de identidad sea legible` * `manualIdUpload.uploadingSubtitle` = `Cargar el archivo` * `manualIdUpload.uploadingTitle` = `Espera un segundo...` * `manualIdUpload.wrongDocument` = `Por favor, cargue el documento correcto` * `onboarding.errors.onboardingUrlAlreadyUsed.message` = `Parece que esta URL ya está en uso` * `onboarding.errors.onboardingUrlAlreadyUsed.title` = `Su URL no es válida` * `otp.resendCodeAvailable` = `Ahora puede volver a enviar el código` * `otp.timerFiveSeconds` = `Quedan 5 segundos` * `otp.timerStarted` = `Puede solicitar un nuevo código en {{ time }} segundos` * `otp.timerTenSeconds` = `Quedan 10 segundos para solicitar un nuevo código` * `otp.verificationCode` = `Código de verificación` * `phone.invalidPhone` = `Número de teléfono no válido. Inténtelo de nuevo.` * `phone.optIn` = `Acepto recibir notificaciones por SMS` * `phone.serverError` = `Algo ha ido mal. Vuelva a intentarlo más tarde.` * `qes.documentsReviewedCheck` = `Confirmo que he revisado los documentos a firmar enumerados anteriormente antes de firmar.` * `qes.issuanceCheck` = `Acepto que Incode Czech Republic s.r.o. emita un Certificado reconocido para firmas electrónicas en calidad de Proveedor de Servicios de Confianza Reconocido (QTSP).` * `qes.newTermsCheck` = `He leído, comprendo y acepto las <2>Condiciones de uso y la <6>Política de privacidad aplicables a la emisión y uso de este certificado.` * `qes.qesAcknowledgementCheck` = `Reconozco que este proceso dará lugar a una Firma Electrónica Cualificada (FEC), que tiene el mismo efecto legal que una firma manuscrita en virtud de la legislación de la UE (eIDAS, Reglamento (UE) 910/2014).` * `qes.qscdConfirmationCheck` = `Confirmo que la firma se ha creado utilizando un Dispositivo Cualificado de Creación de Firma (QSCD) y que mantengo el control exclusivo sobre el proceso de firma.` * `redirect.didntReceiveLinkActions` = `¿No has recibido el enlace? Reenviar o Cambiar número de teléfono` * `redirect.linkResent` = `Enlace reenviado correctamente` * `redirect.linkSentTo` = `Para : {{phone}}` * `signature.fullSignaturePlaceholder` = `Firme aquí` * `signature.fullSignatureTitle` = `Dibuja tu firma` * `signature.initialsPlaceholder` = `Dibuje aquí sus iniciales` * `signature.initialsTitle` = `Escriba sus iniciales` * `signature.subtitle` = `Utiliza el dedo o el ratón` * `signature.successTitle` = `Firmado con éxito.` * `userData.cpf` = `CPF` * `v2.redirectToMobile.continueOnDesktop` = `Continuar en el escritorio` * `v2.redirectToMobile.qr.description` = `Escanee el código QR para verificarlo en su dispositivo móvil.` * `v2.redirectToMobile.sms.description` = `Introduzca su número de teléfono para recibir un enlace para verificar a través de SMS` * `v2.redirectToMobile.sms.sendSms` = `Enviar enlace por SMS` * `v2.redirectToMobile.subtitle` = `Necesitarás un documento de identidad válido y un selfie.` * `v2.redirectToMobile.tabs.0` = `Escanear QR` * `v2.redirectToMobile.tabs.1` = `Enviar SMS` * `v2.redirectToMobile.title` = `Verifique su identidad` * `v2.settings.language` = `Idioma` * `validation.invalidDate` = `Fecha no válida` * `verification.errors.countryNotSupported` = `Solicitud rechazada. País no admitido para EKYC.` * `verification.errors.exactly10Characters` = `Debe tener exactamente 10 caracteres` * `verification.errors.fieldRequiredDynamic` = `{{fieldName}} es necesario` * `verification.errors.idNumRequired` = `Número de identificación nacional obligatorio` * `verification.errors.invalidPostalCodeFixedLength` = `Introduzca un código postal de {{length}} dígitos` * `verification.errors.onlyLettersAndNumbers` = `Sólo se permiten letras y números` * `verification.errors.taxIdRequired` = `Se requiere NIF` * `verification.labels.panNumber` = `Número PAN` * `watchlistForBusiness.title` = `Lista de vigilancia para empresas` ## ✏️ Modified * `aes.confirmSignature.addDocument`: * Old: `Añadir documento` * New: `Cargar documento` * `aes.confirmSignature.fail`: * Old: `Algo salió mal..` * New: `Algo salió mal` * `aes.confirmSignature.subtitle`: * Old: `Se firmarán los siguientes documentos` * New: `Acepte las condiciones que figuran a continuación para completar su firma.` * `aes.confirmSignature.terms1.title`: * Old: `Acepto las condiciones del Centro de Confianza` * New: `Acepto las condiciones del <2>Centro de Confianza` * `aes.confirmSignature.title`: * Old: `Confirme su firma` * New: `Aceptar y firmar` * `aes.confirmSignature.uploadDescription`: * Old: `Formato PDF compatible` * New: `Admite archivos PDF` * `aes.confirmSignature.viewDocument`: * Old: `Ver documento` * New: `Ver` * `documentCapture.review.error.description`: * Old: `Asegúrese de que toda la información del documento es clara y legible.` * New: `Algunas páginas no estaban claras o estaban incompletas. Recupere todas las páginas del documento para continuar.` * `documentCapture.review.error.title`: * Old: `No se puede procesar` * New: `Es necesario recuperar el documento` * `documentCapture.review.tryAgain`: * Old: `Inténtalo de nuevo` * New: `Documento de recaptura` * `manualCapture.ariaLabel`: * Old: `botón de captura manual` * New: `capturar foto` * `manualIdUpload.uploadPassport`: * Old: `Cargar pasaporte` * New: `Pasaporte` * `userData.sex`: * Old: `Sexo` * New: `Género` * `v2.idError.attemptsLeft_other`: * Old: `{{count}} intento restante` * New: `{{count}} intentos restantes` * `verification.errors.surNameRequired`: * Old: `Apellidos obligatorios` * New: `Apellido obligatorio` --- - Path: `release-notes/es-es-spanish-spain-2` - URL: https://developer.incode.com/release-notes/es-es-spanish-spain-2/ - Markdown: https://developer.incode.com/release-notes/es-es-spanish-spain-2.md # ES-ES - Spanish (Spain) ## 🆕 Added * `documentCapture.multiPageDocument.step1.description` = `Asegúrese de que todo el documento está en el marco` * `documentCapture.multiPageDocument.step1.title` = `Preparar la primera página` * `documentCapture.multiPageDocument.step2.description` = `Asegúrese de que todo el documento está en el marco` * `documentCapture.multiPageDocument.step2.title` = `Preparar la segunda página` * `face.tutorial.startCapture` = `Hazte un selfie` * `face.tutorial.subtitle` = `Esto te permite iniciar sesión utilizando tu cara.` * `face.tutorial.title` = `Hazte un selfie` * `idv2.flipAnimation.title` = `Muestre el reverso de su documento de identidad` --- - Path: `release-notes/es-es-spanish-spain-3` - URL: https://developer.incode.com/release-notes/es-es-spanish-spain-3/ - Markdown: https://developer.incode.com/release-notes/es-es-spanish-spain-3.md # ES-ES - Spanish (Spain) ## 🆕 Added * `common.attemptsRemaining_other` = `{{count}} intentos restantes` * `common.attemptsRemaining_one` = `1 intento restante` * `idv2.capture.processing.errors.wrongSide.back.subtitle` = `Captura del reverso del DNI` * `idv2.capture.processing.errors.wrongSide.front.subtitle` = `Captura de la cara frontal del DNI` * `idv2.needHelp.open` = `Abrir el modal Necesita ayuda` * `notifications.centerFaceV2` = `Asegúrate de alinear la cara dentro de la silueta` * `notifications.cropDescription` = `Por favor, inténtelo de nuevo con su cara centrada en el marco` * `notifications.multipleDescription` = `Asegúrate de que sólo se ve una cara en el encuadre` * `notifications.onFaceAngleV2` = `Alinear la cara dentro de la silueta blanca` * `notifications.portraitDescription` = `Mantén el dispositivo en modo vertical` * `notifications.selfie.manualCaptureButtonLabel` = `Botón de captura manual` * `notifications.selfie.manualCaptureLabel` = `Captura manual activada. Pulse el botón para hacer la foto.` * `notifications.unableToCropDescription` = `Por favor, inténtelo de nuevo con su cara claramente visible` * `retake.titleFrontLabel` = `Revisar la foto de carné delantera` * `selfiev2.manualCapture.instructions` = `Centra tu cara en la silueta y pulsa el botón para capturar` * `tutorial.back.titleLabel` = `Ahora escanea el reverso de tu DNI` * `webviews.step1` = `Ve a "Ajustes" → "Aplicaciones".` * `webviews.step2` = `Buscar la aplicación` * `webviews.step3` = `Permitir cámara` --- - Path: `release-notes/es-es-spanish-spain-4` - URL: https://developer.incode.com/release-notes/es-es-spanish-spain-4/ - Markdown: https://developer.incode.com/release-notes/es-es-spanish-spain-4.md # ES-ES - Spanish (Spain) ## 🆕 Added * `errors.dynamicImport.suggestion_other` = `Lo intentaremos de nuevo en {{count}} segundos o puede actualizar manualmente` * `errors.dynamicImport.suggestion_one` = `Lo intentaremos de nuevo en {{count}} segundo o puede actualizar manualmente` * `idv2.commonIssues.firstStep` = `1. Rellena el marco con tu DNI` * `idv2.commonIssues.secondStep` = `2. Pulse el botón` * `verification.labels.gender` = `Género` * `verification.labels.idNum` = `Número nacional de identidad` * `verification.labels.idNum1` = `Número de identificación fiscal` ## 🆕 Modified * `notifications.selfieCaptureFailed`: * Before: `Error de captura` * Now: `Falló el procesamiento de la selfie` * `notifications.selfieCaptureFailedDescription`: * Before: `No pudimos capturar el selfie` * Now: `Tu selfie será revisada manualmente más tarde` * `notifications.spoof`: * Before: `Error de captura` * Now: `Falló el procesamiento de la selfie` * `notifications.spoofDescription`: * Before: `No pudimos tomar tu selfie. Por favor intenta nuevamente ` * Now: `No pudimos procesar tu selfie. Por favor, intenta de nuevo` * `notifications.spoofDescriptionNoTries`: * Before: `No pudimos capturar selfie.` * Now: `Tu selfie será revisada manualmente más tarde` * `retake.titleBack`: * Before: `Revisa la foto del <1>REVERSO del documento` * Now: `Revisar la foto del DNI` * `retake.titleFront`: * Before: `Revisa la foto del <1>FRENTE del documento` * Now: `Revisar foto de carné FRONTAL` * `retake.titlePassport`: * Before: `Revisión <1>PASAPORTE foto` * Now: `Revisión PASAPORTE foto` * `selfie.spoof`: * Before: `Error de captura` * Now: `Falló el procesamiento de la selfie` * `selfie.spoofDescription`: * Before: `No pudimos tomar tu selfie. Por favor intenta nuevamente` * Now: `No pudimos procesar tu selfie. Por favor, intenta de nuevo` * `tutorial.back.title`: * Before: `Ahora escanea el <1>reverso de tu DNI` * Now: `Ahora escanea el reverso de tu DNI` * `videoSelfie.errors.noInternetConnectionDescription`: * Before: `Espera a que vuelva internet para continuar el proceso o conéctate a una red disponible` * Now: `Espera a que vuelva Internet para continuar el proceso o conéctate a una red disponible.` --- - Path: `release-notes/es-es-spanish-spain-5` - URL: https://developer.incode.com/release-notes/es-es-spanish-spain-5/ - Markdown: https://developer.incode.com/release-notes/es-es-spanish-spain-5.md # ES-ES - Spanish (Spain) ## 🆕 Added * `documentCapture.skip` = `Omitir este paso` * `idv2.capture.processing.uploading` = `Cargando...` * `idv2.deepsightPermissions.subtitle` = `permiso` * `idv2.deepsightPermissions.title` = `Permitir cámara y movimiento ` * `idv2.permissions.allowPermissionsV2` = `Permitir permisos de cámara` * `idv2.permissions.inOrderToCompleteTheProcess` = `para completar el proceso` * `idv2.unacceptedId.acceptedDocuments` = `Documentos aceptados para:` * `idv2.unacceptedId.attemptsLeft_one` = `({{count}} intento a la izquierda)` * `idv2.unacceptedId.attemptsLeft_other` = `({{count}} quedan intentos)` * `idv2.unacceptedId.birthCertificate` = `Partida de nacimiento` * `idv2.unacceptedId.changeMethod` = `Cambiar el método de verificación` * `idv2.unacceptedId.currency` = `Moneda` * `idv2.unacceptedId.driversLicense` = `Permiso de conducir` * `idv2.unacceptedId.federalId` = `Identificación federal` * `idv2.unacceptedId.identificationCard` = `Tarjeta de identificación` * `idv2.unacceptedId.identificationCardDescription` = `Sólo INE emitido a partir de 2017.` * `idv2.unacceptedId.medicalCard` = `Tarjeta sanitaria` * `idv2.unacceptedId.military` = `Militar` * `idv2.unacceptedId.multipleNationalities` = `¿Múltiples nacionalidades?` * `idv2.unacceptedId.noDocuments` = `No se aceptan documentos para este país` * `idv2.unacceptedId.other` = `Otros` * `idv2.unacceptedId.passport` = `Pasaporte` * `idv2.unacceptedId.passportDescription` = `Solo pasaportes expedidos en 2014.` * `idv2.unacceptedId.permit` = `Permiso` * `idv2.unacceptedId.residenceDocument` = `Documento de residencia` * `idv2.unacceptedId.seeDifferentCountry` = `Ver un país diferente` * `idv2.unacceptedId.taxIdentification` = `Identificación fiscal` * `idv2.unacceptedId.travelDocument` = `Documento de viaje` * `idv2.unacceptedId.tribalIdentification` = `Identificación tribal` * `idv2.unacceptedId.tryAgain` = `Inténtalo de nuevo` * `idv2.unacceptedId.unknown` = `Desconocido` * `idv2.unacceptedId.unknownCountry` = `Desconocido` * `idv2.unacceptedId.vehicleRegistration` = `Matriculación de vehículos` * `idv2.unacceptedId.visa` = `Visa` * `idv2.unacceptedId.voterIdentification` = `Identificación de los votantes` * `idv2.unacceptedId.weaponLicense` = `Licencia de armas` * `notifications.accessDenied` = `Acceso denegado` * `notifications.accessDeniedDescription` = `No hemos podido procesar tu selfie. Vuelve a intentarlo` * `notifications.lowQualityImage` = `Condiciones de baja calidad` * `notifications.lowQualityImageDescription` = `Quédese quieto para la captura, y asegúrese de que su cara es clara y visible` * `notifications.noAttemptsRemaining` = `No quedan intentos` * `videoSelfie.processingStep` = `Procesando...` ## ✏️ Modified * `errors.dynamicImport.failedToLoad`: * Old: `Un error algo inesperado pero del que tomamos nota:` * New: `No esperábamos este error, pero estamos tomando nota.` * `idv2.capture.processing.errors.unacceptable.title`: * Old: `No se acepta el tipo de identificación` * New: `Documento de identidad no aceptado` * `idv2.permissions.denied.cameraAllow`: * Old: `Pulse Cámara → Permitir` * New: `Pulse Cámara Permitir` * `idv2.permissions.denied.siteSettings`: * Old: `Ajustes → Ajustes del sitio` * New: `Ajustes Ajustes del sitio` --- - Path: `release-notes/es-es-spanish-spain-6` - URL: https://developer.incode.com/release-notes/es-es-spanish-spain-6/ - Markdown: https://developer.incode.com/release-notes/es-es-spanish-spain-6.md # ES - ES - Spanish (Spain) ## 🆕 Added * ` desktop.idv2.digitalIdUpload.successfullyProcessed` = `Procesado con éxito.` * `email.verified` = `Correo electrónico verificado.` * `email.verify` = `Verifique su correo electrónico` * `email.willSendCode` = `Te enviaremos un código para asegurarnos de que es tuyo` * `geolocationv2.addressBar` = `En la barra de direcciones, pulse sobre AA` * `geolocationv2.allowLocationAccess` = `Permitir el acceso a la ubicación` * `geolocationv2.allowUsing` = `Seleccione Permitir durante el uso` * `geolocationv2.appsBrowser` = `Ir a Apps Tu navegador` * `geolocationv2.appsChrome` = `Ir a Aplicaciones Chrome` * `geolocationv2.appsFirefox` = `Ir a Aplicaciones Firefox` * `geolocationv2.appsOpera` = `Ir a Apps Opera` * `geolocationv2.choosePermissions` = `Elija Preguntar la próxima vez o Mientras usa la aplicación` * `geolocationv2.determineLocation` = `Necesitamos determinar su ubicación actual` * `geolocationv2.goBackSafari` = `Volver a Ajustes Safari` * `geolocationv2.instructions.allowLocation` = `Permitir permisos de ubicación` * `geolocationv2.locationOn` = `Asegúrate de que los servicios de localización están activados` * `geolocationv2.openSettings` = `Abrir la configuración` * `geolocationv2.openSettingsAndroid` = `Abre los ajustes de tu dispositivo` * `geolocationv2.permissionsLocation` = `Toque Permisos Ubicación` * `geolocationv2.privacySecurity` = `Privacidad y seguridad abiertas` * `geolocationv2.refreshPage` = `Actualizar página` * `geolocationv2.returnAndRefresh` = `Volver aquí y Actualizar página` * `geolocationv2.scrollDownChrome` = `Desplácese hacia abajo y pulse Chrome` * `geolocationv2.scrollDownFirefox` = `Desplázate hacia abajo y pulsa Firefox` * `geolocationv2.scrollDownOpera` = `Desplácese hacia abajo y pulse Opera` * `geolocationv2.skip` = `Omitir este paso` * `geolocationv2.tapLocation` = `Ubicación del grifo` * `geolocationv2.tapLocationAllow` = `Pulse Ubicación y seleccione Permitir` * `geolocationv2.tapSettings` = `Toque Configuración del sitio web
          Permitir permisos de ubicación
          ` * `idv2.capture.notifications.expiredId` = `Documento de identidad caducado` * `idv2.capture.notifications.useDifferent` = `Utilizar un ID diferente` * `idv2.capture.processing.processing` = `Procesando...` * `idv2.capture.processing.scanFront` = `Escanear el anverso` * `idv2.capture.processing.successBackSubtitleScanFront` = `Ahora vamos a capturar la parte delantera` * `idv2.chooser.chooseHowToVerifyTitle` = `Elija cómo verificar` * `idv2.chooser.digitalIdUploadButtonTitle` = `Cargar ID digital` * `idv2.chooser.manualUploadButtonTitle` = `Cargar ID` * `idv2.digitalIdUpload.analyzing` = `Analizar...` * `idv2.digitalIdUpload.digitalIdUploadButtonTitle` = `Cargar DNI digital` * `idv2.digitalIdUpload.errorScreen.scanId` = `Escanee su DNI` * `idv2.digitalIdUpload.loadingSuccess.letsContinue` = `Continuemos` * `idv2.digitalIdUpload.reviewScreen.description` = `Asegúrese de que se trata del archivo correcto antes de continuar con el proceso de verificación.` * `idv2.digitalIdUpload.reviewScreen.replaceButton` = `Sustituir archivo` * `idv2.digitalIdUpload.reviewScreen.replaceFileButton` = `Continúe en` * `idv2.digitalIdUpload.reviewScreen.title` = `Revise su documento` * `idv2.digitalIdUpload.screenDescription` = `Un archivo PDF o una foto emitida por el gobierno con sus datos, foto y un código QR` * `idv2.digitalIdUpload.screenTitle` = `Cargue su DNI digital` * `idv2.digitalIdUpload.supportedFileTypesCopy` = `Archivo PDF o foto JPG, PNG` * `idv2.digitalIdUpload.unknownDocumentTypeScreen.errorTitle` = `No se ha podido verificar su ID` * `idv2.digitalIdUpload.wrongDocumentType` = `Documento de identidad no aceptado` * `idv2.digitalIdUpload.wrongDocumentTypeScreen.errorSubtitle` = `Utilice un ID diferente de la lista aceptada:` * `idv2.digitalIdUpload.wrongDocumentTypeScreen.errorTitle` = `Documento de identidad no aceptado` * `idv2.digitalIdUpload.wrongDocumentTypeScreen.tryAgainButton` = `Inténtalo de nuevo` * `idv2.manualUploadLoading.subtitle` = `Cargar el archivo` * `idv2.permissions.denied.chrome.fifthStep` = `A continuación, actualice la página` * `idv2.permissions.denied.chrome.firstStep` = `En la parte superior izquierda de la página web, haga clic en el candado` * `idv2.permissions.denied.chrome.fourthStep` = `Haga clic en él y seleccione Permitir` * `idv2.permissions.denied.chrome.secondStep` = `Se abrirá un pequeño menú` * `idv2.permissions.denied.chrome.thirdStep` = `Buscar cámara` * `idv2.permissions.denied.firefox.fifthStep` = `A continuación, actualice la página` * `idv2.permissions.denied.firefox.firstStep` = `Haz clic en la cámara o en el icono del candado ` * `idv2.permissions.denied.firefox.fourthStep` = `Haga clic en él y seleccione Permitir` * `idv2.permissions.denied.firefox.secondStep` = `Se abrirá un menú` * `idv2.permissions.denied.firefox.thirdStep` = `Buscar cámara` * `idv2.permissions.denied.opera.fifthStep` = `A continuación, actualice la página` * `idv2.permissions.denied.opera.firstStep` = `Haga clic en el icono del candado ` * `idv2.permissions.denied.opera.fourthStep` = `Haga clic en él y seleccione Permitir` * `idv2.permissions.denied.opera.secondStep` = `Se abrirá un pequeño menú` * `idv2.permissions.denied.opera.thirdStep` = `Buscar cámara` * `idv2.permissions.denied.safari.fifthStep` = `Haga clic en él y seleccione Permitir` * `idv2.permissions.denied.safari.firstStep` = `En la parte superior izquierda, haga clic en Safari` * `idv2.permissions.denied.safari.fourthStep` = `Busca donde pone Cámara` * `idv2.permissions.denied.safari.secondStep` = `Haga clic en Configuración de este sitio web...` * `idv2.permissions.denied.safari.sixthStep` = `A continuación, actualice la página` * `idv2.permissions.denied.safari.thirdStep` = `Aparecerá un cuadro` * `nameCapturev2.title` = `Introduzca su nombre` * `nameCapturev2.verified` = `¡Nombre verificado!` * `otp.didntReceive` = `¿No ha recibido el código?` * `otp.enterCodeEmail` = `Introduce el código que te hemos enviado a tu correo electrónico` * `otp.errorv2` = `Código caducado, inténtelo de nuevo` * `otp.resendCode` = `Reenviar código` * `otp.resendCountdown` = `Reenvío de código en {{time}}s` * `redirect.didntReceive` = `¿No has recibido el enlace?` * `redirect.enterPhoneNumber` = `Introduzca su número de teléfono para recibir un enlace para verificar a través de SMS` * `redirect.linkSent` = `Enlace enviado.` * `redirect.phishingResistance.explanation1` = `Necesitarás un documento de identidad válido y un selfie.` * `redirect.phishingResistance.recommendedBrowser` = `Recomendamos utilizar Safari en iOS y Chrome en Android.` * `redirect.phishingResistance.titleClient` = `Verifique su identidad` * `redirect.resend` = `Vuelva a enviar` * `redirect.scanQRTitle` = `Escanear QR` * `redirect.scanQrv2` = `Escanee el código QR para verificarlo en su dispositivo móvil.` * `redirect.sendLinkSms` = `Enviar enlace por SMS` * `redirect.sendSms` = `Enviar SMS` --- - Path: `release-notes/es-es-spanish-spain-7` - URL: https://developer.incode.com/release-notes/es-es-spanish-spain-7/ - Markdown: https://developer.incode.com/release-notes/es-es-spanish-spain-7.md # ES - ES - Spanish (Spain) ## 🆕 Added * `curp.continue` = `Continuar` * `curp.dontHave` = `No tengo CURP` * `curp.enterCurp` = `Introduzca su CURP` * `curp.generate` = `Genera tu CURP` * `curp.generateCta` = `Generar` * `curp.labels.birthState` = `Estado de nacimiento` * `curp.labels.dob` = `Fecha de nacimiento` * `curp.labels.femaleV2` = `Mujer` * `curp.labels.firstLast` = `Nombre Apellido` * `curp.labels.firstName` = `Nombre` * `curp.labels.genderV2` = `Género` * `curp.labels.maleV2` = `Hombre` * `curp.labels.other` = `No binario/Otro` * `curp.labels.secondLast` = `Segundo apellido` * `curp.placeholder.curp` = `Su CURP` * `curp.placeholder.firstLast` = `Su nombre y apellidos` * `curp.placeholder.firstName` = `Su nombre` * `curp.placeholder.gender` = `Elige género` * `curp.placeholder.secondLast` = `Su segundo apellido` * `curp.placeholder.state` = `Seleccionar estado` * `curp.status.checkInfo` = `Compruebe la información introducida` * `curp.status.confirm` = `Confirme su CURP` * `curp.status.couldntGenerate` = `No se ha podido generar CURP` * `curp.status.edit` = `Editar información` * `curp.status.generating` = `Generar CURP...` * `curp.status.notVerified` = `CURP no verificado` * `curp.status.tryAgain` = `Inténtalo de nuevo` * `curp.status.verified` = `¡CURP verificado!` * `curp.status.verifying` = `Verificando su CURP...` * `faceMatch.continue` = `Continúe en` * `faceMatch.facesNoMatch` = `Las caras no coinciden` * `faceMatch.firstId` = `Primera identificación` * `faceMatch.id` = `ID` * `faceMatch.matched` = `¡Emparejado!` * `faceMatch.matching` = `Verificación de la identidad` * `faceMatch.processing` = `Procesando...` * `faceMatch.secondId` = `Segunda identificación` * `faceMatch.selfie` = `Selfie` * `face.tutorial.ageAssuranceStartCapture` = `Verificar la edad` * `face.tutorial.ageAssuranceSubtitle` = `Su imagen no se almacenará ni se compartirá con terceros para proteger su intimidad.` * `face.tutorial.ageAssuranceTitle` = `Hazte un selfie para verificar tu edad` * `face.tutorial.autoCapture` = `Quédate quieto, el selfie se tomará automáticamente` * `home.start` = `Inicio` * `idv2.ageVerificationPage.ageVerification` = `Verificación de la edad` * `idv2.ageVerificationPage.Continue` = `Continúe en` * `idv2.ageVerificationPage.showYourIdAndScanIt` = `Muestra tu DNI y escanéalo` * `idv2.ageVerificationPage.TheRestOfYourInformationWillBeDeletedToEnsureYourPrivacy` = `El resto de tu información se eliminará para garantizar tu privacidad.` * `idv2.ageVerificationPage.weNeedToScanYourIDToKnowYourAge` = `Necesitamos escanear tu DNI para saber tu edad` * `idv2.ageVerificationPage.weOnlyUseTheDateOfBirthInformation` = `Sólo utilizamos los datos de la fecha de nacimiento` * `idv2.barCodeDetection.processingSubtitle` = `Estamos verificando su identidad` * `idv2.barCodeDetection.processingTitle` = `Espera un segundo...` * `idv2.capture.processing.verifying` = `Verificando...` * `idv2.digitalIdUpload.continue` = `Continuar` * `idv2.digitalIdUpload.errorScreen.pleaseTryScanning` = ` Por favor, intente escanear un documento diferente` * `idv2.digitalIdUpload.errorScreen.thisIdMustBeScanned` = `Esta identificación debe escanearse` * `idv2.digitalIdUpload.reviewScreen.continue` = `Continuar` * `idv2.digitalIdUpload.successfullyProcessed` = `Procesado con éxito.` * `onboarding.errors.invalidQRuuid.message` = `Parece que tu URL no es válida o ha caducado` * `onboarding.errors.invalidQRuuid.title` = `Su URL no es válida` * `otp.enterCodeSMS` = `Introduzca el código que le hemos enviado por SMS` * `phone.verify` = `Verifique su número de teléfono` * `redirect.resendCountdown` = `Reenviar enlace en {{time}}s` * `verification.failureTitle` = `Algo salió mal` * `verification.labels.addressDetailsSection` = `Dirección` * `verification.labels.dlDetailsSection` = `Datos del permiso de conducir` * `verification.placeholder.email` = `email@example.com` * `verification.placeholder.firstName` = `Su nombre` * `verification.placeholder.lastName` = `Su apellido` * `verification.placeholder.maternalSurname` = `Su apellido materno` * `verification.placeholder.middleName` = `Su segundo nombre` * `verification.placeholder.stateCode` = `Por ejemplo {{states}}` * `verification.placeholder.surname` = `Su apellido` * `verification.submitButton` = `Continúe en` * `verification.successTitle` = `eKYC verificado` * `verification.tryAgain` = `Inténtalo de nuevo` ## ✏️ Modified * `idv2.capture.processing.scanFront`: * Old: `Escanear el anverso` * New: `Escanea el frente` * `idv2.capture.processing.successBackSubtitleScanFront`: * Old: `Ahora vamos a capturar la parte delantera` * New: `Ahora capturemos el frente` * `idv2.chooser.chooseHowToVerifyTitle`: * Old: `Elija cómo verificar` * New: `Seleccione cómo verificar` * `idv2.digitalIdUpload.reviewScreen.title`: * Old: `Revise su documento` * New: `Revisar documento` * `idv2.digitalIdUpload.screenDescription`: * Old: `Un archivo PDF o una foto emitida por el gobierno con sus datos, foto y un código QR` * New: `Un archivo PDF emitido por el gobierno con sus datos, foto y un código QR` * `idv2.digitalIdUpload.screenTitle`: * Old: `Cargue su DNI digital` * New: `Cargar ID digital` * `otp.resendCountdown`: * Old: `Reenvío de código en {{time}}s` * New: `Reenvío de código en {{time}}s` * `verification.labels.state`: * Old: `Código estatal (por ejemplo, {{states}})` * New: `Código del Estado` --- - Path: `release-notes/es-es-spanish-spain-8` - URL: https://developer.incode.com/release-notes/es-es-spanish-spain-8/ - Markdown: https://developer.incode.com/release-notes/es-es-spanish-spain-8.md # ES - ES - Spanish (Spain) ## 🆕 Added * `commonIssues.blurPresent` = `Desenfoque presente` * `commonIssues.blurPresentDescription` = `Aleja o acerca el ID al teléfono hasta que la imagen esté enfocada` * `commonIssues.glarePresent` = `Resplandor presente` * `commonIssues.glarePresentDescription` = `Inclina el ID ligeramente hacia arriba o hacia abajo para minimizar el reflejo` * `commonIssues.notReadable` = `La información no es legible` * `commonIssues.notReadableDescription` = `Minimiza el movimiento de la cámara sujetando el teléfono con firmeza` * `encryptionLabel.encryptedPhotos` = `Todos los datos están encriptados` * `home.goToSettings` = `Ir a la configuración` * `idv2.backTutorial.disclaimer` = `La captura se realizará automáticamente` * `idv2.backTutorial.subtitle` = `Asegúrese de que su documento de identidad sea legible` * `idv2.backTutorial.title` = `Muestre el reverso de su documento de identidad` * `idv2.capture.allDataIsEncrypted` = `Todos los datos están encriptados` * `idv2.permissions.allowV2` = `Permitir` * `idv2.permissions.subtitleV2` = `Esto permite a la cámara realizar la captura necesaria para la verificación` * `idv2.reverseFlipAnimation.title` = `Muestre el anverso de su documento de identidad` * `notifications.faceOccluded` = `Rostro cubierto` * `notifications.faceOccludedDescription` = `Asegúrate de que tu cara sea clara y visible.` * `selfiev2.manualCapture.captureButton` = `Tomar foto` ## ✏️ Modified * `commonIssues.takeManually`: * Old: `Haz la foto manualmente` * New: `Hacer la foto manualmente` * `face.tutorial.autoCapture`: * Old: `Quédate quieto, el selfie se tomará automáticamente` * New: `No te muevas, la selfie se tomará automáticamente` * `face.tutorial.subtitle`: * Old: `Esto te permite iniciar sesión utilizando tu cara.` * New: `Mantén una expresión neutra, busca una luz equilibrada y quítate las gafas y los sombreros` * `idv2.capture.autoCapture`: * Old: `La foto se tomará automáticamente` * New: `La captura se realizará automáticamente` * `idv2.capture.fillFrameBack`: * Old: `Rellena el marco con tu identificación dorsal` * New: `Enmarca el reverso de tu DNI` * `idv2.capture.fillFrameFront`: * Old: `Rellena el marco con tu DNI` * New: `Encuadre el anverso de su DNI` * `idv2.permissions.allowPermissionsV2`: * Old: `Permitir permisos de cámara` * New: `Permitir el acceso a la cámara` * `idv2.permissions.dontAllow`: * Old: `No permita` * New: `No permita que` * `idv2.permissions.learnMorePage.instructions.1`: * Old: `Sólo utilizamos la cámara para capturar su identificación para la verificación segura` * New: `Sólo utilizamos la cámara para el proceso de verificación.` * `idv2.permissions.learnMorePage.instructions.2`: * Old: `Ayuda a verificar la autenticidad de los documentos y a prevenir el fraude de identidad.` * New: `El proceso de verificación garantiza que usted es quien dice ser.` * `idv2.tutorial.autoCapture`: * Old: `La foto se tomará automáticamente` * New: `La captura se realizará automáticamente` * `idv2.tutorial.title`: * Old: `Escanee su DNI` * New: `Muestre el anverso de su documento de identidad` * `notifications.selfieCaptureFailedDescription`: * Old: `Tu selfie será revisada manualmente más tarde` * New: `Se alcanzó el número máximo de intentos` * `notifications.spoofDescriptionNoTries`: * Old: `Tu selfie será revisada manualmente más tarde` * New: `Se alcanzó el número máximo de intentos` --- - Path: `release-notes/es-es-spanish-spain-9` - URL: https://developer.incode.com/release-notes/es-es-spanish-spain-9/ - Markdown: https://developer.incode.com/release-notes/es-es-spanish-spain-9.md # ES - ES - Spanish (Spain) ## 🆕 Added * `ekyb.addressDetails` = `Dirección` * `ekyb.continue` = `Continúe en` * `ekyb.error.title` = `Algo salió mal` * `ekyb.processing` = `Tratamiento` * `ekyb.success` = `Éxito` * `ekyb.tryAgain` = `Inténtalo de nuevo` * `idv2.capture.manualCapture.modeSwitchAriaAnnouncement` = `Ahora utiliza el modo de captura manual. Pulse el botón para capturar la foto.` * `idv2.capture.v2.autoCapture` = `La foto se tomará automáticamente` * `idv2.capture.v2.fillFrameBack` = `Rellena el marco con tu identificación dorsal` * `idv2.capture.v2.fillFrameFront` = `Rellena el marco con tu DNI` * `idv2.tutorial.v2.autocapture` = `La foto se tomará automáticamente` * `idv2.tutorial.v2.title` = `Escanee su DNI` * `otp.groupLabel` = `Código de verificación de {{charLength}} dígitos` * `v2.capture.label` = `Todas las fotos están encriptadas` * `v2.idError.attemptsLeft_one` = `{{count}} intento restante` * `v2.idError.attemptsLeft_other` = `{{count}} intento restante` * `v2.idSuccess.subtitle` = `Ahora vamos a capturar la parte de atrás` * `v2.idSuccess.subtitleBack` = `Continuemos` * `v2.idSuccess.title` = `Procesado con éxito.` * `v2.selfie.camera.loading` = `Cargando...` --- - Path: `release-notes/es-spanish` - URL: https://developer.incode.com/release-notes/es-spanish/ - Markdown: https://developer.incode.com/release-notes/es-spanish.md # ES - Spanish ## 🆕 Added * `idv2.permissions.fakeDenied.alert` = `alerta falsa centrada` * `idv2.permissions.fakeDenied.allowPermissions` = `Permitir permisos` * `idv2.permissions.fakeDenied.quitProcess` = `Abandonar el proceso` * `idv2.permissions.fakeDenied.title` = `Se requiere permiso de cámara para la captura de documentos` * `idv2.permissions.fakeDenied.warning` = `advertencia` --- - Path: `release-notes/es-spanish-1` - URL: https://developer.incode.com/release-notes/es-spanish-1/ - Markdown: https://developer.incode.com/release-notes/es-spanish-1.md # ES - Spanish ## 🆕 Added * `documentCapture.multiPageDocument.step1.description` = `Asegúrese de que todo el documento está en el marco` * `documentCapture.multiPageDocument.step1.title` = `Preparar la primera página` * `documentCapture.multiPageDocument.step2.description` = `Asegúrese de que todo el documento está en el marco` * `documentCapture.multiPageDocument.step2.title` = `Preparar la segunda página` * `face.tutorial.startCapture` = `Hazte un selfie` * `face.tutorial.subtitle` = `Esto te permite iniciar sesión utilizando tu cara.` * `face.tutorial.title` = `Hazte un selfie` * `idv2.flipAnimation.title` = `Muestre el reverso de su documento de identidad` ## ✏️ Modified * `idv2.permissions.subtitle`: * Before: `permitir permiso de cámara` * Now: `permita acceso a la cámara` * `notifications.fitOverlay`: * Before: `Acerca la credencial para llenar el recuadro` * Now: `Asegúrate de que la credencial quede dentro del recuadro` * `notifications.frontClassificationFailed`: * Before: `Error en el escaneado de ID` * Now: `Error en el escaneado de documento` * `notifications.idScanFailed`: * Before: `Error en el escaneado de ID` * Now: `Error en el escaneado de documento` * `notifications.outOfFocusChange`: * Before: `Revisa el lente de la cámara y las condiciones de captura` * Now: `Asegúrate de que el documento no esté borroso ni obstruido` * `settings.selectLanguage`: * Before: `Escoge tu idioma` * Now: `Escoge tu país/idioma` --- - Path: `release-notes/es-spanish-10` - URL: https://developer.incode.com/release-notes/es-spanish-10/ - Markdown: https://developer.incode.com/release-notes/es-spanish-10.md # ES - Spanish ## 🆕 Added * `aes.confirmSignature.finishSigning` = `Terminar de firmar` * `aes.reviewDocument.subtitle` = `Asegúrate de que has seleccionado el archivo correcto antes de seguir firmando.` * `aes.reviewDocument.title` = `Revise su documento` * `biometricConsent. consentOptions` = `Opciones de consentimiento` * `common.done` = `¡Hecho!` * `common.wontTakeLong` = `Esto no llevará mucho tiempo.` * `curp.verifyManually` = `Verificar manualmente` * `customFields.completed` = `¡Terminado!` * `customFields.continue` = `Continúe en` * `customFields.processing` = `Procesando...` * `customFields.title` = `Introduzca sus datos` * `customWatchlist.done` = `¡Hecho!` * `customWatchlist.wontTake` = `Esto no llevará mucho tiempo.` * `digilocker.denied.tryAgain` = `Inténtalo de nuevo` * `documentCapture.button.allPagesCaptured` = `Todas las páginas capturadas` * `documentCapture.button.nextPage` = `Página siguiente` * `documentCapture.tutorial.continue` = `Continúe en` * `documentCapture.tutorial.multiPageDocument.optionalPage.subtitle` = `Si hay otra página con información relevante, puede capturarla ahora.` * `ekyb.addAnotherDirector` = `Añadir otro Director (Opcional)` * `ekyb.directorNameWithNumber` = `Director {{number}} Nombre` * `ekyb.directorSurnameWithNumber` = `Director {{number}} Apellidos` * `ekyb.error.taxId-cn` = `Introduzca un código de crédito social unificado chino válido (18 caracteres alfanuméricos)` * `ekyb.error.taxId-de` = `Introduzca un número de identificación fiscal alemán válido: IVA (DE + 9 dígitos), HRB (3-6 dígitos), HRB (6 dígitos + letra) o HRA (4-6 dígitos).` * `ekyb.error.taxId-es` = `Introduzca un NIF español válido: NIF (letra + 8 dígitos), NIE (letra + 7 dígitos + letra), o DNI (8 dígitos + letra)` * `ekyb.error.taxId-gb` = `Introduzca un número de identificación fiscal válido en el Reino Unido: Número de registro (7-8 dígitos) o Número de IVA (GB seguido de 9 dígitos, o 9 dígitos solos).` * `ekyb.error.taxId-il` = `Introduzca un Mispar Osek israelí válido (9 dígitos)` * `ekyb.error.taxId-it` = `Introduzca un número de identificación fiscal italiano válido: CCIAA/NREA (2 letras + 6-7 dígitos), identificación de la empresa (IT + 8 dígitos) o código fiscal/IVA (11 dígitos).` * `ekyb.error.taxId-mx` = `Introduzca un RFC mexicano válido: Individual (4 letras + 6 dígitos + 3 alfanuméricos) o Empresarial (3 letras + 6 dígitos + 3 alfanuméricos).` * `ekyb.error.taxId-ng` = `Introduzca un NIF nigeriano válido (10 dígitos)` * `ekyb.error.taxId-nl` = `Introduzca un número de identificación fiscal holandés válido: Número de IVA (NL + 9 dígitos + B + 2 dígitos) o número KvK (8 dígitos)` * `email.placeholder` = `Correo electrónico` * `forms.placeholder.select` = `Seleccione una opción` * `identityReuse.cta.continue` = `Continuar con la verificación rápida` * `identityReuse.cta.verify` = `Verificar con el DNI` * `identityReuse.description` = `Sólo transferiremos los datos solicitados por {{companyName}} para completar su verificación` * `identityReuse.subtitle` = `Se ha verificado previamente con uno de nuestros socios. Comparte tus datos para ahorrar tiempo y verificar más rápido.` * `identityReuse.title` = `Comparte tus datos para una verificación más rápida` * `idOcr.title` = `Compruebe sus datos` * `idv2.capture.expiredId.idScanFailed` = `Error en el escaneado de ID` * `idv2.capture.expiredId.pleaseTryWithADifferentId` = `Inténtelo con otro documento` * `idv2.capture.notifications.idScanFailed` = `Error en el escaneado de ID` * `idv2.capture.processing.attemptsRemainingLabel` = `intentos restantes` * `idv2.capture.processing.noAttemptsRemaining` = `No quedan intentos` * `idv2.chooser.appleWallet` = `Cartera Apple` * `idv2.chooser.deviceWalletTag` = `Instantánea` * `idv2.chooser.googleWallet` = `Google Wallet` * `idv2.digilocker.consentDeniedDescription` = `No se ha proporcionado el consentimiento para compartir documentos a través de DigiLocker. Puede volver a intentarlo o elegir otra forma de verificación.` * `idv2.digilocker.consentDeniedTitle` = `Consentimiento denegado` * `idv2.digilocker.openingDigilockerForAuthentication` = `Abrir DigiLocker para la autenticación..` * `idv2.digilocker.sessionErrorDescription` = `No se ha podido restaurar la sesión. Por favor, reinicie el proceso de verificación.` * `idv2.digilocker.sessionErrorTitle` = `Error de sesión` * `idv2.digilocker.takingYouToDigilocker` = `Llevándote a DigiLocker..` * `idv2.digilocker.timeoutDescription` = `La solicitud de DigiLocker no se ha completado en el tiempo previsto. Vuelva a intentarlo o seleccione un método de verificación alternativo.` * `idv2.digilocker.timeoutTitle` = `La sesión ha terminado..` * `idv2.digilocker.verificationCompleteTitle` = `Identidad verificada correctamente` * `idv2.digitalIdUpload.fileTooLargeScreen.cta` = `Elija otro archivo` * `idv2.digitalIdUpload.fileTooLargeScreen.subtitle` = `El archivo seleccionado pesa más de 5 MB, cargue uno más pequeño` * `idv2.digitalIdUpload.fileTooLargeScreen.title` = `El archivo es demasiado grande` * `idv2.permissions.denied.cameraFindSiteAllow` = `Cámara Buscar sitio Permitir` * `loadingCircle.preparingCamera` = `Preparar la cámara` * `manualIdUpload.generic` = `Por favor, cargue el documento correcto` * `manualIdUpload.glareDetected` = ` Resplandor presente` * `manualIdUpload.hintIdReadable` = `Asegúrese de que el texto de la identificación sea legible.` * `manualIdUpload.hintPassportReadable` = `Asegúrese de que el texto del pasaporte es legible.` * `manualIdUpload.hintSharpAndGlareFree` = `La foto debe ser nítida y sin reflejos.` * `manualIdUpload.lowSharpness` = `Desenfoque presente` * `manualIdUpload.qualityRejected` = `La calidad de la imagen es demasiado baja.` * `manualIdUpload.readabilityIssue` = `La información no es legible` * `manualIdUpload.subtitle` = `Asegúrese de que su documento de identidad sea legible` * `manualIdUpload.uploadingSubtitle` = `Cargar el archivo` * `manualIdUpload.uploadingTitle` = `Espera un segundo...` * `manualIdUpload.wrongDocument` = `Por favor, cargue el documento correcto` * `onboarding.errors.onboardingUrlAlreadyUsed.message` = `Parece que esta URL ya está en uso` * `onboarding.errors.onboardingUrlAlreadyUsed.title` = `Su URL no es válida` * `otp.resendCodeAvailable` = `Ahora puede volver a enviar el código` * `otp.timerFiveSeconds` = `Quedan 5 segundos` * `otp.timerStarted` = `Puede solicitar un nuevo código en {{ time }} segundos` * `otp.timerTenSeconds` = `Quedan 10 segundos para solicitar un nuevo código` * `otp.verificationCode` = `Código de verificación` * `phone.invalidPhone` = `Número de teléfono no válido. Inténtelo de nuevo.` * `phone.optIn` = `Acepto recibir notificaciones por SMS` * `phone.serverError` = `Algo ha ido mal. Vuelva a intentarlo más tarde.` * `qes.documentsReviewedCheck` = `Confirmo que he revisado los documentos a firmar indicados anteriormente antes de proceder con la firma.` * `qes.issuanceCheck` = `Acepto la emisión de un Certificado Cualificado para firma electrónica por parte de Incode Czech Republic s.r.o., actuando como Prestador de Servicios de Confianza Cualificado (QTSP).` * `qes.newTermsCheck` = `He leído, comprendido y acepto los <2>Términos de Uso y la <6>Política de Privacidad plicables a la emisión y uso de este certificado.` * `qes.qesAcknowledgementCheck` = `Reconozco que este proceso dará como resultado una Firma Electrónica Cualificada (QES), que tiene el mismo efecto jurídico que una firma manuscrita conforme a la legislación de la UE (eIDAS, Reglamento (UE) 910/2014).` * `qes.qscdConfirmationCheck` = `Confirmo que la firma se crea mediante un Dispositivo Cualificado de Creación de Firmas (QSCD) y que mantengo el control exclusivo sobre el proceso de firma.` * `redirect.didntReceiveLinkActions` = `¿No has recibido el enlace? Reenviar o Cambiar número de teléfono` * `redirect.linkResent` = `Enlace reenviado correctamente` * `redirect.linkSentTo` = `Para : {{phone}}` * `signature.fullSignaturePlaceholder` = `Firme aquí` * `signature.fullSignatureTitle` = `Dibuja tu firma` * `signature.initialsPlaceholder` = `Dibuje aquí sus iniciales` * `signature.initialsTitle` = `Escriba sus iniciales` * `signature.subtitle` = `Utiliza el dedo o el ratón` * `signature.successTitle` = `Firmado con éxito.` * `userData.cpf` = `CPF` * `v2.redirectToMobile.continueOnDesktop` = `Continuar en el escritorio` * `v2.redirectToMobile.qr.description` = `Escanee el código QR para verificarlo en su dispositivo móvil.` * `v2.redirectToMobile.sms.description` = `Introduzca su número de teléfono para recibir un enlace para verificar a través de SMS` * `v2.redirectToMobile.sms.sendSms` = `Enviar enlace por SMS` * `v2.redirectToMobile.subtitle` = `Necesitarás un documento de identidad válido y un selfie.` * `v2.redirectToMobile.tabs.0` = `Escanear QR` * `v2.redirectToMobile.tabs.1` = `Enviar SMS` * `v2.redirectToMobile.title` = `Verifique su identidad` * `v2.settings.language` = `Idioma` * `validation.invalidDate` = `Fecha no válida` * `verification.errors.countryNotSupported` = `Solicitud rechazada. País no admitido para EKYC.` * `verification.errors.exactly10Characters` = `Debe tener exactamente 10 caracteres` * `verification.errors.fieldRequiredDynamic` = `{{fieldName}} es necesario` * `verification.errors.idNumRequired` = `Número de identificación nacional obligatorio` * `verification.errors.invalidPostalCodeFixedLength` = `Introduzca un código postal de {{length}} dígitos` * `verification.errors.onlyLettersAndNumbers` = `Sólo se permiten letras y números` * `verification.errors.taxIdRequired` = `Se requiere NIF` * `verification.labels.panNumber` = `Número PAN` * `watchlistForBusiness.title` = `Lista de vigilancia para empresas` ## ✏️ Modified * `aes.confirmSignature.addDocument`: * Old: `Añadir documento` * New: `Cargar documento` * `aes.confirmSignature.fail`: * Old: `Algo salió mal..` * New: `Algo salió mal` * `aes.confirmSignature.subtitle`: * Old: `Se firmarán los siguientes documentos` * New: `Acepte las condiciones que figuran a continuación para completar su firma.` * `aes.confirmSignature.terms1.title`: * Old: `Acepto las condiciones del Centro de Confianza` * New: `Acepto las condiciones del <2>Centro de Confianza` * `aes.confirmSignature.title`: * Old: `Confirme su firma` * New: `Aceptar y firmar` * `aes.confirmSignature.uploadDescription`: * Old: `Formato PDF compatible` * New: `Admite archivos PDF` * `aes.confirmSignature.viewDocument`: * Old: `Ver documento` * New: `Ver` * `documentCapture.review.error.description`: * Old: `Asegúrese de que toda la información del documento es clara y legible.` * New: `Algunas páginas no estaban claras o estaban incompletas. Recupere todas las páginas del documento para continuar.` * `documentCapture.review.error.title`: * Old: `No se puede procesar` * New: `Es necesario recuperar el documento` * `documentCapture.review.tryAgain`: * Old: `Inténtalo de nuevo` * New: `Documento de recaptura` * `manualCapture.ariaLabel`: * Old: `botón de captura manual` * New: `capturar foto` * `manualIdUpload.uploadPassport`: * Old: `Cargar pasaporte` * New: `Pasaporte` * `userData.sex`: * Old: `Sexo` * New: `Género` * `v2.idError.attemptsLeft_other`: * Old: `{{count}} intento restante` * New: `{{count}} intentos restantes` * `verification.errors.maternalSurnameRequired`: * Old: `Se requiere el apellido materno` * New: `El apellido materno es obligatorio` * `verification.errors.surNameRequired`: * Old: `Apellidos son requeridos` * New: `Apellido obligatorio` --- - Path: `release-notes/es-spanish-2` - URL: https://developer.incode.com/release-notes/es-spanish-2/ - Markdown: https://developer.incode.com/release-notes/es-spanish-2.md # ES - Spanish ## 🆕 Added * `common.attemptsRemaining_other` = `{{count}} intentos restantes` * `common.attemptsRemaining_one` = `1 intento restante` * `idv2.capture.processing.errors.wrongSide.back.subtitle` = `Captura del reverso del DNI` * `idv2.capture.processing.errors.wrongSide.front.subtitle` = `Captura de la cara frontal del DNI` * `idv2.needHelp.open` = `Abrir el modal Necesita ayuda` * `notifications.centerFaceV2` = `Asegúrate de alinear la cara dentro de la silueta` * `notifications.cropDescription` = `Por favor, inténtelo de nuevo con su cara centrada en el marco` * `notifications.multipleDescription` = `Asegúrate de que sólo se ve una cara en el encuadre` * `notifications.onFaceAngleV2` = `Alinear la cara dentro de la silueta blanca` * `notifications.portraitDescription` = `Mantén el dispositivo en modo vertical` * `notifications.selfie.manualCaptureButtonLabel` = `Botón de captura manual` * `notifications.selfie.manualCaptureLabel` = `Captura manual activada. Pulse el botón para hacer la foto.` * `notifications.unableToCropDescription` = `Por favor, inténtelo de nuevo con su cara claramente visible` * `retake.titleFrontLabel` = `Revisar la foto de carné delantera` * `selfiev2.manualCapture.instructions` = `Centra tu cara en la silueta y pulsa el botón para capturar` * `tutorial.back.titleLabel` = `Ahora escanea el reverso de tu DNI` * `webviews.step1` = `Ve a "Ajustes" → "Aplicaciones".` * `webviews.step2` = `Buscar la aplicación` * `webviews.step3` = `Permitir cámara` ## ✏️ Modified * `tutorial.back.title`: * Before: `Ahora escanea el <1>reverso de tu ID` * Now: `Ahora escanea el <1>reverso de tu DNI` --- - Path: `release-notes/es-spanish-3` - URL: https://developer.incode.com/release-notes/es-spanish-3/ - Markdown: https://developer.incode.com/release-notes/es-spanish-3.md # ES - Spanish ## 🆕 Added * `errors.dynamicImport.suggestion_one` = `Lo intentaremos de nuevo en {{count}} segundo o puede actualizar manualmente` * `errors.dynamicImport.suggestion_other` = `Lo intentaremos de nuevo en {{count}} segundos o puede actualizar manualmente` * `idv2.commonIssues.firstStep` = `1. Rellena el marco con tu DNI` * `idv2.commonIssues.secondStep` = `2. Pulse el botón` * `verification.labels.gender` = `Género` * `verification.labels.idNum` = `Número nacional de identidad` * `verification.labels.idNum1` = `Número de identificación fiscal` ## ✏️ Modified * `countries.US`: * Before: `EE.UU.` * Now: `USA` * `errors.dynamicImport.failedToLoad`: * Before: `No esperábamos este error, pero estamos tomando nota:` * Now: `No esperábamos este error, pero estamos tomando nota.` * `notifications.selfieCaptureFailed`: * Before: `Error de captura` * Now: `Falló el procesamiento de la selfie` * `notifications.selfieCaptureFailedDescription`: * Before: `No pudimos capturar el selfie` * Now: `Tu selfie será revisada manualmente más tarde` * `notifications.spoof`: * Before: `Error de captura` * Now: `Falló el procesamiento de la selfie` * `notifications.spoofDescription`: * Before: `No pudimos tomar tu selfie. Por favor intenta nuevamente ` * Now: `No pudimos procesar tu selfie. Por favor, intenta de nuevo` * `notifications.spoofDescriptionNoTries`: * Before: `No pudimos capturar selfie.` * Now: `Tu selfie será revisada manualmente más tarde` * `retake.titleBack`: * Before: `Revisa la foto del <1>REVERSO del documento` * Now: `Revisar la foto del DNI` * `retake.titleFront`: * Before: `Revisa la foto del <1>FRENTE del documento` * Now: `Revisar foto de carné FRONTAL` * `retake.titlePassport`: * Before: `Revisión <1>PASAPORTE foto` * Now: `Revisión PASAPORTE foto` * `selfie.spoof`: * Before: `Error de captura` * Now: `Falló el procesamiento de la selfie` * `selfie.spoofDescription`: * Before: `No pudimos tomar tu selfie. Por favor intenta nuevamente` * Now: `No pudimos procesar tu selfie. Por favor, intenta de nuevo` * `tutorial.back.title`: * Before: `Ahora escanea el <1>reverso de tu DNI` * Now: `Ahora escanea el reverso de tu DNI` * `videoSelfie.errors.noInternetConnectionDescription`: * Before: `Espera a que vuelva internet para continuar el proceso o conéctate a una red disponible` * Now: `Espera a que vuelva Internet para continuar el proceso o conéctate a una red disponible.` --- - Path: `release-notes/es-spanish-4` - URL: https://developer.incode.com/release-notes/es-spanish-4/ - Markdown: https://developer.incode.com/release-notes/es-spanish-4.md # ES - Spanish ## 🆕 Added * `documentCapture.skip` = `Omitir este paso` * `idv2.capture.processing.uploading` = `Cargando...` * `idv2.deepsightPermissions.subtitle` = `permiso` * `idv2.deepsightPermissions.title` = `Permitir cámara y movimiento ` * `idv2.permissions.allowPermissionsV2` = `Permitir permisos de cámara` * `idv2.permissions.inOrderToCompleteTheProcess` = `para completar el proceso` * `idv2.unacceptedId.acceptedDocuments` = `Documentos aceptados para:` * `idv2.unacceptedId.attemptsLeft_one` = `({{count}} intento a la izquierda)` * `idv2.unacceptedId.attemptsLeft_other` = `({{count}} quedan intentos)` * `idv2.unacceptedId.birthCertificate` = `Partida de nacimiento` * `idv2.unacceptedId.changeMethod` = `Cambiar el método de verificación` * `idv2.unacceptedId.currency` = `Moneda` * `idv2.unacceptedId.driversLicense` = `Permiso de conducir` * `idv2.unacceptedId.federalId` = `Identificación federal` * `idv2.unacceptedId.identificationCard` = `Tarjeta de identificación` * `idv2.unacceptedId.identificationCardDescription` = `Sólo INE emitido a partir de 2017.` * `idv2.unacceptedId.medicalCard` = `Tarjeta sanitaria` * `idv2.unacceptedId.military` = `Militar` * `idv2.unacceptedId.multipleNationalities` = `¿Múltiples nacionalidades?` * `idv2.unacceptedId.noDocuments` = `No se aceptan documentos para este país` * `idv2.unacceptedId.other` = `Otros` * `idv2.unacceptedId.passport` = `Pasaporte` * `idv2.unacceptedId.passportDescription` = `Solo pasaportes expedidos en 2014.` * `idv2.unacceptedId.permit` = `Permiso` * `idv2.unacceptedId.residenceDocument` = `Documento de residencia` * `idv2.unacceptedId.seeDifferentCountry` = `Ver un país diferente` * `idv2.unacceptedId.taxIdentification` = `Identificación fiscal` * `idv2.unacceptedId.travelDocument` = `Documento de viaje` * `idv2.unacceptedId.tribalIdentification` = `Identificación tribal` * `idv2.unacceptedId.tryAgain` = `Inténtalo de nuevo` * `idv2.unacceptedId.unknown` = `Desconocido` * `idv2.unacceptedId.unknownCountry` = `Desconocido` * `idv2.unacceptedId.vehicleRegistration` = `Matriculación de vehículos` * `idv2.unacceptedId.visa` = `Visa` * `idv2.unacceptedId.voterIdentification` = `Identificación de los votantes` * `idv2.unacceptedId.weaponLicense` = `Licencia de armas` * `notifications.accessDenied` = `Acceso denegado` * `notifications.accessDeniedDescription` = `No hemos podido procesar tu selfie. Inténtalo de nuevo` * `notifications.lowQualityImage` = `Condiciones de baja calidad` * `notifications.lowQualityImageDescription` = `Quédese quieto para la captura, y asegúrese de que su cara es clara y visible` * `notifications.noAttemptsRemaining` = `No quedan intentos` * `videoSelfie.processingStep` = `Procesando...` ## ✏️ Modified * `idv2.capture.processing.errors.unacceptable.title`: * Old: `No se acepta el tipo de identificación` * New: `Documento de identidad no aceptado` * `idv2.permissions.denied.cameraAllow`: * Old: `Pulse Cámara → Permitir` * New: `Pulse Cámara Permitir` * `idv2.permissions.denied.siteSettings`: * Old: `Ajustes → Ajustes del sitio` * New: `Ajustes Ajustes del sitio` --- - Path: `release-notes/es-spanish-5` - URL: https://developer.incode.com/release-notes/es-spanish-5/ - Markdown: https://developer.incode.com/release-notes/es-spanish-5.md # ES - Spanish ## 🆕 Added * ` desktop.idv2.digitalIdUpload.successfullyProcessed` = `Procesado con éxito.` * `email.verified` = `Correo electrónico verificado.` * `email.verify` = `Verifique su correo electrónico` * `email.willSendCode` = `Te enviaremos un código para asegurarnos de que es tuyo` * `geolocationv2.addressBar` = `En la barra de direcciones, pulse sobre AA` * `geolocationv2.allowLocationAccess` = `Permitir el acceso a la ubicación` * `geolocationv2.allowUsing` = `Seleccione Permitir durante el uso` * `geolocationv2.appsBrowser` = `Ir a Apps Tu navegador` * `geolocationv2.appsChrome` = `Ir a Aplicaciones Chrome` * `geolocationv2.appsFirefox` = `Ir a Aplicaciones Firefox` * `geolocationv2.appsOpera` = `Ir a Apps Opera` * `geolocationv2.choosePermissions` = `Elija Preguntar la próxima vez o Mientras usa la aplicación` * `geolocationv2.determineLocation` = `Necesitamos determinar su ubicación actual` * `geolocationv2.goBackSafari` = `Volver a Ajustes Safari` * `geolocationv2.instructions.allowLocation` = `Permitir permisos de ubicación` * `geolocationv2.locationOn` = `Asegúrate de que los servicios de localización están activados` * `geolocationv2.openSettings` = `Abrir la configuración` * `geolocationv2.openSettingsAndroid` = `Abre los ajustes de tu dispositivo` * `geolocationv2.permissionsLocation` = `Toque Permisos Ubicación` * `geolocationv2.privacySecurity` = `Privacidad y seguridad abiertas` * `geolocationv2.refreshPage` = `Actualizar página` * `geolocationv2.returnAndRefresh` = `Volver aquí y Actualizar página` * `geolocationv2.scrollDownChrome` = `Desplácese hacia abajo y pulse Chrome` * `geolocationv2.scrollDownFirefox` = `Desplázate hacia abajo y pulsa Firefox` * `geolocationv2.scrollDownOpera` = `Desplácese hacia abajo y pulse Opera` * `geolocationv2.skip` = `Omitir este paso` * `geolocationv2.tapLocation` = `Ubicación del grifo` * `geolocationv2.tapLocationAllow` = `Pulse Ubicación y seleccione Permitir` * `geolocationv2.tapSettings` = `Toque Configuración del sitio web
          Permitir permisos de ubicación
          ` * `idv2.capture.notifications.expiredId` = `Documento de identidad caducado` * `idv2.capture.notifications.useDifferent` = `Utilizar un ID diferente` * `idv2.capture.processing.processing` = `Procesando...` * `idv2.capture.processing.scanFront` = `Escanea el frente` * `idv2.capture.processing.successBackSubtitleScanFront` = `Ahora capturemos el frente` * `idv2.chooser.chooseHowToVerifyTitle` = `Elija cómo verificar` * `idv2.chooser.digitalIdUploadButtonTitle` = `Cargar ID digital` * `idv2.chooser.manualUploadButtonTitle` = `Cargar ID` * `idv2.digitalIdUpload.analyzing` = `Analizar...` * `idv2.digitalIdUpload.digitalIdUploadButtonTitle` = `Cargar DNI digital` * `idv2.digitalIdUpload.errorScreen.scanId` = `Escanee su DNI` * `idv2.digitalIdUpload.loadingSuccess.letsContinue` = `Continuemos` * `idv2.digitalIdUpload.reviewScreen.description` = `Asegúrese de que se trata del archivo correcto antes de continuar con el proceso de verificación.` * `idv2.digitalIdUpload.reviewScreen.replaceButton` = `Sustituir archivo` * `idv2.digitalIdUpload.reviewScreen.replaceFileButton` = `Continúe en` * `idv2.digitalIdUpload.reviewScreen.title` = `Revise su documento` * `idv2.digitalIdUpload.screenDescription` = `Un archivo PDF o una foto emitida por el gobierno con sus datos, foto y un código QR` * `idv2.digitalIdUpload.screenTitle` = `Cargue su DNI digital` * `idv2.digitalIdUpload.supportedFileTypesCopy` = `Archivo PDF o foto JPG, PNG` * `idv2.digitalIdUpload.unknownDocumentTypeScreen.errorTitle` = `No se ha podido verificar su ID` * `idv2.digitalIdUpload.wrongDocumentType` = `Documento de identidad no aceptado` * `idv2.digitalIdUpload.wrongDocumentTypeScreen.errorSubtitle` = `Utilice un ID diferente de la lista aceptada:` * `idv2.digitalIdUpload.wrongDocumentTypeScreen.errorTitle` = `Documento de identidad no aceptado` * `idv2.digitalIdUpload.wrongDocumentTypeScreen.tryAgainButton` = `Inténtalo de nuevo` * `idv2.manualUploadLoading.subtitle` = `Cargar el archivo` * `idv2.permissions.denied.chrome.fifthStep` = `A continuación, actualice la página` * `idv2.permissions.denied.chrome.firstStep` = `En la parte superior izquierda de la página web, haga clic en el candado` * `idv2.permissions.denied.chrome.fourthStep` = `Haga clic en él y seleccione Permitir` * `idv2.permissions.denied.chrome.secondStep` = `Se abrirá un pequeño menú` * `idv2.permissions.denied.chrome.thirdStep` = `Buscar cámara` * `idv2.permissions.denied.firefox.fifthStep` = `A continuación, actualice la página` * `idv2.permissions.denied.firefox.firstStep` = `Haz clic en la cámara o en el icono del candado ` * `idv2.permissions.denied.firefox.fourthStep` = `Haga clic en él y seleccione Permitir` * `idv2.permissions.denied.firefox.secondStep` = `Se abrirá un menú` * `idv2.permissions.denied.firefox.thirdStep` = `Buscar cámara` * `idv2.permissions.denied.opera.fifthStep` = `A continuación, actualice la página` * `idv2.permissions.denied.opera.firstStep` = `Haga clic en el icono del candado ` * `idv2.permissions.denied.opera.fourthStep` = `Haga clic en él y seleccione Permitir` * `idv2.permissions.denied.opera.secondStep` = `Se abrirá un pequeño menú` * `idv2.permissions.denied.opera.thirdStep` = `Buscar cámara` * `idv2.permissions.denied.safari.fifthStep` = `Haga clic en él y seleccione Permitir` * `idv2.permissions.denied.safari.firstStep` = `En la parte superior izquierda, haga clic en Safari` * `idv2.permissions.denied.safari.fourthStep` = `Busca donde pone Cámara` * `idv2.permissions.denied.safari.secondStep` = `Haga clic en Configuración de este sitio web...` * `idv2.permissions.denied.safari.sixthStep` = `A continuación, actualice la página` * `idv2.permissions.denied.safari.thirdStep` = `Aparecerá un cuadro` * `nameCapturev2.title` = `Introduzca su nombre` * `nameCapturev2.verified` = `¡Nombre verificado!` * `otp.didntReceive` = `¿No ha recibido el código?` * `otp.enterCodeEmail` = `Introduce el código que te hemos enviado a tu correo electrónico` * `otp.errorv2` = `Código caducado, inténtelo de nuevo` * `otp.resendCode` = `Reenviar código` * `otp.resendCountdown` = `Reenvío de código en {{time}}s` * `redirect.didntReceive` = `¿No has recibido el enlace?` * `redirect.enterPhoneNumber` = `Introduzca su número de teléfono para recibir un enlace para verificar a través de SMS` * `redirect.linkSent` = `Enlace enviado.` * `redirect.phishingResistance.explanation1` = `Necesitarás un documento de identidad válido y un selfie.` * `redirect.phishingResistance.recommendedBrowser` = `Recomendamos utilizar Safari en iOS y Chrome en Android.` * `redirect.phishingResistance.titleClient` = `Verifique su identidad` * `redirect.resend` = `Vuelva a enviar` * `redirect.scanQRTitle` = `Escanear QR` * `redirect.scanQrv2` = `Escanee el código QR para verificarlo en su dispositivo móvil.` * `redirect.sendLinkSms` = `Enviar enlace por SMS` * `redirect.sendSms` = `Enviar SMS` ## ✏️ Modified * `videoSelfie.tutorial.scanFrontId`: * Old: `Escanear el anverso del DNI` * New: `Escanear el frente del DNI` --- - Path: `release-notes/es-spanish-6` - URL: https://developer.incode.com/release-notes/es-spanish-6/ - Markdown: https://developer.incode.com/release-notes/es-spanish-6.md # ES - Spanish ## 🆕 Added * `curp.continue` = `Continuar` * `curp.dontHave` = `No tengo CURP` * `curp.enterCurp` = `Introduzca su CURP` * `curp.generate` = `Genera tu CURP` * `curp.generateCta` = `Generar` * `curp.labels.birthState` = `Estado de nacimiento` * `curp.labels.dob` = `Fecha de nacimiento` * `curp.labels.femaleV2` = `Mujer` * `curp.labels.firstLast` = `Nombre Apellido` * `curp.labels.firstName` = `Nombre` * `curp.labels.genderV2` = `Género` * `curp.labels.maleV2` = `Hombre` * `curp.labels.other` = `No binario/Otro` * `curp.labels.secondLast` = `Segundo apellido` * `curp.placeholder.curp` = `Su CURP` * `curp.placeholder.firstLast` = `Su nombre y apellidos` * `curp.placeholder.firstName` = `Su nombre` * `curp.placeholder.gender` = `Elige género` * `curp.placeholder.secondLast` = `Su segundo apellido` * `curp.placeholder.state` = `Seleccionar estado` * `curp.status.checkInfo` = `Compruebe la información introducida` * `curp.status.confirm` = `Confirme su CURP` * `curp.status.couldntGenerate` = `No se ha podido generar CURP` * `curp.status.edit` = `Editar información` * `curp.status.generating` = `Generar CURP...` * `curp.status.notVerified` = `CURP no verificado` * `curp.status.tryAgain` = `Inténtalo de nuevo` * `curp.status.verified` = `¡CURP verificado!` * `curp.status.verifying` = `Verificando su CURP...` * `faceMatch.continue` = `Continúe en` * `faceMatch.facesNoMatch` = `Las caras no coinciden` * `faceMatch.firstId` = `Primera identificación` * `faceMatch.id` = `ID` * `faceMatch.matched` = `¡Emparejado!` * `faceMatch.matching` = `Verificación de la identidad` * `faceMatch.processing` = `Procesando...` * `faceMatch.secondId` = `Segunda identificación` * `faceMatch.selfie` = `Selfie` * `face.tutorial.ageAssuranceStartCapture` = `Verificar la edad` * `face.tutorial.ageAssuranceSubtitle` = `Su imagen no se almacenará ni se compartirá con terceros para proteger su intimidad.` * `face.tutorial.ageAssuranceTitle` = `Hazte un selfie para verificar tu edad` * `face.tutorial.autoCapture` = `Quédate quieto, el selfie se tomará automáticamente` * `home.start` = `Inicio` * `idv2.ageVerificationPage.ageVerification` = `Verificación de edad` * `idv2.ageVerificationPage.Continue` = `Continuar` * `idv2.ageVerificationPage.showYourIdAndScanIt` = `Muestra tu ID y escanéala` * `idv2.ageVerificationPage.TheRestOfYourInformationWillBeDeletedToEnsureYourPrivacy` = `El resto de tu información será eliminada para asegurar tu privacidad` * `idv2.ageVerificationPage.weNeedToScanYourIDToKnowYourAge` = `Necesitamos escanear tu ID para saber tu edad` * `idv2.ageVerificationPage.weOnlyUseTheDateOfBirthInformation` = `Solo utilizamos la información de la fecha de nacimiento` * `idv2.barCodeDetection.processingSubtitle` = `Estamos verificando su identidad` * `idv2.barCodeDetection.processingTitle` = `Espera un segundo...` * `idv2.capture.processing.verifying` = `Verificando...` * `idv2.digitalIdUpload.continue` = `Continuar` * `idv2.digitalIdUpload.errorScreen.pleaseTryScanning` = `Intenta escanear un documento diferente` * `idv2.digitalIdUpload.errorScreen.thisIdMustBeScanned` = `Esta identificación debe escanearse` * `idv2.digitalIdUpload.reviewScreen.continue` = `Continuar` * `idv2.digitalIdUpload.successfullyProcessed` = `Procesado con éxito.` * `onboarding.errors.invalidQRuuid.message` = `Parece que tu URL no es válida o ha caducado` * `onboarding.errors.invalidQRuuid.title` = `Su URL no es válida` * `otp.enterCodeSMS` = `Introduzca el código que le hemos enviado por SMS` * `phone.verify` = `Verifique su número de teléfono` * `redirect.resendCountdown` = `Reenviar enlace en {{time}}s` * `verification.failureTitle` = `Algo salió mal` * `verification.labels.addressDetailsSection` = `Dirección` * `verification.labels.dlDetailsSection` = `Datos del permiso de conducir` * `verification.placeholder.email` = `email@example.com` * `verification.placeholder.firstName` = `Su nombre` * `verification.placeholder.lastName` = `Su apellido` * `verification.placeholder.maternalSurname` = `Su apellido materno` * `verification.placeholder.middleName` = `Su segundo nombre` * `verification.placeholder.stateCode` = `Por ejemplo {{states}}` * `verification.placeholder.surname` = `Su apellido` * `verification.submitButton` = `Continúe en` * `verification.successTitle` = `eKYC verificado` * `verification.tryAgain` = `Inténtalo de nuevo` ## ✏️ Modified * `idv2.chooser.chooseHowToVerifyTitle`: * Old: `Elija cómo verificar` * New: `Seleccione cómo verificar` * `idv2.digitalIdUpload.reviewScreen.title`: * Old: `Revise su documento` * New: `Revisar documento` * `idv2.digitalIdUpload.screenDescription`: * Old: `Un archivo PDF o una foto emitida por el gobierno con sus datos, foto y un código QR` * New: `Un archivo PDF emitido por el gobierno con sus datos, foto y un código QR` * `idv2.digitalIdUpload.screenTitle`: * Old: `Cargue su DNI digital` * New: `Cargar ID digital` * `otp.resendCountdown`: * Old: `Reenvío de código en {{time}}s` * New: `Reenvío de código en {{time}}s` * `verification.labels.state`: * Old: `Código estatal (por ejemplo {{states}}}}` * New: `Código del Estado` --- - Path: `release-notes/es-spanish-7` - URL: https://developer.incode.com/release-notes/es-spanish-7/ - Markdown: https://developer.incode.com/release-notes/es-spanish-7.md # ES - Spanish ## 🆕 Added * `commonIssues.blurPresent` = `Desenfoque presente` * `commonIssues.blurPresentDescription` = `Aleja o acerca el ID al teléfono hasta que la imagen esté enfocada` * `commonIssues.glarePresent` = `Resplandor presente` * `commonIssues.glarePresentDescription` = `Inclina el ID ligeramente hacia arriba o hacia abajo para minimizar el reflejo` * `commonIssues.notReadable` = `La información no es legible` * `commonIssues.notReadableDescription` = `Minimiza el movimiento de la cámara sujetando el teléfono con firmeza` * `encryptionLabel.encryptedPhotos` = `Todos los datos están encriptados` * `home.goToSettings` = `Ir a la configuración` * `idv2.backTutorial.disclaimer` = `La foto se tomará automáticamente` * `idv2.backTutorial.subtitle` = `Asegúrate de que tu ID sea legible` * `idv2.backTutorial.title` = `Muestra el reverso de tu ID` * `idv2.capture.allDataIsEncrypted` = `Toda la data está encriptada` * `idv2.permissions.allowV2` = `Permitir` * `idv2.permissions.subtitleV2` = `Esto permite a la cámara realizar la captura necesaria para la verificación` * `idv2.reverseFlipAnimation.title` = `Muestre el anverso de su documento de identidad` * `notifications.faceOccluded` = `Rostro cubierto` * `notifications.faceOccludedDescription` = `Asegúrate de que tu cara sea clara y visible.` * `selfiev2.manualCapture.captureButton` = `Tomar foto` ## ✏️ Modified * `commonIssues.takeManually`: * Old: `Haz la foto manualmente` * New: `Hacer la foto manualmente` * `face.tutorial.autoCapture`: * Old: `Quédate quieto, el selfie se tomará automáticamente` * New: `No te muevas, la selfie se tomará automáticamente` * `face.tutorial.subtitle`: * Old: `Esto te permite iniciar sesión utilizando tu cara.` * New: `Mantén una expresión neutra, busca una luz equilibrada y quítate las gafas y los sombreros` * `idv2.capture.autoCapture`: * Old: `La foto se tomará automáticamente` * New: `La captura se realizará automáticamente` * `idv2.capture.fillFrameBack`: * Old: `Rellena el marco con tu identificación dorsal` * New: `Enmarca el reverso de tu DNI` * `idv2.capture.fillFrameFront`: * Old: `Rellena el marco con tu DNI` * New: `Encuadre el anverso de su DNI` * `idv2.permissions.allowPermissionsV2`: * Old: `Permitir permisos de cámara` * New: `Permitir el acceso a la cámara` * `idv2.permissions.dontAllow`: * Old: `No permita` * New: `No permita que` * `idv2.permissions.learnMorePage.instructions.1`: * Old: `Sólo utilizamos la cámara para capturar su identificación para la verificación segura` * New: `Sólo utilizamos la cámara para el proceso de verificación.` * `idv2.permissions.learnMorePage.instructions.2`: * Old: `Ayuda a verificar la autenticidad de los documentos y a prevenir el fraude de identidad.` * New: `El proceso de verificación garantiza que usted es quien dice ser.` * `idv2.tutorial.autoCapture`: * Old: `La foto se tomará automáticamente` * New: `La captura se realizará automáticamente` * `idv2.tutorial.startScan`: * Old: `Escaneemos` * New: `Escanear` * `idv2.tutorial.title`: * Old: `Escanee su ID` * New: `Muestre el anverso de su documento de identidad` * `notifications.selfieCaptureFailedDescription`: * Old: `Tu selfie será revisada manualmente más tarde` * New: `Se alcanzó el número máximo de intentos` * `notifications.spoofDescriptionNoTries`: * Old: `Tu selfie será revisada manualmente más tarde` * New: `Se alcanzó el número máximo de intentos` --- - Path: `release-notes/es-spanish-8` - URL: https://developer.incode.com/release-notes/es-spanish-8/ - Markdown: https://developer.incode.com/release-notes/es-spanish-8.md # ES - Spanish ## 🆕 Added * `ekyb.addressDetails` = `Dirección` * `ekyb.continue` = `Continúe en` * `ekyb.error.title` = `Algo salió mal` * `ekyb.processing` = `Tratamiento` * `ekyb.success` = `Éxito` * `ekyb.tryAgain` = `Inténtalo de nuevo` * `idv2.capture.manualCapture.modeSwitchAriaAnnouncement` = `Ahora utiliza el modo de captura manual. Pulse el botón para capturar la foto.` * `idv2.capture.v2.autoCapture` = `La foto se tomará automáticamente` * `idv2.capture.v2.fillFrameBack` = `Rellena el marco con tu identificación dorsal` * `idv2.capture.v2.fillFrameFront` = `Rellena el marco con tu DNI` * `idv2.tutorial.v2.autocapture` = `La foto se tomará automáticamente` * `idv2.tutorial.v2.title` = `Escanee su DNI` * `otp.groupLabel` = `{{charLength}}Código de verificación de -dígitos` * `v2.capture.label` = `Todas las fotos están encriptadas` * `v2.idError.attemptsLeft_one` = `{{count}} intento restante` * `v2.idError.attemptsLeft_other` = `{{count}} intento restante` * `v2.idSuccess.subtitle` = `Ahora vamos a capturar la parte de atrás` * `v2.idSuccess.subtitleBack` = `Continuemos` * `v2.idSuccess.title` = `Procesado con éxito.` * `v2.selfie.camera.loading` = `Cargando...` ## ✏️ Modified * `idv2.capture.notifications.showFront.description`: * Old: `Dale la vuelta a tu ID para mostrar su reverso` * New: `Dale la vuelta a tu DNI para mostrar su anverso` --- - Path: `release-notes/es-spanish-9` - URL: https://developer.incode.com/release-notes/es-spanish-9/ - Markdown: https://developer.incode.com/release-notes/es-spanish-9.md # ES - Spanish ## 🆕 Added * `biometricConsent.subtitle` = `Su verificación es impulsada por Incode. Para cumplir la normativa estatal, necesitamos su consentimiento para el procesamiento biométrico.` * `documentCapture.camera.subtitle` = `Asegúrate de que está totalmente visible y pulsa el botón` * `documentCapture.camera.title` = `Muestre su documento completo` * `documentCapture.commonIssues.dirtyPresent` = `El objetivo de la cámara está sucio` * `documentCapture.commonIssues.dirtyPresentDescription` = `Limpia el objetivo de tu cámara para obtener una imagen más nítida.` * `documentCapture.commonIssues.farPresent` = `El documento está demasiado lejos o fuera de cuadro` * `documentCapture.commonIssues.farPresentDescription` = `Asegúrese de que todos los bordes son visibles en la pantalla.` * `documentCapture.commonIssues.foldedIdPresent` = `El documento está plegado` * `documentCapture.commonIssues.foldedIdPresentDescription` = `Aplana el documento y asegúrate de que está completamente abierto y recto.` * `documentCapture.commonIssues.shadowPresent` = `Sombras sobre el documento` * `documentCapture.commonIssues.shadowPresentDescription` = `Desplázate a una zona más luminosa y evita proyectar sombras sobre tu documento.` * `documentCapture.errors.fileSizeExceed` = `El archivo supera el tamaño máximo de {{maxSize}}` * `documentCapture.review.analyzing` = `Analizar...` * `documentCapture.review.continue` = `Continúe en` * `documentCapture.review.error.description` = `Asegúrese de que toda la información del documento es clara y legible.` * `documentCapture.review.error.title` = `No se puede procesar` * `documentCapture.review.errorTitle` = `Algo salió mal` * `documentCapture.review.errorUpload` = `Se ha producido un error al procesar su documento.` * `documentCapture.review.replace` = `Sustituir` * `documentCapture.review.retake` = `Retomar` * `documentCapture.review.subtitleCaptured` = `Asegúrese de que todo el documento se ajusta a la vista y de que el texto es legible.` * `documentCapture.review.subtitleImageUpload` = `Asegúrese de que todo el documento se ajusta a la vista y de que el texto es legible.` * `documentCapture.review.subtitlePdfUpload` = `Asegúrese de haber seleccionado el archivo correcto antes de continuar con el proceso de verificación.` * `documentCapture.review.successTitle` = `Procesado con éxito.` * `documentCapture.review.titleCaptured` = `Revise su documento` * `documentCapture.review.titleImageUpload` = `Revisar la foto seleccionada` * `documentCapture.review.titlePdfUpload` = `Revise su documento` * `documentCapture.review.tryAgain` = `Inténtalo de nuevo` * `documentCapture.review.uploading` = `Cargando...` * `documentCapture.tutorial.captureButton` = `Capturar documento` * `documentCapture.tutorial.chooseFile` = `Elegir dispositivo` * `documentCapture.tutorial.multiPageDocument.subtitle` = `Haz una foto de la página siguiente para continuar.` * `documentCapture.tutorial.multiPageDocument.title` = `Página siguiente` * `documentCapture.tutorial.skipButton` = `Omitir este paso` * `documentCapture.tutorial.subtitle` = `Haz una foto o sube un PDF, JPG o PNG` * `documentCapture.tutorial.takePhoto` = `Tomar foto` * `documentCapture.tutorial.title` = `Verifique su documento` * `documentCapture.tutorial.uploadButton` = `Cargar documento` * `documentCapture.tutorial.uploadDocument` = `Cargar documento` * `ekyb.error.USTaxId` = `NIF no válido. El NIF debe tener 9 dígitos.` * `idv2.ageVerificationPage.step1of3` = `Paso 1 de 3: ` * `idv2.ageVerificationPage.step2of3` = `Paso 2 de 3: ` * `idv2.ageVerificationPage.step3of3` = `Paso 3 de 3: ` * `idv2.chooser.digitalIdButtonTitle` = `Identificación digital` * `idv2.chooser.loadingDigitalWallet` = `Cargando monedero digital...` * `idv2.flipAnimation.titleToFront` = `Muestre el anverso de su documento de identidad` * `idv2.permissions.allowEveryTime` = `Permitir siempre` * `idv2.permissions.allowOnlyWhileUsingTheApp` = `Permitir sólo mientras se utiliza la aplicación` * `idv2.permissions.denied.onDevice` = `en el dispositivo` * `idv2.permissions.denied.opera.appsOpera` = `Aplicaciones Opera` * `idv2.permissions.denied.permissionsCamera` = `Persmisiones Cámara` * `idv2.permissions.denied.persmissionsCamera` = `Persmisiones Cámara` * `idv2.permissions.denied.settingsApp` = `Aplicación Ajustes` * `idv2.permissions.denied.setTo` = `Ajustar a` * `idv2.permissions.denied.sitePermissions` = `Autorizaciones` * `idv2.permissions.denied.sitesAndDownloads` = `Sitios y descargas` * `idv2.tutorial.subtitleBack` = `Asegúrese de que su documento de identidad sea legible` * `idv2.tutorial.v2.titleBack` = `Muestre el reverso de su documento de identidad` * `manualIdUpload.frontRequiredFirst` = `Cargue primero el anverso del documento de identidad` * `manualIdUpload.uploadBackId` = `Cargar el reverso del DNI` * `manualIdUpload.uploadFrontId` = `Cargar anverso del DNI` * `manualIdUpload.uploadPassport` = `Cargar pasaporte` * `notifications.noTries` = `Número máximo de intentos alcanzado` * `selfiev2.autoCapture.defaultAriaInstructions` = `Centra tu cara en el encuadre.` * `selfiev2.capture.title` = `Captura facial` * `verification.errors.ARPostalCodeInvalidFormat` = `Introduzca un código postal argentino válido (formato: A1111AAA)` * `verification.errors.CAPostalCodeInvalidFormat` = `Introduzca un código postal canadiense válido (formato: A1A 1A1).` * `verification.errors.ESPostalCodeInvalidFormat` = `Introduzca un código postal de 5 dígitos` * `verification.errors.UKPostalCodeInvalidFormat` = `Introduzca un código postal válido del Reino Unido.` * `verification.noFormFields` = `No se ha configurado ningún campo para este formulario.` * `watchlistBusiness.businessName` = `Nombre comercial` * `watchlistBusiness.businessNameRequired` = `El campo Nombre de la empresa es obligatorio` * `watchlistBusiness.continue` = `Continuar` * `watchlistBusiness.watchlistForBusiness` = `Lista de vigilancia para empresas` ## ✏️ Modified * `ekyb.continue`: * Old: `Continúe en` * New: `Continuar` * `faceMatch.continue`: * Old: `Continúe en` * New: `Continuar` * `idv2.digitalIdUpload.reviewScreen.replaceFileButton`: * Old: `Continúe en` * New: `Continuar` * `idv2.permissions.denied.cameraAllow`: * Old: `Pulse Cámara Permitir` * New: `Cámara Permitir` * `idv2.permissions.learnMorePage.instructions.1`: * Old: `Sólo utilizamos la cámara para el proceso de verificación.` * New: `Sólo utilizamos la cámara para capturar su identificación para la verificación segura` * `idv2.permissions.learnMorePage.instructions.2`: * Old: `El proceso de verificación garantiza que usted es quien dice ser.` * New: `Ayuda a verificar la autenticidad de los documentos y a prevenir el fraude de identidad.` * `idv2.permissions.subtitleV2`: * Old: `Esto permite a la cámara realizar la captura necesaria para la verificación` * New: `Te permite hacer una foto de tu DNI y de tu cara con fines de verificación.` * `otp.errorv2`: * Old: `Código caducado, inténtelo de nuevo` * New: `Algo salió mal` * `verification.submitButton`: * Old: `Continúe en` * New: `Continuar` --- - Path: `release-notes/flutter-migration-guide` - URL: https://developer.incode.com/release-notes/flutter-migration-guide/ - Markdown: https://developer.incode.com/release-notes/flutter-migration-guide.md # Migration Guide ## Migration to 4.20.0 ### Add the IncodeBridgeCommon CocoaPods source iOS builds now depend on `IncodeBridgeCommon`. Add this source at the top of your `Podfile`. Access to Incode's GitHub org is required; if you do not have it, contact your Incode representative. ```diff source 'https://cdn.cocoapods.org/' source 'git@github.com:Incode-Technologies-Example-Repos/IncdDistributionPodspecs.git' + source 'git@github.com:Incode-Technologies-Example-Repos/IncodeBridgeCommonPodspecs.git' ``` Then run `pod install --repo-update` in the `ios` folder. ### `setTheme` and `setUXConfig` take a JSON string `setTheme(theme:)` and `setUXConfig(jsonConfig:)` now accept a JSON `String` instead of `Map`. ```dart import 'dart:convert'; // Before await IncodeOnboardingSdk.setTheme(theme: { 'primaryColor': '#0000FF', }); await IncodeOnboardingSdk.setUXConfig(jsonConfig: { 'showProgressBar': true, }); // After await IncodeOnboardingSdk.setTheme( theme: jsonEncode({ 'primaryColor': '#0000FF', }), ); await IncodeOnboardingSdk.setUXConfig( jsonConfig: jsonEncode({ 'showProgressBar': true, }), ); ``` You can also pass a JSON file's contents directly. ### Removed and added parameters * The `waitForTutorials` parameter has been removed from the `init()` method. Configure tutorials per module with `showTutorials` instead: for example, `flowConfig.addIdScan(showTutorials: true)`. See [Modules](./flutter-modules). ### Added `IncodeSdkInitError` codes `IncodeSdkInitError` now includes `configError` and `invalidInitParams` in addition to `simulatorDetected`, `testModeEnabled`, and `unknown`. Update any exhaustive `switch` on the enum to handle the new cases, or keep a `default`. `onError` continues to receive the error **code** string; a human-readable detail may also be present in the native payload as `message`. ### Minimum Kotlin version raised to 2.2.x The Android SDK is compiled with Kotlin `2.2.21`. Any module that compiles Kotlin source with the SDK on its classpath must use Kotlin Gradle plugin `2.2.21` or higher. ```groovy plugins { id 'org.jetbrains.kotlin.android' version '2.2.21' } ``` ### Add required OkHttp packaging exclusion Add the following exclusion to avoid duplicate-resource packaging collisions: ```groovy android { packaging { resources { excludes += ['META-INF/versions/9/OSGI-INF/MANIFEST.MF'] } } } ``` ### Upgrade compileSdk / AGP / Gradle wrapper ```groovy compileSdk 36 ``` Use Android Gradle Plugin `8.9.1` or higher and Gradle `8.14.5` or higher. ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.5-bin.zip ``` ### Coroutines floor If your app pins coroutines explicitly, use: ```groovy implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0' ``` ## Migration to 4.19.0 ### Removed and renamed parameters * The `disableJailbreakDetection` parameter has been removed from the `init()` method, and has no replacement. If you set it anywhere, remove it; the code will not compile until you do. * The `IncodeSdkFlowError`'s `jailbreakDetected` error code has been replaced with `integrityCompromised`. ## Migration to 4.18.0 ### Renamed neutral and black color palette tokens on Android The `neutral` and `black` keys in theme's `colorPalette` have been renamed: * `neutral` -> `neutralLight` * `black` -> `neutralDark` If you provided the theme via a JSON config, rename the keys inside `colorPalette`: ```diff "colorPalette": { + "neutralLight": "#ffffff", - "neutral": "#ffffff", + "neutralDark": "#000000", - "black": "#000000", "brand50": "#e5f0ff", ... "positive500": "#189F60", "positive600": "#189F60", "positive800": "#0C5030" } ``` Theme JSON that still uses the old neutral / black keys will silently fall back to the defaults (#FFFFFF and #000000), because unknown keys are ignored during parsing. Update your JSON to use the new keys to keep your customizations applied. ## Migration to 4.17.0 ### Required `type` parameter in `MLConsent` module The `type` parameter of `MLConsent` module is now required. Previously, omitting it on iOS caused the `MLConsent` screen to be skipped silently while the module resolved successfully. Update existing calls to pass a `MLConsentType`: ```diff - flowConfig.addMLConsent(); + flowConfig.addMLConsent(type: MLConsentType.gdpr); ``` Valid values are `MLConsentType.gdpr` and `MLConsentType.us`. ### Changed the default values of `faceMaskCheck`, `eyesClosedCheck`, `headCoverCheck` and `lensesCheck` parameters in SelfieScan and `FaceAuthentication` modules The default values for the `faceMaskCheck`, `eyesClosedCheck`, `headCoverCheck` and `lensesCheck` parameters in `SelfieScan` and `FaceAuthentication` modules have been changed from `false` to `true`. If you did not previously configure these flags, they will now default to `true` during face capture. To preserve the previous behavior, explicitly disable these flags. ### SQLCipher attribution required if you ship an open-source licenses screen on Android Local Room databases used by the SDK are now encrypted at rest with [SQLCipher for Android](https://github.com/sqlcipher/sqlcipher-android), distributed under a BSD-style license. The license requires consumers that redistribute binaries (i.e. your application) to reproduce its copyright notice "in the documentation and/or other materials provided with the distribution". If your application includes an "Open Source Licenses" screen, please add the SQLCipher notice listed in [Licenses](./android-licenses). No code change is needed if you do not ship such a screen. ## Migration to 4.15.0 ### Removed localization keys on iOS * Removed localization keys - `incdOnboarding.nameInfo.lastnamePlaceholder` - `incdOnboarding.ccv.invalidCCV` * Renamed localization keys: - `incdOnboarding.email.title` -> `incdOnboarding.userInformation.email.title` - `incdOnboarding.email.invalidEmail` -> `incdOnboarding.userInformation.email.wrongFormat` - `incdOnboarding.ccv.title` -> `incdOnboarding.userInformation.securityCode.title` - `incdOnboarding.nameInfo.title` -> `incdOnboarding.userInformation.fullName.title` - `incdOnboarding.nameInfo.subtitle` -> `incdOnboarding.userInformation.fullName.subtitle` - `incdOnboarding.nameInfo.namePlaceholder` -> `incdOnboarding.userInformation.fullName.placeholder` - `incdOnboarding.nameInfo.continue` -> `incdOnboarding.userInformation.continue` - `incdOnboarding.ekyc.input.label.fillYourCredentials` -> `incdOnboarding.ekyc.input.title` ## Migration to 4.14.0 ### Removed parameters * Removed `disableHookDetection`, `disableEmulatorDetection`, `disableRootDetection`, `disableVirtualEnvironmentDetection` parameters from `init` method. * Removed `simulatorDetected`, `rootDetected`, `hookDetected`, `virtualEnvDetected` from `IncodeSdkFlowError`. ### Color palette changes on Android If you previously customized the application appearance by updating these colors from the color palette: ```json { "colorPalette": { "negative500": "#FF5A5F", "negative600": "#E71111", "positive500": "#189F60", "positive600": "#189F60" } } ``` These keys have now been migrated to the following values: * `negative500` -> `negative400` * `negative600` -> `negative500` * `positive500` -> `positive400` * `positive600` -> `positive500` The mentioned colors are used for the following Color Modes: * `Icon/Status/Negative` * `Icon/Status/Positive` * `Surface/Status/Positive` * `Border/Status/Negative Static` * `Border/Status/Positive Static` ### `ID Capture` V2 - Error Screen Customization on Android **Wrong document side customization:** If you previously customized the `Wrong document side` error screen, add the following new string resources: **Add these strings:** ```xml Capture the front side of the ID Capture the back side of the ID ``` **Previous string:** ```xml You’ve scanned the wrong document side. Please scan your document again. ``` This string is no longer used. **No internet connection customization:** If you previously customized the `No internet connection` error screen, add the following new string resource: **Add this string:** ```xml No internet connection ``` **Previous string:** ```xml There was a problem ``` The previously used string is still in use for other error screens and should be kept in your resources. **Retry button customization:** The retry button is now customized using a different string resource: ```xml Refresh ``` **Previous string:** ```xml Retry ``` The previously used string is still in use for other error screens and should be kept in your resources. ### `Selfie` V2 - Error Screen Customization on Android **No internet connection customization:** If you previously customized the `No internet connection` error screen, add the following new string resource: **Add this string:** ```xml No internet connection ``` **Previous string:** ```xml There was a problem ``` The previously used string is still in use for other error screens and should be kept in your resources. ### String Customization on iOS Removed localization key `incdOnboarding.curp.add.generate` Renamed localization keys: `incdOnboarding.curp.generation.last.name.placeholder` -> `incdOnboarding.curp.generation.first.last.name.placeholder` `incdOnboarding.curp.generation.name.placeholder` -> `incdOnboarding.curp.generation.first.name.placeholder` #### Changes in behavior for device environment detection on Android The behavior when detecting device environment vulnerabilities has changed: * **Hook or virtual environment detection**: Detecting hook or virtual environment vulnerabilities in the SDK triggers a native crash, which cannot be caught or handled by application code, resulting in immediate app termination. * **Emulator and root detection**: The flow is not aborted when emulator and root checks are detected. The onboarding process continues normally. ### Expected crashes when running in a virtual environment on Android It is expected that the app crashes with the following stacktraces when a virtual environment is used. For example: ``` java.lang.NullPointerException at com.incode.welcome_sdk.ThemeConfiguration$Builder.setLabelSmallStyle(SourceFile:1066) at com.incode.welcome_sdk.f.c(SourceFile:150) at com.incode.welcome_sdk.data.local.m.as(SourceFile:22) at com.incode.welcome_sdk.IncodeWelcome.startOnboardingSection(SourceFile:18) ``` ``` java.lang.NullPointerException: Attempt to get length of null array at com.incode.welcome_sdk.data.IncodeWelcomeRepository.d(SourceFile:320) at com.incode.welcome_sdk.data.IncodeWelcomeRepository.i(SourceFile:214) ``` ### `Selfie` V2 - No Internet Error Screen Retry Button Change on Android **Retry button customization:** The retry button label shown on the Selfie Scan no internet error screen now uses a dedicated string resource: ```xml Refresh ``` **Previous string:** ```xml Try again ``` If you override `onboard_sdk_try_again` to customize the retry button on the no internet screen, you must now override `onboard_sdk_face_scan_retry` instead. The `onboard_sdk_try_again` string is still used for other retry scenarios. ### `Selfie` V2 - Capture-Only Mode Success Screen Text Change on Android **Success label customization:** In capture-only mode, the Selfie Scan success screen now uses a different string resource: ```xml Face captured! ``` **Previous string:** ```xml Success! ``` The previously used string is still in use for non-capture-only mode and should be kept in your resources. ### `ID Capture` and `Selfie` V2 - Permission Open Settings Screen Text Change on Android **Open settings button customization:** The Open settings label shown on the Permission open settings screen now uses a dedicated string resource: ```xml Allow permission ``` **Previous string:** ```xml Open settings ``` The previously used string is still in use for the `Geolocation` module and should be kept in your resources. ## Migration to 4.13.0 ### Upload error screen customization on Android If you previously customized the upload error screen, add the following new string resource: *Add this string:* ```Scan your ID``` *Previous string:* ```Scan your ID``` This string is now used only for customizing the ID Capture V2 tutorial screen title. ### Changed default values in FaceMatch module config on Android (optional) With the move to UxV2, the showUserExists config is now false by default. ## Migration to 4.12.0 To keep using methods `addFace`, `removeFace`, `getFaces` and `setFaces` on iOS platform, please migrate to Flutter SDK variant '-l'. ```diff onboarding_flutter_wrapper: git: url: git@github.com:Incode-Technologies-Example-Repos/IncdOnboardingFlutter.git - ref: release/[VERSION] + ref: release/[VERSION]-l ``` ### Parameter Updates in `IdScan` module * Remove usage of `enableRotationOnRetakeScreen` (this parameter has been removed). * Replace `showRetakeScreen` with `showRetakeScreenForManualCapture`. * Replace `showAutoCaptureRetakeScreen` with `showRetakeScreenForAutoCapture`. ### Update string resources for the "Need Help" screen in the `IdScan` v2 module on Android The "Need Help" screen has been redesigned on Android, and the customizable strings have been replaced. If you override any of the following strings in your app, replace them with the new ones listed below. No action is required if you do not override these strings. #### Replaced string resources Replace overrides of: ```xml Need help? Some considerations Take the photo manually Center your document in the frame The photo will be taken automatically Avoid blurriness on the document Zoom in and out, or tap on the document Avoid glare on the document Find a better lighting to avoid reflections Avoid darkness on the document Find a place with better lighting ``` with: ```xml Common issues Glare present Tilt the ID slightly up or down to minimize the reflection Blur present Move ID further away or closer to your phone until the image is focused Info is not readable Minimize camera shake by holding your phone steady @string/onboard_sdk_try_again ``` ### Upgrade compileSdk on Android With the update of the internal CameraX dependencies, you will need to upgrade your project's `compileSdk` to level 35: ```groovy compileSdk 35 ``` ### Update Gradle Wrapper on Android Android Gradle Wrapper `8.6.0` requires Gradle `8.7` or higher. Update your Gradle wrapper configuration in `gradle/wrapper/gradle-wrapper.properties`: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip ``` ## Migration to 4.10.0 ### E2EE variant removed RN SDK 'e2ee' variant is no longer distributed, as e2ee functionality is now offered in a standard Flutter SDK variant. ### Android optional dependencies For Android, if you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:video-streaming:1.6.0' implementation 'com.incode.sdk:extensions:1.2.1' implementation 'com.incode.sdk:model-face-recognition:3.5.1' implementation 'com.incode.sdk:model-id-face-detection:3.5.1' implementation 'com.incode.sdk:model-liveness-detection:3.2.1' ``` ### Android minSdk changes For Android, if you use the video-streaming dependency, you need to upgrade your minSdk to 24 or higher. The requirement is coming from the OpenTok dependency, which now requires a minimum SDK version of 24. This update is necessary to ensure compatibility with the 16KB page size support mandated by Google starting from November 1st 2025. [More info](https://developer.android.com/guide/practices/page-sizes). ## Migration to 4.9.0 ### Optional dependencies For Android, if you use this optional dependency, make sure to update to the latest versions: ```groovy implementation 'com.incode.sdk:extensions:1.2.1' ``` ### Updated resource name If you wanted to customize the logo at the top of the `IdScan` V2 module, you needed to override the incode logo resource: `onboard_sdk_incode_logo.xml`.\ This resource was not intended to be customizable, so please update your customizations to the new resource name: `onboard_sdk_logo_top.xml`. By default, this resource is an empty 1x1 image, and you can customize it to your own logo. ## Migration to 4.7.0 For Android, if you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:model-face-recognition:3.5.0' implementation 'com.incode.sdk:model-id-face-detection:3.5.0' ``` The `qr-face-login` dependency is no longer available and has been removed in this version of the SDK. Please update your project configuration accordingly.\ Remove the `qr-face-login` dependency from your `build.gradle`: ## Migration to 4.6.0 * Update Android `minSdkVersion` in you Android project's `build.gradle`: ```diff buildscript { ext { - minSdkVersion = 21 + minSdkVersion = 23 } } ``` Remove `com.incode.sdk:camera:1.1.0` dependency in your app’s `build.gradle` file: ```diff dependencies { - implementation 'com.incode.sdk:camera:1.1.0' } ```
          ## Migration to 4.4.0 * To enable the new ID capture experience on Android, add the `com.incode.sdk:camera:1.1.0` dependency to your app’s `build.gradle` file: ```diff dependencies { + implementation 'com.incode.sdk:camera:1.1.0' } ``` * If you are using NFC variant of the SDK follow the steps below to enable NFC scanning on iOS: 1. Turn on Near Field Communication Tag Reading under the Capabilities tab for the project’s target. This step: * Adds the NFC tag-reading feature to the App ID. * Adds the Near Field Communication Tag Reader Session Formats Entitlement to the entitlements file. 2. Add the NFCReaderUsageDescription key as a string item to the Info.plist file. For the value, enter a string that describes the reason the app needs access to the device’s NFC reader. If the app attempts to read a tag without providing this key and string, the app will crash. 3. Add interface for interacting with an ISO 7816 tag to App's Info.plist: ``` com.apple.developer.nfc.readersession.iso7816.select-identifiers A0000002471001 A0000002472001 00000000000000 ``` NOTE\ If your app supports devices with iOS prior to 13.0, you will also need to set CoreNFC.framework and CryptoTokenKit.framework as an optional frameworks: * Select your app target * Under Build Phases -> Link Binary With Libraries add: CoreNFC.framework, CryptoTokenKit.framework and SwiftUI.framework libraries if they are already not on the list. * And finally, for all three libraries, under Status, select Optional. Note that even though NFC Scan module will not be performed on devices with iOS version older than 13, these steps are required because otherwise the app will crash on launch time. ### Example app migration To run the example app, follow these steps: 1. Navigate to root of the example folder. Create .env file. The file is added in .gitignore so it won't be pushed to the repository. It is used to store your own credentials. Example of the .env file content: ``` # Demo DEMO_API_URL=YOUR_API_URL DEMO_API_KEY=YOUR_API_KEY DEMO_COMBINED_CONSENT_ID=YOUR_COMBINED_CONSENT_ID DEMO_WORKFLOW_CONFIGURATION_ID=YOUR_WORKFLOW_CONFIGURATION_ID DEMO_FLOW_CONFIGURATION_ID=YOUR_FLOW_CONFIGURATION_ID DEMO_DEEP_LINK=YOUR_DEEP_LINK # SaaS SAAS_API_URL==YOUR_API_URL SAAS_API_KEY=YOUR_API_KEY SAAS_COMBINED_CONSENT_ID=YOUR_COMBINED_CONSENT_ID SAAS_WORKFLOW_CONFIGURATION_ID=YOUR_WORKFLOW_CONFIGURATION_ID SAAS_FLOW_CONFIGURATION_ID=YOUR_FLOW_CONFIGURATION_ID SAAS_DEEP_LINK=YOUR_DEEP_LINK ``` 2. Run `flutter pub get` to install dependencies. 3. Run the following commands to generate corresponding files for those env values: ``` flutter pub run build_runner clean flutter pub run build_runner build --delete-conflicting-outputs ``` 4. The mandatory values to run the app properly are `apiKey` and `apiUrl`. Replace the other values in home.dart based on your needs. 5. Run the app. ## Migration to 4.3.0 * iOS integration requires `Podfile` update and SSH access being setup on the machine. Add these lines to the `Podfile`: ```diff + source 'https://cdn.cocoapods.org/' + source 'git@github.com:Incode-Technologies-Example-Repos/IncdDistributionPodspecs.git' ``` If you don't have access to the Incode's GitHub repo and SSH setup on the machine, please contact your Incode representative for support. ## Migration to 3.2.0 `compileSdk` and/or `compileSdkVersion` should be updated to 34. ## Migration to 3.0.0 1. Remove `core-light` dependency in your Android project's `build.gradle`: ```diff dependencies { - implementation 'com.incode.sdk:core-light:2.6.2' // Required core dependency } ``` `com.incode.sdk:core-light` dependency is now part of the Flutter SDK itself. 2. Gradle versions should be updated to 7.+, ie. : ```diff dependencies { - classpath 'com.android.tools.build:gradle:4.2.0' + classpath 'com.android.tools.build:gradle:7.4.2' } ``` Update gradle distributionUrl in your `gradle-wrapper.properties`: ```diff - distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-all.zip + distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip ``` ## Migration to 2.8.0 1. Update dependency in your Android project's `build.gradle`: ```diff dependencies { - implementation 'com.incode.sdk:core-light:2.6.1' // Required core dependency + implementation 'com.incode.sdk:core-light:2.6.2' // Required core dependency } ``` ## Migration to 2.7.0 1. Update dependency in your Android project's `build.gradle`: ```diff dependencies { - implementation 'com.incode.sdk:core-light:2.5.1' // Required core dependency + implementation 'com.incode.sdk:core-light:2.6.1' // Required core dependency } ``` 2. The following dependencies are optional and needed only in very specific use cases.\ Make sure you are using the features they provide before adding the dependencies below. Update dependency in your Android project's `build.gradle`: ```diff dependencies { + implementation 'com.incode.sdk:kiosk-login:1.3.1' // Optional kiosk-login dependency is only necessary if you are using Kiosk Login feature of the SDK. + implementation 'com.incode.sdk:model-liveness-detection:3.0.0' // Optional model-liveness-detection dependency is only necessary if you are using liveness detection feature that runs locally on device. This feature can be used within IncodeOnboardingSdk.startFaceLogin method + implementation 'com.incode.sdk:model-face-recognition:3.0.0' // Optional model-face-recognition dependency is only necessary if you are using face recognition feature that runs locally on device. This feature can be used within IncodeOnboardingSdk.startFaceLogin method } ``` ## Migration to 2.6.0 1. Update dependency in your Android project's `build.gradle`: ```diff dependencies { - implementation 'com.incode.sdk:core-light:2.5.0' // Required core dependency + implementation 'com.incode.sdk:core-light:2.5.1' // Required core dependency } ``` ## Migration to 2.4.0 1. Update dependency in your Android project's `build.gradle`: ```diff dependencies { - implementation 'com.incode.sdk:core-light:2.4.0' // Required core dependency + implementation 'com.incode.sdk:core-light:2.5.0' // Required core dependency } ``` 2. Update `compileSdkVersion` and `targetSdkVersion` in your Android project's `build.gradle` to 33. 3. Bumped `minSdkVersion` into 21 from 17 ## Migration to 2.2.0 1. Update dependency in your Android project's `build.gradle`: ```diff dependencies { - implementation 'com.incode.sdk:core-light:2.3.0' // Required core dependency + implementation 'com.incode.sdk:core-light:2.4.0' // Required core dependency } ``` ## Migration to 2.1.0 1. Update dependency in your Android project's `build.gradle`: ```diff dependencies { - implementation 'com.incode.sdk:core-light:2.2.0' // Required core dependency + implementation 'com.incode.sdk:core-light:2.3.0' // Required core dependency } ``` ## Migration to 2.x 1. Added `setupOnboardingSession` that replaces `creatingNewOnboardingSession` and `setOnboardingSession` ```diff - IncodeOnboardingSdk.creatingNewOnboardingSession + IncodeOnboardingSdk.setupOnboardingSession ``` ```diff - IncodeOnboardingSdk.setOnboardingSession + IncodeOnboardingSdk.setupOnboardingSession ``` 2. iOS app setup changed - it is no longer needed to add these lines to the Podfile, so these should be removed when upgrading to 2.x: ```diff -source 'https://github.com/CocoaPods/Specs.git' -source 'git@github.com:Incode-Technologies-Example-Repos/IncdDistributionPodspecs.git' ``` --- - Path: `release-notes/fr-french` - URL: https://developer.incode.com/release-notes/fr-french/ - Markdown: https://developer.incode.com/release-notes/fr-french.md # FR - French ## 🆕 Added * `capturePreview.acceptedDocuments.BirthCertificate` = `Acte de naissance` * `capturePreview.acceptedDocuments.country` = `{{country}}` * `capturePreview.acceptedDocuments.Currency` = `Monnaie` * `capturePreview.acceptedDocuments.DriversLicense` = `Permis de conduire` * `capturePreview.acceptedDocuments.FederalID` = `ID fédéral` * `capturePreview.acceptedDocuments.IdentificationCard` = `Carte d'identité` * `capturePreview.acceptedDocuments.label` = `Documents acceptés pour :` * `capturePreview.acceptedDocuments.MedicalCard` = `Carte médicale` * `capturePreview.acceptedDocuments.Military` = `Militaire` * `capturePreview.acceptedDocuments.noDocuments` = `Aucun document n'est accepté pour ce pays. ` * `capturePreview.acceptedDocuments.Other` = `Autres` * `capturePreview.acceptedDocuments.Passport` = `Passeport` * `capturePreview.acceptedDocuments.Permit` = `Permis` * `capturePreview.acceptedDocuments.ResidenceDocument` = `Document de résidence` * `capturePreview.acceptedDocuments.TaxIdentification` = `Identification fiscale` * `capturePreview.acceptedDocuments.TravelDocument` = `Document de voyage` * `capturePreview.acceptedDocuments.TribalIdentification` = `Identification tribale` * `capturePreview.acceptedDocuments.Unknown` = `Inconnu` * `capturePreview.acceptedDocuments.VehicleRegistration` = `Immatriculation des véhicules` * `capturePreview.acceptedDocuments.Visa` = `Visa` * `capturePreview.acceptedDocuments.VoterIdentification` = `Identification des électeurs` * `capturePreview.acceptedDocuments.WeaponLicense` = `Permis de port d'arme` * `common.refreshPage` = `Rafraîchir` * `commonIssues.idv2.tryAgain` = `Ok, réessayez` * `errors.dynamicImport.failedToLoad` = `Il s'agit d'une erreur inattendue, mais nous en avons pris note :` * `errors.dynamicImport.suggestion` = `Nous réessayerons sur {{count}} ou vous pouvez actualiser manuellement.` * `errors.dynamicImport.title` = `Désolé, nous avons rencontré un problème` * `idv2.capture.autoCapture` = `La photo est prise automatiquement` * `idv2.capture.dontMove` = `Ne bougez pas votre pièce d'identité pendant quelques secondes` * `idv2.capture.fillFrame` = `Remplissez le cadre avec votre pièce d'identité` * `idv2.capture.fillFramePassport` = `Remplissez le cadre avec votre passeport` * `idv2.capture.manualCapture.ariaLabel` = `Capture manuelle` * `idv2.capture.manualCapture.title` = `Bouton de capture manuelle` * `idv2.capture.notifications.blur.description` = `Zoom avant et arrière, ou tapez sur l'ID` * `idv2.capture.notifications.blur.title` = `ID trop flou` * `idv2.capture.notifications.glare.description` = `Trouver un meilleur éclairage pour éviter les reflets` * `idv2.capture.notifications.glare.title` = `ID avec éblouissement` * `idv2.capture.notifications.notAligned.description` = `Centrer l'identifiant à l'intérieur du cadre` * `idv2.capture.notifications.notAligned.title` = `L'identifiant n'est pas aligné` * `idv2.capture.notifications.showBack.description` = `Retournez votre carte d'identité pour en montrer le verso` * `idv2.capture.notifications.showBack.title` = `Montrer le verso de la carte d'identité` * `idv2.capture.notifications.showFront.description` = `Retournez votre carte d'identité pour en montrer le recto` * `idv2.capture.notifications.showFront.title` = `Montrer le recto de la carte d'identité` * `idv2.capture.passport.subtitle` = `Assurez-vous que votre passeport est lisible` * `idv2.capture.passport.title` = `Scannez votre passeport` * `idv2.capture.processing.analyzing` = `Analyser...` * `idv2.capture.processing.attemptsRemaining` = `{{attempts}}/{{maxAttempts}} tentatives restantes` * `idv2.capture.processing.continue` = `Continuer` * `idv2.capture.processing.error` = `Erreur` * `idv2.capture.processing.errors.classification.subtitle` = `Veillez à ce que l'ensemble de la carte d'identité soit visible et bien éclairé.` * `idv2.capture.processing.errors.classification.title` = `Échec de la vérification de l'identité` * `idv2.capture.processing.errors.default.subtitle` = `Veuillez réessayer` * `idv2.capture.processing.errors.default.title` = `Il y a eu un problème` * `idv2.capture.processing.errors.glare.subtitle` = `Inclinez légèrement l'ID vers le haut ou vers le bas pour minimiser les reflets.` * `idv2.capture.processing.errors.glare.title` = `Éblouissement présent` * `idv2.capture.processing.errors.readability.subtitle` = `Minimisez le bougé de l'appareil photo en maintenant votre téléphone stable` * `idv2.capture.processing.errors.readability.title` = `Les informations ne sont pas lisibles` * `idv2.capture.processing.errors.sharpness.subtitle` = `Éloignez ou rapprochez la carte d'identité de votre téléphone jusqu'à ce que l'image soit nette.` * `idv2.capture.processing.errors.sharpness.title` = `Flou présent` * `idv2.capture.processing.errors.unacceptable.subtitle` = `Veuillez essayer avec un autre document` * `idv2.capture.processing.errors.unacceptable.title` = `Le type d'identification n'est pas accepté` * `idv2.capture.processing.errors.upload.subtitle` = `Veuillez vérifier votre connexion et réessayer` * `idv2.capture.processing.errors.upload.title` = `Échec de la numérisation de l'ID` * `idv2.capture.processing.errors.wrongSide.subtitle` = `Capture du côté {{mode}} de l'ID` * `idv2.capture.processing.errors.wrongSide.title` = `Mauvais côté de l'identifiant capturé` * `idv2.capture.processing.scanBack` = `Numériser le dos` * `idv2.capture.processing.success` = `Succès` * `idv2.capture.processing.successBackSubtitle` = `Poursuivons maintenant` * `idv2.capture.processing.successFrontSubtitle` = `Maintenant, capturons l'arrière` * `idv2.capture.processing.successTitle` = `Traitement réussi !` * `idv2.capture.processing.tryAgain` = `Réessayer` * `idv2.capture.takingPhoto` = `Prendre des photos...` * `idv2.capture.wrongSide.backHint` = `back-id-hint` * `idv2.capture.wrongSide.frontHint` = `front-id-hint` * `idv2.chooser.idButtonDescription` = `Carte d'identité nationale ou permis de conduire` * `idv2.chooser.idButtonTitle` = `Carte d'identité` * `idv2.chooser.passportButtonDescription` = `Votre pays Passeport` * `idv2.chooser.passportButtonTitle` = `Passeport` * `idv2.permissions.alertAlt` = `fausse alerte de permission` * `idv2.permissions.allow` = `OK, Autoriser` * `idv2.permissions.denied.allow` = `Autoriser` * `idv2.permissions.denied.ask` = `Demander` * `idv2.permissions.denied.browser` = `Navigateur` * `idv2.permissions.denied.camera` = `Appareil photo` * `idv2.permissions.denied.changeTo` = `Passer à` * `idv2.permissions.denied.open` = `Ouvrir` * `idv2.permissions.denied.or` = `ou` * `idv2.permissions.denied.refreshPage` = `Actualiser la page` * `idv2.permissions.denied.return` = `Revenez ici et appuyez sur` * `idv2.permissions.denied.scroll` = `Faites défiler vers le bas pour sélectionner` * `idv2.permissions.denied.settings` = `Paramètres` * `idv2.permissions.denied.tap` = `Robinet` * `idv2.permissions.denied.title` = `Suivez les étapes suivantes pour permettre à Incode d'accéder à votre appareil photo` * `idv2.permissions.denied.yourBrowser` = `votre navigateur` * `idv2.permissions.description` = `afin d'achever le processus` * `idv2.permissions.dontAllow` = `Ne pas autoriser` * `idv2.permissions.fakeDenied.alert` = `alerte fausse focalisée` * `idv2.permissions.fakeDenied.allowPermissions` = `Autorisations` * `idv2.permissions.fakeDenied.quitProcess` = `Quitter le processus` * `idv2.permissions.fakeDenied.title` = `L'autorisation de photographier est requise pour la capture de documents` * `idv2.permissions.fakeDenied.warning` = `avertissement` * `idv2.permissions.note` = `Note : En fonction de votre téléphone, il se peut que le message suivant s'affiche` * `idv2.permissions.or` = `ou` * `idv2.permissions.subtitle` = `autoriser l'appareil photo` * `idv2.permissions.title` = `Nous avons besoin de vous pour` * `idv2.permissions.whileUsing` = `Pendant l'utilisation de l'application` * `idv2.tutorial.autoCapture` = `La photo est prise automatiquement` * `idv2.tutorial.startScan` = `Scannons` * `idv2.tutorial.subtitle` = `Veillez à ce que votre pièce d'identité soit lisible` * `idv2.tutorial.title` = `Scannez votre carte d'identité` * `idv2.uploading.analyzing` = `Analyser...` * `idv2.uploading.imageAlt` = `Capture d'identité` * `onboarding.errors.restartDisabled.message` = `Le redémarrage de la session est désactivé au niveau de l'organisation` * `onboarding.errors.restartDisabled.title` = `Impossible de redémarrer la session` * `qes.signatureCheck` = `Je consens à la délivrance du certificat requis et à la signature électronique de ce document.` * `qes.termsCheck` = `J'ai lu et j'accepte la <2>politique de confidentialité et les <6>conditions d'utilisation d'Incode.` ## ✏️ Modified * `commonIssues.commonIssues`: * Before: `Problèmes communs` * Now: `Problèmes courants` * `commonIssues.infoNotReadable`: * Before: `Les informations ne sont pas lisibles` * Now: `Informations illisibles` * `commonIssues.takeManually`: * Before: `Prendre la photo manuellement` * Now: `Prendre une photo manuellement` * `commonIssues.tryAgain`: * Before: `OK, reprendre` * Now: `Réessayer` * `notifications.done`: * Before: `Terminé` * Now: `Scan terminé` * `notifications.glareDetected`: * Before: `Éblouissement présent` * Now: `Éblouissement détecté` * `notifications.glareDetectedDescription`: * Before: `Inclinez légèrement l'ID vers le haut ou vers le bas pour minimiser les reflets.` * Now: `Trouver un meilleur éclairage pour éviter les reflets` * `notifications.idTypeUnacceptable`: * Before: `Le type d'identification n'est pas accepté` * Now: `Document d'identification non valide` * `notifications.idTypeUnacceptableDescription`: * Before: `Veuillez essayer avec un autre document` * Now: `Essayez d'en scanner un autre` * `notifications.lowSharpness`: * Before: `Flou présent` * Now: `Faible netteté` --- - Path: `release-notes/incode-releases` - URL: https://developer.incode.com/release-notes/incode-releases/ - Markdown: https://developer.incode.com/release-notes/incode-releases.md # Incode Release Notes Overview This page tracks the current release status of all Incode components. Use it to check the latest version of any SDK or platform layer, see when it was last updated, and navigate directly to the latest release notes. Release cadences are approximate and subject to change. Contact your Incode representative if you need information about a specific version or an upcoming release. Incode SDKs adhere to a 12 month [deprecation policy](/release-notes/sdk-deprecation-policy-and-timeline/). | Platform | Latest version | Last updated | Cadence | | :------------------------------------------------------------------------------------------------------------------- | :------------- | :------------ | :----------------------------------------------- | | [Platform](/release-notes/platform-release-notes-2026/) (API / Dashboard / Webflows) | SaaS | September 7, 2026 | Weekly, rotating between Demo and SaaS releases. | | [Web SDK 1.x](/release-notes/releases-web-sdk/) | 1.92.1 | August 26, 2026 | Monthly | | [Web SDK 2.x](/release-notes/web-sdk-20-release-notes/) | 2.1.1 | July 30, 2026 | Monthly | | [iOS SDK](/release-notes/releases-ios-sdk/) | 5.48.0 | August 19, 2026 | Bi-weekly| | [Android SDK](/release-notes/releases-android-sdk/) | 5.52.0 | August 20, 2026 | Bi-weekly | | [React Native SDK](/release-notes/releases-rn-sdk/) | 9.16.0 | August 28, 2026 | Bi-weekly | | [Flutter SDK](/release-notes/releases-flutter-sdk/) | 4.20.0 | August 27, 2026 | Bi-weekly | | [Cordova SDK](/release-notes/releases-cordova-sdk/) | 4.8.0 | August 28, 2026 | Bi-weekly | | [Xamarin SDK](/release-notes/releases-xamarin-sdk/) | 2.0.1 | December 25, 2025 | — |
          --- - Path: `release-notes/migration_guide` - URL: https://developer.incode.com/release-notes/migration_guide/ - Markdown: https://developer.incode.com/release-notes/migration_guide.md # Migration guide ## Migration to 5.47.0 ### ID Capture: New IDFrameAnalysisError.preparingCamera Case `IDFrameAnalysisError` gains a new case: ```swift case preparingCamera // new ``` `preparingCamera` is reported through `IDCaptureFeedback.error` while the ID camera is getting ready, before the preview is shown. It is not an error: capture continues normally once the camera is ready, and the SDK's own screens show the existing "Adjusting camera" copy for it, just like `settingUpStreaming`. If you `switch` exhaustively over `IDFrameAnalysisError`, add a handler for this case. ### testMode Now Allowed on Real Devices `initIncdOnboarding(...)` with `testMode: true` used to fail on a real device with `IncdInitError.testModeEnabled`. It now succeeds, so you can develop against a real device with test mode on. The SDK prints a console warning when test mode is enabled to remind you to set it back to `false` before distribution. `IncdInitError.testModeEnabled` is kept so existing `switch` statements keep compiling, but it is no longer reported. Remove any handling that relied on initialization failing for this reason. ### AES: showCertificateOnSuccess Removed from addAes The AES module now shows a V2-style success screen instead of listing the signed documents. `showCertificateOnSuccess` had no other effect, so it was removed from `addAes(...)`. Downloading the signed document is unchanged and still follows `AESConfiguration.downloadDocument`. When enabled, the success screen offers a "Download document" action. Old way: ```swift flowConfig.addAes(configuration: aesConfiguration, showCertificateOnSuccess: true) ``` New way: ```swift flowConfig.addAes(configuration: aesConfiguration) ``` The code will not compile until the argument is removed. `AESConfiguration` and `AESResult` are unchanged. ### Electronic Signature (AES/QES): V2 Screens and Localization Key Changes Both signature modules now run on the Incode Design System V2. The `addQes(...)` API and both result types are unchanged. User-visible changes include: - QES now honors `QESConfiguration.uploadDocument`. When enabled, the user picks and uploads a PDF before the signing screen, just like AES. Previously, the flag was ignored, so a session with no documents attached ended with `QESResult.error == .noDocuments`. - Both signing screens show the close button whenever `IncdOnboardingManager.shared.allowUserToCancel` allows it. Previously, it was suppressed unconditionally. Localization key changes include: - Removed (overrides of these keys no longer have any effect): - `incdOnboarding.qes.terms1.title` - `incdOnboarding.qes.terms2.title` - Added: - `incdOnboarding.qes.consent.qualifiedCertificate`, `.legalEffect`, `.qscd`, `.termsPrivacy`, and `.reviewedDocuments`: The five consent checkboxes on the QES signing screen, replacing the two removed keys above. - `incdOnboarding.aes.document.namePosition` and `incdOnboarding.qes.document.namePosition`: The document card name used when more than one document is signed. - Copy updated without renames, so existing overrides keep working: `incdOnboarding.aes.terms1.title`, `.terms2.title`, `.terms3.title`, `incdOnboarding.aes.acceptSign.subtitle`, `incdOnboarding.aes.document.name`, and `incdOnboarding.qes.document.name`. The last two now hold the single-document name and no longer take a number. See [Localize Display Text](/sdk-reference/ios-customization#localize-display-text) for the full key list. ### Face Capture and Face Authentication: New videoRecordingError Field and insufficientStorageForVideoRecording Case `SelfieScanResult` and `FaceAuthenticationResult` gain a new optional field: ```swift public var videoRecordingError: SelfieScanError? // on SelfieScanResult public var videoRecordingError: FaceAuthenticationError? // on FaceAuthenticationResult ``` `SelfieScanError` and `FaceAuthenticationError` each gain a new case: ```swift case insufficientStorageForVideoRecording // new ``` The case is reported when Deepsight video recording is skipped because the device has less than 15 MB of free storage. It is non-fatal: the face capture itself completes normally, and the skip is surfaced only via `videoRecordingError`. The `error` field remains reserved for terminal failures, so existing error handling is unaffected. If you `switch` exhaustively over `SelfieScanError` or `FaceAuthenticationError`, add a handler for this case. ## Migration to 5.45.0 ### Model loading API — extended signatures and auto-unload by default `IncdOnboardingManager.shared.loadModels` and `IncdOnboardingManager.shared.loadModelsSynchronously` now take two additional parameters: - `modelGroup: ModelGroup` — selects which models to preload. Defaults to `.all`. Use `.idCapture` or `.faceCapture` to load only what the next flow needs. - `autoUnload: Bool` — when `true` (default), loaded models are released automatically once onboarding finishes or is cancelled, freeing ~80–100 MB. Pass `false` to keep models resident across sessions and release them yourself via `unloadModels()`. Existing call sites that rely on the previous defaults continue to compile without changes, but the runtime behavior is now different: models that previously stayed in memory between onboardings are released by default. If you want the prior behavior, opt out explicitly. Old way: ```swift IncdOnboardingManager.shared.loadModels { // models loaded } IncdOnboardingManager.shared.loadModelsSynchronously() ``` New way (equivalent, models still released after each onboarding): ```swift IncdOnboardingManager.shared.loadModels( modelGroup: .all, autoUnload: true ) { // models loaded } IncdOnboardingManager.shared.loadModelsSynchronously( modelGroup: .all, autoUnload: true ) ``` New way (preserve previous behavior — keep models resident across sessions): ```swift IncdOnboardingManager.shared.loadModels(autoUnload: false) { // ... } // release explicitly when you're done with the SDK IncdOnboardingManager.shared.unloadModels() ``` ### Deepsight configuration — unified `DeepsightConfiguration` for Face Capture and Face Authentication Selfie / Face Capture and Face Authentication now express Deepsight capture through a single `DeepsightConfiguration`, matching the Dashboard flow/workflow model: - `DeepsightModality`: - `.singleFrame` — single frame, no depth data, no video liveness. - `.singleFrameWithDepth` — single frame with depth data, no video liveness. - `.singleFrameWithDepthAndVideo` — single frame with depth data and recorded video liveness. - `DeepsightConfiguration(enabled:modality:motion:)` — `enabled` toggles Deepsight, `modality` selects what is captured, `motion` enables motion capture. #### Selfie scan The `addSelfieScan` overload that took `requireDepthData` / `videoLivenessRecording` is **deprecated** (not removed). Use the new overload that takes a `DeepsightConfiguration`: Old way (deprecated): ```swift config.addSelfieScan( requireDepthData: true, videoLivenessRecording: true ) ``` New way: ```swift config.addSelfieScan( deepsight: DeepsightConfiguration( enabled: true, modality: .singleFrameWithDepthAndVideo, motion: true ) ) ``` Mapping from the deprecated parameters: | Deprecated parameters | New `DeepsightModality` | | --- | --- | | `videoLivenessRecording: false` | `.singleFrameWithDepth` (depth captured, preserving previous behavior) | | `videoLivenessRecording: true` | `.singleFrameWithDepthAndVideo` | Notes: - `requireDepthData` no longer affects capture — whether depth is captured is now determined by the modality. - The new `deepsight` parameter defaults to `DeepsightConfiguration.default` (Deepsight disabled). A bare `addSelfieScan()` therefore now performs a plain single-frame capture (no depth, no video, no motion); pass an explicit `DeepsightConfiguration` to enable them. #### Face authentication `FaceAuthenticationConfiguration` now accepts a `DeepsightConfiguration`: ```swift let config = FaceAuthenticationConfiguration( deepsight: DeepsightConfiguration(modality: .singleFrameWithDepthAndVideo, motion: true) ) ``` When a flow/workflow is fetched from the Dashboard, Deepsight is configured automatically from the backend (`ds`, `deepsightLiveness`, and `motion`); no SDK changes are required for flow/workflow-driven onboarding. ### NFC Scan Module — Redesign to Design System V2 The `NFC Scan` module has been migrated to the Incode Design System V2. The public `addNfcScan(...)` API and `NFCScanResult` are unchanged; integration code does not need to be touched. User-visible flow changes: - After a chip-read failure, a general error screen is shown briefly before the try-again screen. - The try-again CTA now navigates through the OCR-edit screen so users can confirm document data before retrying. Previously the CTA restarted the scan immediately. - The passport try-again carousel advances one page per failed attempt (capped at the last page). Previously the carousel was shown only once. - A dedicated error screen is shown when the device does not support NFC; the module then completes with `NFCScanResult.error == .notAvailable`. Several `incdOnboarding.nfc.*` strings had their casing/copy updated, and new keys were added for V2-only screens. See [SDK Customization](/sdk-reference/ios-customization/#localize-display-text) for the full key list. No key renames or removals — overrides in your `Localizable.strings` continue to work. ### `disableJailbreakDetection` removed The public `IncdOnboardingManager.shared.disableJailbreakDetection` property has been removed and has no replacement. If you set it anywhere, remove those calls; the code will not compile until you do. Old way: ```swift IncdOnboardingManager.shared.disableJailbreakDetection = true ``` New way: remove the call. ## Migration to 5.44.0 ### Face Capture validation flags — defaults changed from `false` to `true` When the dashboard configuration omits `validateLenses`, `validateFaceMask`, `validateClosedEyes`, or `validateHeadCover`, the SDK now defaults them to `true`. If you relied on these being off, set them explicitly to `false` in your dashboard configuration — otherwise the corresponding checks will start running and may reject captures that previously passed. ### `IncdTheme.logo` — now also applied to V2 screens V2 screens now respect `IncdTheme.logo`, using it before falling back to the host app's `incdOnboardingLogo` asset and then the SDK default (V1 already worked this way). If you previously set `IncdTheme.logo` for V1 and a separate `incdOnboardingLogo` asset expecting V2 to show the asset, V2 will now show `IncdTheme.logo` on both. Leave `IncdTheme.logo` unset to keep V2 on the asset. ## Migration to 5.43.0 ### `IncdFlowError` and `GeolocationError` — new cases The reworked `Geolocation` failure UX adds new enum cases. Update any exhaustive `switch` over `IncdFlowError` or `GeolocationError`: - `IncdFlowError.locationUnavailable` - fired via `IncdOnboardingDelegate.onError(_:)` when a non-skippable `Geolocation` module exhausts its retries on the location-unavailable screen and the user taps `Quit process`. - `GeolocationError.locationUnavailable` - surfaced via `GeolocationResult.error` when a skippable `Geolocation` module is skipped from either failure screen. ## Migration to 5.42.0 - Removed localization keys - `incdOnboarding.nameInfo.lastnamePlaceholder` - `incdOnboarding.ccv.invalidCCV` - Renamed localization keys: - `incdOnboarding.email.title` -> `incdOnboarding.userInformation.email.title` - `incdOnboarding.email.invalidEmail` -> `incdOnboarding.userInformation.email.wrongFormat` - `incdOnboarding.ccv.title` -> `incdOnboarding.userInformation.securityCode.title` - `incdOnboarding.nameInfo.title` -> `incdOnboarding.userInformation.fullName.title` - `incdOnboarding.nameInfo.subtitle` -> `incdOnboarding.userInformation.fullName.subtitle` - `incdOnboarding.nameInfo.namePlaceholder` -> `incdOnboarding.userInformation.fullName.placeholder` - `incdOnboarding.nameInfo.continue` -> `incdOnboarding.userInformation.continue` - `incdOnboarding.ekyc.input.label.fillYourCredentials` -> `incdOnboarding.ekyc.input.title` ## Migration to 5.41.0 ### CURP Validation Module — Localization Key Changes The CURP Validation module has been redesigned to use the Incode Design System V2. As part of this update: - Removed localization key: - `incdOnboarding.curp.add.generate` - Renamed localization keys: - `incdOnboarding.curp.generation.last.name.placeholder` → `incdOnboarding.curp.generation.first.last.name.placeholder` - `incdOnboarding.curp.generation.name.placeholder` → `incdOnboarding.curp.generation.first.name.placeholder` If you override CURP-related strings in your `Localizable.strings`, update the keys above. Unused keys can be safely removed. ### ID Document Chooser — `idType` Behavior Change The visibility of the ID Document Chooser screen is now controlled only by the **"Show document chooser screen"** flag on the Dashboard or `showIdTypeChooser` in `addIdScan`. - When using startFlow / startWorkflow, the Dashboard setting is respected. - When using **`startOnboarding` / `startOnboardingSection`**: the Dashboard flag is ignored and visibility is controlled exclusively via `showIdTypeChooser` in `addIdScan`. Setting `idType` alone no longer hides the chooser and will be ignored. If you use `startOnboarding` / `startOnboardingSection` and previously relied on `idType` to suppress the chooser, add an explicit `showIdTypeChooser: false`: ```swift // Before (implicit suppression via idType — no longer works) addIdScan(idType: .id) // After (explicit) addIdScan(idType: .id, showIdTypeChooser: false) ``` ### V2 Theme Color Palette — Positive and Negative Token Renames The JSON/code keys used for positive and negative semantic colors in `IncdTheme`'s V2 color palette have been renamed. If you customize the color palette via JSON or code, update the following keys: | Old key | New key | |---|---| | `negative500` | `negative400` | | `negative600` | `negative500` | | `positive600` | `positive500` | | `positive800` | `positive950` | For the full updated palette reference, see [About Colors](/sdk-reference/ios-customization/#customize-theme-colors-and-fonts) in the Customization Guide v2. ## Migration to 5.40.0 - Deprecated `title` and `description` parameters from `addSignature` method. - Use `addSignature(descriptionMaxLines:documents:)` and customize text via these keys in your app's `Localizable.strings`: - `"incdOnboarding.signature.title"` - `"incdOnboarding.signature.description"` ## Migration to 5.39.0 - Removed `enableRotationOnRetakeScreen` parameter from `addIdScan` method. Document in the review screen is shown in vertical orientation always. - Renamed `showRetakeScreen` into `showRetakeScreenForManualCapture` in `addIdScan` method. - Renamed `showAutoCaptureRetakeScreen` into `showRetakeScreenForAutoCapture` in `addIdScan` method. ## Migration to 5.38.0 - Renamed `FaceAuthenticationConfiguration` struct field `showTutorial` to `showTutorials` in order to perserve consistent parameter naming with other modules. - Deprecated `enableIdSummaryScreen` parameter from addIdProcess. Now function signature is now `addIdProcess(idCategory: IDCategory)`. Screen will not appear when using v2 UI. IdSummaryScreen will be removed in future update. ## Migration to 5.37.0 End-to-end-encryption (E2EE) no longer requires a separate "-e2ee" SDK variant and has also dropped the dependency on the `OpenSSL` framework. The separate "-e2ee" SDK variant has been deprecated. ## Migration to 5.34.0 The `brightnessThreshold` parameter has been removed in the following methods: - IncdOnboardingFlowConfiguration - addSelfieScan - IncdOnboardingManager - startFaceLogin - IncdOnboardingManager - startKioskSelfieScan Migrate by removing the parameter from these methods. ## Migration to 5.30.0 - Removed `.hybrid` mode from `FaceAuthMode`. `.hybrid` mode can safely be replaced with `.server` when calling `startFaceLogin`. ## Migration to 5.21.0 - `FaceMatchResult.idCategory` field is now named `idCategories` ## Migration to 5.19.0 - Removed the '-m' variant for face mask check. From version 5.19.0 onward, local mask check is standard in all variants. Migrate by omitting the '-m'; e.g. update '5.18.0-d-l-m' to '5.19.0-d-l'. ## Migration to 5.18.0 Starting from version 5.18.0, IncdOnboarding utilizes Lottie vector animations in JSON format for displaying tutorials. If you have been using your own tutorials in .mp4 format, you will need to provide the corresponding animations in JSON format. For more information on setting up your own tutorials, contact your Incode representative. ## Migration to 5.16.0 - Callback method for NFC Scan module has been renamed from `onPassportNFCScanCompleted(_ result: NFCScanResult)` to `onNFCScanCompleted(_ result: NFCScanResult)` in order to support NFC scan on IDs. - `NFCScanResult`'s fields have also been renamed: - `passportFacePhoto` to `facePhoto` - `passportDG1` to `dg1` - `passportNFCScanError` to `error` - `PassportNFCScanError` type is also renamed, now it is `NFCScanError`. - `userPassportHasNoChip` error is now `userDocumentHasNoChip`. - `HelpButtonConfiguration` is removed in favor of an improved `ButtonConfiguration`: Old way: ```swift private var helpButton: HelpButtonConfiguration { return HelpButtonConfiguration(cornerRadius: 35, backgroundColor: Colors.background, textColor: Colors.primary, iconColor: Colors.primary, width: 140, height: 70, iconTitlePadding: 4, verticalPadding: 6, horizontalPadding: 8) ``` New way: ```swift private var helpButton: ButtonConfiguration { let normal = ButtonThemedState(alpha: 1.0, backgroundColor: .incdBackground, borderColor: .incdPrimary, borderWidth: 1.0, textColor: .incdPrimary, iconImageName: "incdOnboarding.help.clipped", iconTintColor: .incdPrimary, iconPosition: .right, iconPadding: 8) return ButtonConfiguration(states: .init(normal: normal)) } ``` ## Migration to 5.15.0 - **Breaking Change:** The function `onEvent(_ event: Event, data: [String: Any])` has been replaced with a more comprehensive function to handle multiple events along with their associated data. - New Function: `onEvents(_ eventsWithDetails: [EventWithDetails])` - `EventWithDetails` is a typealias for a tuple containing an Event and its associated data. - This change provides improved capability for processing multiple events and their associated data together. ***Note**: This function is intended for analytics or informative purposes only, and should not be used as an indication that all events and their effects have been executed and completed.* Old way: ```swift func onEvent(_ event: Event, data: [String: Any]) ``` New way: ```swift func onEvents(_ eventsWithDetails: [EventWithDetails]) ``` ## Migration to 5.12.0 - `addMachineLearningConsent` parameter `type` is now one of the `RegulationType` options, instead of a `ConsentType`. `.gdpr` and `.us` options are still available. ## Migration to 5.5.0 - Renamed setting `serverSelfieFaceMaskCheck: Bool` to `faceMaskCheck: Bool`. In case of framework variant which includes local face mask check, user can specify via `IncdOnboardingManage.shared.faceMaskCheckMode` to use either server or local. Default is `.local`. ## Migration to 5.x ### Start Onboarding Parameters `interviewId`, `configurationId`, `onboardingValidationModules`, `customFields`, `externalId` are removed. These parameters are now provided via `IncdOnboardingSessionConfiguration`: ```swift let sessionConfig = IncdOnboardingSessionConfiguration(configurationId: "confId", validationModules: [], customFields: ["customKey": "customData"], interviewId: "interviewId", externalId: "externalId") ``` `IncdOnboardingConfiguration` is removed, use `IncdOnboardingFlowConfiguration` instead to add modules: ```swift let flowConfig = IncdOnboardingFlowConfiguration() flowConfig.addIdScan() ... ``` Now you can provide these to the `startOnboarding` method: ```swift IncdOnboardingManager.shared.startOnboarding(sessionConfig: sessionConfig, flowConfig: flowConfig, delegate: self) ``` ### Setup Onboarding Session Removed API methods: - `createNewOnboаrdingSession` - `setOnboardingSession` Use the `setupOnboardingSession` instead. All the parameters of `createNewOnboаrdingSession` and `setOnboardingSession` methods are now part of `IncdOnboardingSessionConfiguration`: ```swift let sessionConfig = IncdOnboardingSessionConfiguration(region: "ALL", queue: .aristotle, configurationId: "confId", validationModules: [], customFields: ["customKey": "customData"], interviewId: "interviewId", token: "token", externalId: "externalId") IncdOnboardingManager.shared.setupOnboardingSession(sessionConfig: sessionConfig) { sessionResult in } ``` ### Starting Onboarding Section - `flowTag` is removed from `IncdOnboardingFlowConfiguration`, and is now a parameter inside `startOnboardingSection`: ```swift let flowConfig = IncdOnboardingFlowConfiguration() flowConfig.addIdScan() IncdOnboardingManager.shared.startOnboardingSection(flowConfig: flowConfig, sectionTag: "MyTag", delegate: self) ``` ## Migration to 4.7.1 - Colors passed to `IncdTheme` are not `UIColor` instead of `CGColor`. For more information please visit [IncdTheme Guide](/sdk-reference/ios-customization/#customize-theme-colors-and-fonts). ## Migration to 4.5.0 - Added `CustomComponents` to `IncdTheme` which holds a UI customization configuration for the Camera Feedback View. For more information please visit [IncdTheme Guide](/sdk-reference/ios-customization/#customize-theme-colors-and-fonts). - Changed several localization keys to match style and consistency: ``` "incdOnboarding.btnCancel" -> "incdOnboarding.global.button.cancel" "incdOnboarding.btnContinue" -> "incdOnboarding.global.button.continue" "incdOnboarding.btnDone" -> "incdOnboarding.global.button.done" "incdOnboarding.btnNext" -> "incdOnboarding.global.button.next" "incdOnboarding.dialog.cameraPermissionsBtnOpenSettings" -> "incdOnboarding.global.dialog.cameraPermissionsBtnOpenSettings" "incdOnboarding.dialog.cameraPermissionsMandatorySubtitle" -> "incdOnboarding.global.dialog.cameraPermissionsMandatorySubtitle" "incdOnboarding.dialog.cameraPermissionsMandatoryTitle" -> "incdOnboarding.global.dialog.cameraPermissionsMandatoryTitle" "incdOnboarding.dialog.ok" -> "incdOnboarding.global.dialog.ok" "incdOnboarding.dialog.permission.finishProcess" -> "incdOnboarding.global.dialog.permission.finishProcess" "incdOnboarding.err.oooops.msg" -> "incdOnboarding.global.error.generic.message" "incdOnboarding.err.oooops.title" -> "incdOnboarding.global.error.generic.title" "incdOnboarding.processing" -> "incdOnboarding.global.processing" "incdOnboarding.uploading" -> "incdOnboarding.global.uploading" "incdOnboarding.qr.scanningDone" -> "incdOnboarding.qr.scanning_done" "incdOnboarding.qr.scanningError" -> "incdOnboarding.qr.scanning_error" "incdOnboarding.govValidation.inProgress" -> "incdOnboarding.govValidation.in_progress" "incdOnboarding.govValidation.startedSuccessfully" -> "incdOnboarding.govValidation.startedSuccessfully" "incdOnboarding.govValidation.success" -> "incdOnboarding.govValidation.success" "incdOnboarding.govValidation.failure" -> "incdOnboarding.govValidation.failure" "incdOnboarding.govValidation.error.connection" -> "incdOnboarding.govValidation.connection_error" "incdOnboarding.govValidation.error.ineInfrastructure" -> "incdOnboarding.govValidation.ine_infrastructure_error" "incdOnboarding.govValidation.error.moduleNotSupported" -> "incdOnboarding.govValidation.module_not_supported_error" "incdOnboarding.govValidation.error.missingDocumentIdentifier" -> "incdOnboarding.govValidation.missing_document_identifier_error" "incdOnboarding.govValidation.error.missingSelfie" -> "incdOnboarding.govValidation.missing_selfie_error" "incdOnboarding.govValidation.error.userNotFound" -> "incdOnboarding.govValidation.user_not_found_error" "incdOnboarding.govValidation.error.userNotInDatabase" -> "incdOnboarding.govValidation.user_not_in_database" "incdOnboarding.govValidation.error.insufficientLookupData" -> "incdOnboarding.govValidation.insufficient_lookup_data" ``` For the full instructions on the localization please visit [SDK Customization](/sdk-reference/ios-customization/#localize-display-text). ## Migration to 4.1.0 - Updated Document Scan flow that supports the option to upload a PDF or image from the device. Potentially breaking change: `.document` is now `.addressStatement`. - Tutorials for Document Scan are now disabled by default, and the document provider screen is enabled by default. Many of the texts have been updated so please take a look at the full list [here](/sdk-reference/ios-customization/#localize-display-text). ## Migration to 4.0.0 - Individual functions are removed: - Please use sections API instead and add a module via `IncdOnboardingFlowConfiguration.add()` method. - Removed any deprecated API which was using parameter `vc: UIViewController`. Please switch to the same functioins without the `vc` parameter. - If you are using ID Scan module, it is required to switch to a new result structure `IdScanResult`. Check [User Guide](/sdk-reference/ios-sdk/) for more info. ## Migration from 1.10.x to 1.11.0 For version 1.11.0 ID and Selfie capture are customized via IncdTheme. If you are using UI customization please visit [IncdTheme Guide](/sdk-reference/ios-customization/#customize-theme-colors-and-fonts). - New option - Allow users to cancel ID or Selfie capture by showing close (X) button: ``` IncdOnboardingManager.shared.allowUserToCancel ``` Default is `false`. ## Migration from 1.9.x to 1.10.x `vc: UIViewController` parameter is now deprecated in most of calls. Please assign the `vc:` parameter to `IncdOnboardingManager.shared.presentingViewController` and remove the `vc:` parameter from the API. Example: 1.9.x ``` IncdOnboardingManager.shared.startOnboarding(vc: self) ``` 1.10.x ``` IncdOnboardingManager.shared.presentingViewController = self IncdOnboardingManager.shared.startOnboarding() ``` ## Project Migration Guide from 1.9.42 to 1.9.46 Framework is now being delivered as a static IncdOnboarding.xcframework, so that only `opencv2` and `OpenTok` frameworks need to be added to the project alongside main `IncdOnboarding.xcframework` ### Make sure `git lfs` is installed Some framework files exceed 100MBs, so Git Large File Storage is needed to be setup. Please find the instrcutions here: https://docs.github.com/en/github/managing-large-files/versioning-large-files/installing-git-large-file-storage ### Framework files update - Remove IncdNetwork, IncdFaceDetection, IncdRecogKit, IncdUIKit frameworks and IncdUIKit.bundle (also remove any imports in code from these modules if you have them) - Add opencv2.framework - Replace current OpenTok.framework and IncdOnboarding.xcframework - Replace current IncdOnboarding.bundle ### Change Project Settings 1. Add following to the `Other Linker Flags`: `-l “stdc++” -l “iconv” - framework “VideoToolbox”` 2. IncdOnboarding.xcframework, opencv2.framework and OpenTok.framework should be set to `Do not Embed’` ### Code updates Error handling has been improved and simplifed, in particular: - `IncdOnboardingDelegate` and its `onError` callback now return `IncdFlowError` instead of `IncdOnboardingError`. You'll be notified here about all the possible errors that abort the flow. - `IncdOnboardingDeletegate` and some of its callback methods once the steps are completed no longer have `ResultCode` field used to determine if the step finished successfully or not. You can always check if the `error` field in the result is `nil` to identify successful step completion, or see if some error occured. ## 1.9.14 -> 1.9.25 ### Migration steps: Moving ID auto-capture timeouot configuration to server. 1. Remove `idAutoCaptureTimeout` parameter if present anywhere. Timeout can be set on server through REST API. ## 1.8.x -> 1.9.14 ### Migration steps: 1. Remove OpenTok from Cocoapods. If that was your only Pod then you can deintegrate Cocoapods altogether. 2. Remove the “models” folder from the project and from the file system. 3. Remove the “models” from the target’s “Build Phases” -> “Copy Bundle Resources” section. ## 1.6.x -> 1.8.x ### Migration steps: 1. Document type `.addressproof` has been renamed to `.document` for scanning documents using `addDocumentScan(: DocumentType)`. 2. Usage of `IncdRegion` is deprecated. `IncdOnboardingConfiguration` init now takes a `regionCode: String` as a parameter. Before it was `IncdRegion`. --- - Path: `release-notes/migration-guide` - URL: https://developer.incode.com/release-notes/migration-guide/ - Markdown: https://developer.incode.com/release-notes/migration-guide.md # Migration Guide version 5+ ## Welcome SDK Migration from V5.50.0 to 5.51.0 > If you are managing dependency versions manually (without the BOM), refer to the Module Versions section in the [release notes](/release-notes/releases-android-sdk/) for the updated version numbers. ### 1. Minimum Kotlin version raised to 2.2.x The SDK is now compiled with Kotlin 2.2.21 (up from 1.9.25), to support the OkHttp/logging-interceptor 5.3.2 upgrade. Any module that compiles Kotlin source with the SDK on its classpath must be able to read the SDK's Kotlin metadata, so your project's Kotlin Gradle plugin must be **2.2.x or newer**. This applies regardless of whether your code calls SDK Kotlin APIs directly - having the SDK on the classpath of a Kotlin compilation is enough to require the newer compiler. Pure-Java modules are unaffected. No source-level API changes are required on your side - this only affects the minimum Kotlin compiler/plugin version your own build must use. ```groovy plugins { id 'org.jetbrains.kotlin.android' version '2.2.21' } ``` ### 2. Add the required packaging exclusion for OkHttp 5.3.2's duplicate OSGi manifest OkHttp/logging-interceptor 5.3.2's JPMS module-info jar and the JSpecify jar (a transitive dependency) both ship an identical OSGi manifest at `META-INF/versions/9/OSGI-INF/MANIFEST.MF`. Any app that assembles an APK with OkHttp/logging-interceptor 5.3.2 on its classpath **will** hit a duplicate-resource packaging error from this collision, unless that path is already excluded for another reason. This is a required step for adopting this SDK version, not a fallback for if you happen to see the error - add it to your app's `build.gradle`: ```groovy android { packaging { resources { excludes += ['META-INF/versions/9/OSGI-INF/MANIFEST.MF'] } } } ``` This exclusion only drops the OSGi manifest (unused at runtime) and dedups *any* jar colliding on that path, so it also covers future additions (for example, if BouncyCastle is upgraded later and collides on the same manifest). ### 3. Upgrade compileSdk With the update of the internal CameraX and Kotlin dependencies, you will need to upgrade your project's `compileSdk` to level 36: ```groovy compileSdk 36 ``` ### 4. Update Android Gradle Plugin (AGP) Bumping `compileSdk` to 36 requires Android Gradle Plugin (AGP) `8.9.1` or higher. Update your project-level `build.gradle` or `settings.gradle` file to use the new plugin version. ```groovy classpath "com.android.tools.build:gradle:8.9.1" ``` ### 5. Update Gradle Wrapper AGP `8.9.1` requires Gradle `8.14.5` or higher. Update your Gradle wrapper configuration in `gradle/wrapper/gradle-wrapper.properties`: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.5-bin.zip ``` ### 6. Migrate to the Kotlin Compose compiler plugin The SDK now uses the standalone `org.jetbrains.kotlin.plugin.compose` Gradle plugin (introduced with Kotlin 2.x) instead of `composeOptions.kotlinCompilerExtensionVersion`. If your app configures Compose compilation via `composeOptions`, migrate to the new plugin: **Before:** ```groovy android { buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion "1.5.15" } } ``` **After:** ```groovy plugins { id 'org.jetbrains.kotlin.plugin.compose' version '2.2.21' } android { buildFeatures { compose = true } // composeOptions block is no longer needed } ``` ### 7. Upgrade kotlinx-coroutines to 1.9.0 CameraX 1.6.1 requires `kotlinx-coroutines` 1.9.0 or higher. Upgrade your coroutines dependency to at least this version: ```groovy implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0' ``` ### 8. Room bumped to 2.8.4 The SDK's internal local storage (Room) is upgraded from 2.6.1 to 2.8.4, to support KSP2 codegen under the Kotlin 2.2.x compiler. Room is used internally only - it is not part of the SDK's public API - so no action is required on your side. ### 9. `deviceStats` removed from `Result` classes that never populated it The `deviceStats` field has been removed from `BaseResult`. It is now declared only on `IdScanResult` and `SelfieScanResult` - the only results that ever carried it. Every other `*Result` class (e.g. `FaceMatchResult`, `VideoSelfieResult`, `EKYCResult`, `NfcScanResult`) no longer exposes a `deviceStats` field. If you read `deviceStats` from an `IdScanResult` or `SelfieScanResult`, no change is required. If you read it from any other result type, remove that access - those results always returned the default `DeviceStats(motionStatus = Status.UNCLEAR)` and never carried real device data. **Kotlin - before:** ```kotlin val motion = faceMatchResult.deviceStats.motionStatus // always UNCLEAR ``` **Kotlin - after:** ```kotlin // deviceStats is available only on IdScanResult and SelfieScanResult val motion = idScanResult.deviceStats.motionStatus ``` **Java - before:** ```java Status motion = faceMatchResult.deviceStats.getMotionStatus(); // always UNCLEAR ``` **Java - after:** ```java // deviceStats is available only on IdScanResult and SelfieScanResult Status motion = idScanResult.deviceStats.getMotionStatus(); ``` ### 10. `QES` constructor is no longer public - use `QES.Builder` The `QES` module is now constructed exclusively through `QES.Builder`, matching the other onboarding modules. The direct constructor is no longer accessible, and it also gained new parameters (`uploadDocument`, `providerCode`) in this release, so any previous positional call such as `QES(true)` would have silently changed meaning - the compile error steers you to the unambiguous `QES.Builder` instead. **Kotlin - before:** ```kotlin FlowConfig.Builder() .addQES(QES(true)) ``` **Kotlin - after:** ```kotlin FlowConfig.Builder() .addQES( QES.Builder() .setDownloadDocument(true) .build() ) ``` **Java - before:** ```java new FlowConfig.Builder() .addQES(new QES(true)); ``` **Java - after:** ```java new FlowConfig.Builder() .addQES( new QES.Builder() .setDownloadDocument(true) .build() ); ``` ### 11. `Status` enum gains `UNSUPPORTED` and `COULD_NOT_COMPLETE` values `Status` gains two new constants, `UNSUPPORTED` and `COULD_NOT_COMPLETE`. `DeviceStats.motionStatus` never emits the new values, so existing runtime behavior for `DeviceStats.motionStatus` is unchanged. It is source-breaking in Kotlin if you do an exhaustive `when` over `Status` without an `else` branch - such code will now fail to compile until it handles the new constants. A plain Java `switch` statement does not fail to compile when constants are added; it compiles and silently falls through to `default` (or does nothing if there is no `default`), so any Java `switch` over `Status` should add explicit handling for the new values to avoid silently mishandling them. **Kotlin - before:** ```kotlin val label = when (status) { Status.PASS -> "pass" Status.FAIL -> "fail" Status.UNCLEAR -> "unclear" } ``` **Kotlin - after:** ```kotlin val label = when (status) { Status.PASS -> "pass" Status.FAIL -> "fail" Status.UNCLEAR -> "unclear" Status.UNSUPPORTED -> "unsupported" Status.COULD_NOT_COMPLETE -> "could not complete" } ``` **Java - before:** ```java String label; switch (status) { case PASS: label = "pass"; break; case FAIL: label = "fail"; break; case UNCLEAR: label = "unclear"; break; default: label = "unknown"; } ``` **Java - after:** ```java String label; switch (status) { case PASS: label = "pass"; break; case FAIL: label = "fail"; break; case UNCLEAR: label = "unclear"; break; case UNSUPPORTED: label = "unsupported"; break; case COULD_NOT_COMPLETE: label = "could not complete"; break; default: label = "unknown"; } ``` ### 10. Minimum Compose Material3 and Compose versions raised to 1.4.0 / 1.8.0 The SDK's Compose-based (V2) screens are now built against **Compose Material3 1.4.0** and **Compose 1.8.0** (foundation / UI). This is not a change to any SDK API - your Kotlin/Java integration code is unaffected - but it raises the minimum versions of these libraries your app must resolve. Because Compose reaches your app transitively and Gradle resolves it with *highest-version-wins*, an app that resolves an older Compose Material3 / Compose set crashes at runtime (`NoSuchMethodError` / `NoClassDefFoundError` in `androidx.compose.*`) when opening a V2 screen such as the phone-number input, a dynamic-form dropdown or date field, or the CURP screen. Most projects need no action: any app or dependency that pulls Compose Material3 1.4.0 (which itself depends on Compose 1.8.0+) already satisfies this. Act only if you have explicitly pinned these libraries below the required versions - remove the pin or raise it. The two floors are coupled, so aligning Material3 also pulls a compatible Compose set. ## Welcome SDK Migration from V5.49.0 to 5.50.0 > If you are managing dependency versions manually (without the BOM), refer to the Module Versions section in the [release notes](/release-notes/releases-android-sdk/) for the updated version numbers. ### 1. Replace `setVideoLivenessRecordingEnabled()` with `setDeepsightConfiguration()` `SelfieScan.Builder.setVideoLivenessRecordingEnabled()` is deprecated in favor of `setDeepsightConfiguration()`, available on both `SelfieScan.Builder` and `FaceAuthentication.Builder`. > **Note:** Applies to both `SelfieScan` and `FaceAuthentication`. | Old | New equivalent | |-----|----------------| | `setVideoLivenessRecordingEnabled(false)` | `setDeepsightConfiguration(DeepsightConfiguration.Builder().setModality(DeepsightConfiguration.Modality.SINGLE_FRAME).build())` | | `setVideoLivenessRecordingEnabled(true)` | `setDeepsightConfiguration(DeepsightConfiguration.Builder().setModality(DeepsightConfiguration.Modality.VIDEO_LIVENESS).build())` | The new API also exposes the `MULTIMODAL` modality (depth data collected, no video recording) and a `setMotionEnabled()` flag, which previously had no SDK equivalent. **Before (deprecated):** ```kotlin SelfieScan.Builder() .setVideoLivenessRecordingEnabled(true) .build() ``` **After:** ```kotlin SelfieScan.Builder() .setDeepsightConfiguration( DeepsightConfiguration.Builder() .setModality(DeepsightConfiguration.Modality.VIDEO_LIVENESS) .build() ) .build() ``` Java: ```java new SelfieScan.Builder() .setDeepsightConfiguration( new DeepsightConfiguration.Builder() .setModality(DeepsightConfiguration.Modality.VIDEO_LIVENESS) .build() ) .build(); ``` ## Welcome SDK Migration from V5.48.0 to 5.49.0 > If you are managing dependency versions manually (without the BOM), refer to the Module Versions section in the [release notes](/release-notes/releases-android-sdk/) for the updated version numbers. ### 1. Renamed `neutral` and `black` color palette tokens To align the V2 theme JSON with iOS so a single configuration file works across both platforms, the `neutral` and `black` keys in `IncodeColorPalette` have been renamed: * `neutral` -> `neutralLight` * `black` -> `neutralDark` If you previously customized these colors via Kotlin: ```kotlin IncodeWelcome .getInstance() .setCommonConfig( CommonConfig.Builder() .setThemeConfig( IncodeThemeConfig( colorPalette = IncodeColorPalette( neutral = Color(0xFFFFFFFF), black = Color(0xFF000000) ) ) ) .build() ) ``` update the parameter names: ```kotlin IncodeWelcome .getInstance() .setCommonConfig( CommonConfig.Builder() .setThemeConfig( IncodeThemeConfig( colorPalette = IncodeColorPalette( neutralLight = Color(0xFFFFFFFF), neutralDark = Color(0xFF000000) ) ) ) .build() ) ``` If you provide the theme via a JSON config, rename the keys inside `colorPalette`: **Before** ```json { "colorPalette": { "neutral": "#FFFFFF", "black": "#000000" } } ``` **After** ```json { "colorPalette": { "neutralLight": "#FFFFFF", "neutralDark": "#000000" } } ``` Theme JSON that still uses the old `neutral` / `black` keys will silently fall back to the defaults (`#FFFFFF` and `#000000`), because unknown keys are ignored during parsing. Update your JSON to use the new keys to keep your customizations applied. ### 2. `SelfieScan.FaceAuthMode.SERVER` deprecated - migrate to `FaceAuthentication` `SelfieScan.FaceAuthMode.SERVER` is now deprecated. If your integration calls `SelfieScan.Builder().setFaceAuthMode(SelfieScan.FaceAuthMode.SERVER)`, migrate to the [`FaceAuthentication`](/features-and-modules/face-authentication) module instead. `SelfieScan.FaceAuthMode.LOCAL` (offline face login) and `startFaceLogin()` are not affected and remain fully supported. ### 3. Removed `IncodeWelcome.getReport(...)` and the `ReportListener` interface The `getReport(interviewId, ReportListener)` method on `IncodeWelcome`, the `ReportListener` callback interface, and the `ResponseEventReport` class have been removed. The backing `/omni/get/report` backend endpoint is deprecated and reports can no longer be generated through the SDK. There is no in-SDK replacement. If your integration previously invoked `IncodeWelcome.getReport(...)`, remove those calls: ```kotlin // No longer compiles - remove the call incodeWelcome.getReport(interviewId, object : ReportListener { override fun onReportFetched(uri: Uri?) { /* ... */ } override fun onError(error: Throwable) { /* ... */ } override fun onUserCancelled() { /* ... */ } }) ``` ```java // No longer compiles - remove the call incodeWelcome.getReport(interviewId, new ReportListener() { @Override public void onReportFetched(Uri uri) { /* ... */ } @Override public void onError(Throwable error) { /* ... */ } @Override public void onUserCancelled() { /* ... */ } }); ``` ### 4. `DocumentScan.Builder` chooser flags deprecated for V2 - migrate to `setDocumentSources(...)` With the V2 `Document Capture` module enabled, `DocumentScan.Builder.setShowTutorials(...)` and `DocumentScan.Builder.setShowDocumentProviderOptions(...)` no longer affect the flow. The V2 module always opens on an intro screen and configures its source chooser exclusively via the new `setDocumentSources(...)` method. Both flags remain honored in V1. If you previously used `setShowDocumentProviderOptions(false)` to send the user straight to the camera, configure a single-source set instead: **Kotlin - before:** ```kotlin DocumentScan.Builder() .setDocumentType(DocumentType.ADDRESS_STATEMENT) .setShowDocumentProviderOptions(false) .setShowTutorials(false) .build() ``` **Kotlin - after:** ```kotlin DocumentScan.Builder() .setDocumentType(DocumentType.ADDRESS_STATEMENT) .setDocumentSources(setOf(DocumentScan.DocumentSource.CAMERA)) .build() ``` **Java - before:** ```java new DocumentScan.Builder() .setDocumentType(DocumentType.ADDRESS_STATEMENT) .setShowDocumentProviderOptions(false) .setShowTutorials(false) .build(); ``` **Java - after:** ```java Set sources = new HashSet<>(); sources.add(DocumentScan.DocumentSource.CAMERA); new DocumentScan.Builder() .setDocumentType(DocumentType.ADDRESS_STATEMENT) .setDocumentSources(sources) .build(); ``` Pass any non-empty subset of `CAMERA`, `FILE_UPLOAD`, and `IMAGE_UPLOAD` to control which submission methods appear on the chooser. For document types that don't accept PDFs (e.g. `DocumentType.MEDICAL_DOC`), `FILE_UPLOAD` is dropped at runtime only when another source remains; configuring exactly `setOf(DocumentScan.DocumentSource.FILE_UPLOAD)` on such a type is rejected with a configuration error before the flow launches, so confirm a camera or image source remains for those document types. ## Welcome SDK Migration from V5.47.0 to 5.48.0 > If you are managing dependency versions manually (without the BOM), refer to the Module Versions section in the [release notes](/release-notes/releases-android-sdk/) for the updated version numbers. ### 1. Changed default values for face capture checks in `SelfieScan` and `VideoSelfie` modules The defaults for `setHeadCoverCheckEnabled(...)` and `setMaskCheckEnabled(...)` on both `SelfieScan.Builder` and `VideoSelfie.Builder` have been changed from `false` to `true`. If you did not previously configure these flags, head cover and face mask validation will now be enforced by default during face capture. To preserve the previous behavior, explicitly disable them on the builder(s) you use: ```kotlin SelfieScan.Builder() .setHeadCoverCheckEnabled(false) .setMaskCheckEnabled(false) .build() VideoSelfie.Builder() .setHeadCoverCheckEnabled(false) .setMaskCheckEnabled(false) .build() ``` ```java new SelfieScan.Builder() .setHeadCoverCheckEnabled(false) .setMaskCheckEnabled(false) .build(); new VideoSelfie.Builder() .setHeadCoverCheckEnabled(false) .setMaskCheckEnabled(false) .build(); ``` ### 2. SQLCipher attribution required if you ship an open-source licenses screen Local Room databases used by the SDK are now encrypted at rest with [SQLCipher for Android](https://github.com/sqlcipher/sqlcipher-android), distributed under a BSD-style license. The license requires consumers that redistribute binaries (i.e. your application) to reproduce its copyright notice "in the documentation and/or other materials provided with the distribution". If your application includes an "Open Source Licenses" screen, please add the SQLCipher notice listed in [Licenses](/sdk-reference/android-licenses). No code change is needed if you do not ship such a screen. ## Welcome SDK Migration from V5.45.0 to 5.45.1 > If you are managing dependency versions manually (without the BOM), refer to the Module Versions section in the [release notes](/release-notes/changelog-special/) for the updated version numbers. ## Welcome SDK Migration from V5.44.0 to 5.45.0 > If you are managing dependency versions manually (without the BOM), refer to the Module Versions section in the [release notes](/release-notes/changelog-special/) for the updated version numbers. ### 1. Updates to document chooser behavior in `IdScan` module The visibility of the document chooser screen is now controlled only by the "Show document chooser screen" flag on the Dashboard or `setShowIdTypeChooser(...)` in the SDK. * When using startFlow / startWorkflow, the Dashboard setting is respected. * When using startOnboarding / startOnboardingSection, the Dashboard setting is ignored and visibility is controlled exclusively via setShowIdTypeChooser(...). Setting `idType` alone no longer hides the chooser and will be ignored. If you previously pre-set `idType` (either using `builder.setIdType(...)` in the SDK or via the Dashboard) and expected the chooser to be hidden, you must now explicitly disable it or update the Flow configuration accordingly: ```kotlin IdScan.Builder() .setIdType(IdScan.IdType.ID) .setShowIdTypeChooser(false) .build() ``` ```java new IdScan.Builder() .setIdType(IdScan.IdType.ID) .setShowIdTypeChooser(false) .build(); ``` ### 2. Color palette changes If you previously customized the application appearance by updating these colors from the color palette: ```kotlin IncodeWelcome .getInstance() .setCommonConfig( CommonConfig.Builder() .setThemeConfig( IncodeThemeConfig( colorPalette = IncodeColorPalette( negative500 = Color(0xffff5a5f), negative600 = Color(0xffe71111), positive500 = Color(0xff189f60), positive600 = Color(0xff189f60) ) ) ) .build() ) ``` or using a config JSON: ```json { "colorPalette": { "negative500": "#FF5A5F", "negative600": "#E71111", "positive500": "#189F60", "positive600": "#189F60" } } ``` These keys have now been migrated to the following values: * `negative500` -> `negative400` * `negative600` -> `negative500` * `positive500` -> `positive400` * `positive600` -> `positive500` The mentioned colors are used for the following Color Modes: * `Icon/Status/Negative` * `Icon/Status/Positive` * `Surface/Status/Positive` * `Border/Status/Negative Static` * `Border/Status/Positive Static` ### 3. `ID Capture` V2 - Error Screen Customization **Wrong document side customization:** If you previously customized the `Wrong document side` error screen, add the following new string resources: **Add these strings:** ```xml Capture the front side of the ID Capture the back side of the ID ``` **Previous string:** ```xml You’ve scanned the wrong document side. Please scan your document again. ``` This string is no longer used. **No internet connection customization:** If you previously customized the `No internet connection` error screen, add the following new string resource: **Add this string:** ```xml No internet connection ``` **Previous string:** ```xml There was a problem ``` The previously used string is still in use for other error screens and should be kept in your resources. **Retry button customization:** The retry button is now customized using a different string resource: ```xml Refresh ``` **Previous string:** ```xml Retry ``` The previously used string is still in use for other error screens and should be kept in your resources. ### 4. `Selfie` V2 - Error Screen Customization **No internet connection customization:** If you previously customized the `No internet connection` error screen, add the following new string resource: **Add this string:** ```xml No internet connection ``` **Previous string:** ```xml There was a problem ``` The previously used string is still in use for other error screens and should be kept in your resources. #### 5. Changes in behavior for device environment detection The behavior when detecting device environment vulnerabilities has changed: * **Hook or virtual environment detection**: Detecting hook or virtual environment vulnerabilities in the SDK triggers a native crash, which cannot be caught or handled by application code, resulting in immediate app termination. * **Emulator and root detection**: The flow is not aborted when emulator and root checks are detected. The onboarding process continues normally. ### 6. API Changes #### 6.1 The following `IncodeWelcome.Builder` methods have been removed ```kotlin IncodeWelcome.Builder.disableVirtualEnvironmentDetection() IncodeWelcome.Builder.disableRootDetection() IncodeWelcome.Builder.disableEmulatorDetection() IncodeWelcome.Builder.disableHookCheck() ``` ```java IncodeWelcome.Builder.disableVirtualEnvironmentDetection() IncodeWelcome.Builder.disableRootDetection() IncodeWelcome.Builder.disableEmulatorDetection() IncodeWelcome.Builder.disableHookCheck() ``` If you were using these methods in your code, remove them from your `IncodeWelcome.Builder` configuration as device environment checks can no longer be disabled. #### 6.2 The following exceptions have been removed The following specific exceptions that extended `DeviceEnvironmentException` have been removed: ```kotlin com.incode.welcome_sdk.commons.exceptions.IncodeException.EmulatorDetectedException com.incode.welcome_sdk.commons.exceptions.IncodeException.RootDetectedException com.incode.welcome_sdk.commons.exceptions.IncodeException.HookDetectedException com.incode.welcome_sdk.commons.exceptions.IncodeException.VirtualEnvironmentDetectedException ``` If you were checking for these `Exceptions` in your code, remove any specific handling of them as your app will no longer get this direct feedback. ### 7. Expected crashes when running in a virtual environment It is expected that the app crashes with the following stacktraces when a virtual environment is used. For example: ``` java.lang.NullPointerException at com.incode.welcome_sdk.ThemeConfiguration$Builder.setLabelSmallStyle(SourceFile:1066) at com.incode.welcome_sdk.f.c(SourceFile:150) at com.incode.welcome_sdk.data.local.m.as(SourceFile:22) at com.incode.welcome_sdk.IncodeWelcome.startOnboardingSection(SourceFile:18) ``` ``` java.lang.NullPointerException: Attempt to get length of null array at com.incode.welcome_sdk.data.IncodeWelcomeRepository.d(SourceFile:320) at com.incode.welcome_sdk.data.IncodeWelcomeRepository.i(SourceFile:214) ``` ### 8. `Selfie` V2 - No Internet Error Screen Retry Button Change **Retry button customization:** The retry button label shown on the Selfie Scan no internet error screen now uses a dedicated string resource: ```xml Refresh ``` **Previous string:** ```xml Try again ``` If you override `onboard_sdk_try_again` to customize the retry button on the no internet screen, you must now override `onboard_sdk_face_scan_retry` instead. The `onboard_sdk_try_again` string is still used for other retry scenarios. ### 9. `Selfie` V2 - Capture-Only Mode Success Screen Text Change **Success label customization:** In capture-only mode, the Selfie Scan success screen now uses a different string resource: ```xml Face captured! ``` **Previous string:** ```xml Success! ``` The previously used string is still in use for non-capture-only mode and should be kept in your resources. ### 7. `ID Capture` and `Selfie` V2 - Permission Open Settings Screen Text Change **Open settings button customization:** The Open settings label shown on the Permission open settings screen now uses a dedicated string resource: ```xml Allow permission ``` **Previous string:** ```xml Open settings ``` The previously used string is still in use for the `Geolocation` module and should be kept in your resources. ## Welcome SDK Migration from V5.43.0 to 5.44.0 ### 1. Upgrade dependencies #### Consider migrating to the Incode BOM To help facilitate easier version upgrades, 5.44.0 introduces the Incode Bill of Materials (BOM). This can be used to upgrade all relevant Incode library dependencies from one place instead of multiple steps to upgrade library dependency versions. To get started, Replace: ```groovy implementation 'com.incode.sdk:welcome:5.43.0' implementation 'com.incode.sdk:core-light:3.0.7' ``` ```kotlin implementation("com.incode.sdk:welcome:5.43.0") implementation("com.incode.sdk:core-light:3.0.7") ``` With: ```groovy implementation platform('com.incode.sdk:bom:5.44.0') implementation 'com.incode.sdk:welcome' implementation 'com.incode.sdk:core-light' // Plus any other Incode SDK dependencies... (without the version numbers) ``` ```kotlin implementation(platform("com.incode.sdk:bom:5.44.0")) implementation("com.incode.sdk:welcome") implementation("com.incode.sdk:core-light") // Plus any other Incode SDK dependencies... (without the version numbers) ``` See the [Incode Bill of Materials (BOM) section of the Setup Guide](/sdk-reference/android-installation#add-the-incode-bill-of-materials-bom) for more info. #### or, Upgrade dependencies manually If you prefer to continue updating all dependencies manually, be sure to update `welcome` as usual: ```groovy implementation 'com.incode.sdk:welcome:5.44.0' ``` ```kotlin implementation("com.incode.sdk:welcome:5.44.0") ``` and update the `core-light` dependency to the latest version: ```groovy implementation 'com.incode.sdk:core-light:3.0.8' ``` ```kotlin implementation("com.incode.sdk:core-light:3.0.8") ``` ### 2. Upload Digital ID V2 **Upload error screen customization:** If you previously customized the upload error screen, add the following new string resource: **Add this string:** ```xml Scan your ID ``` **Previous string:** ```xml Scan your ID ``` This string is now used only for customizing the ID Capture V2 tutorial screen title. ### 3. DocumentType has moved The `DocumentType` class has been moved from the `com.incode.welcome_sdk.ui.camera.id_validation.base` package to `com.incode.welcome_sdk.data`. Replace the following `import` statement ```kotlin com.incode.welcome_sdk.ui.camera.id_validation.base.DocumentType ``` with ```kotlin com.incode.welcome_sdk.data.DocumentType ``` ### 4. Package name change: `selfie_scan` renamed to `selfie_capture` The package name `selfie_scan` has been renamed to `selfie_capture`. Update all imports from `com.incode.welcome_sdk.ui.selfie_scan.*` to `com.incode.welcome_sdk.ui.selfie_capture.*` throughout your codebase. This change was required due to DexGuard constraints around package naming and obfuscation. ### 5. Transition/Loading screen removed The transition/loading screen that was shown between modules has been completely removed. If your integration had any customization for this screen (e.g., overriding `onboard_sdk_activity_transition.xml`, setting `IncodeTransitionScreenState.isEnabled`, or customizing transition string resources), those customizations can be safely deleted. ### 6. Migrate any custom `ThemeConfiguration` to the V2 equivalent If your previous integration had any UI customization in supported modules through [Theme Configuration](/sdk-reference/android-customization#configure-v2-theme-and-ux), these customizations will now need to be migrated to the equivalents in UXv2. See the [Migrating Theme Configurations to UXv2 Guide](/sdk-reference/android-customization#configure-v2-theme-and-ux) for more details. ### 7. Changed default values in `FaceMatch` module config (optional) With the move to UxV2, the `showUserExists` config is now `false` by default. To preserve the old behavior, you can use: ```kotlin FaceMatch.Builder() .setShowUserExists(true) .build() ``` ```java new FaceMatch.Builder() .setShowUserExists(true) .build(); ``` ## Welcome SDK Migration from V5.42.0 to 5.43.0 ### 1. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:3.0.7' ``` ```kotlin implementation("com.incode.sdk:core-light:3.0.7") ``` ### 2. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:nfc:1.5.2' ``` ```kotlin implementation("com.incode.sdk:nfc:1.5.2") ``` ### 3. Update string resources for the "Need Help" screen in the `IdScan` v2 module The "Need Help" screen has been redesigned, and the customizable strings have been replaced. If you override any of the following strings in your app, replace them with the new ones listed below. No action is required if you do not override these strings. #### Replaced string resources Replace overrides of: ```xml Need help? Some considerations Take the photo manually Center your document in the frame The photo will be taken automatically Avoid blurriness on the document Zoom in and out, or tap on the document Avoid glare on the document Find a better lighting to avoid reflections Avoid darkness on the document Find a place with better lighting ``` with: ```xml Common issues Glare present Tilt the ID slightly up or down to minimize the reflection Blur present Move ID further away or closer to your phone until the image is focused Info is not readable Minimize camera shake by holding your phone steady @string/onboard_sdk_try_again ``` ### 4. API Changes `FaceAuthenticationResult.error` type changed from `FaceAuthenticationException?` to `Throwable?` to support non-domain failures. Consumers should no longer assume the error is a `FaceAuthenticationException`. ## Welcome SDK Migration from V5.41.0 to 5.42.0 ### 1. Upgrade compileSdk With the update of the internal CameraX dependencies, you will need to upgrade your project's `compileSdk` to level 35: ```groovy compileSdk 35 ``` ### 2. Update Android Gradle Plugin (AGP) Bumping `compileSdk` to 35 requires Android Gradle Plugin (AGP) `8.6.0` or higher. Update your project-level `build.gradle` or `settings.gradle` file to use the new plugin version. ```groovy classpath "com.android.tools.build:gradle:8.6.0" ``` ### 3. Update Gradle Wrapper AGP `8.6.0` requires Gradle `8.7` or higher. Update your Gradle wrapper configuration in `gradle/wrapper/gradle-wrapper.properties`: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip ``` ### 4. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:3.0.6' ``` ### 5. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:nfc:1.5.1' ``` ### 6. API changes #### 6.1 DeviceEnvironmentException is moved and extended The `DeviceEnvironmentException` class has been moved from the `com.incode.welcome_sdk.commons.exceptions` package to `com.incode.welcome_sdk.commons.exceptions.IncodeException`. Replace the following `import` statement ```kotlin com.incode.welcome_sdk.commons.exceptions.DeviceEnvironmentException ``` with ```kotlin com.incode.welcome_sdk.commons.exceptions.IncodeException.DeviceEnvironmentException ``` If you were catching `DeviceEnvironmentExceptions`, you can now also catch more specific exceptions that extend it: * `EmulatorDetectedException` * `RootDetectedException` * `HookDetectedException` * `VirtualEnvironmentDetectedException` #### 6.2 PermissionsDeniedException has been replaced Replace instances of ```kotlin com.incode.welcome_sdk.commons.exceptions.video_selfie.PermissionsDeniedException ``` with ```kotlin com.incode.welcome_sdk.commons.exceptions.IncodeException.PermissionNotGranted ``` #### 6.3 PermissionDeniedException has been replaced Replace instances of ```kotlin com.incode.welcome_sdk.commons.exceptions.PermissionDeniedException ``` with ```kotlin com.incode.welcome_sdk.commons.exceptions.IncodeException.PermissionNotGranted ``` #### 6.4 CameraPermissionDeniedException has been replaced Replace instances of ```kotlin com.incode.welcome_sdk.commons.exceptions.video_selfie.CameraPermissionDeniedException ``` with ```kotlin com.incode.welcome_sdk.commons.exceptions.IncodeException.PermissionNotGranted.CameraPermissionNotGranted ``` #### 6.5 MicrophonePermissionDeniedException has been replaced Replace instances of ```kotlin com.incode.welcome_sdk.commons.exceptions.video_selfie.MicrophonePermissionDeniedException ``` with ```kotlin com.incode.welcome_sdk.commons.exceptions.IncodeException.PermissionNotGranted.RecordAudioPermissionNotGranted ``` #### 6.6 ScreenRecordingPermissionDeniedException has been replaced Replace instances of ```kotlin com.incode.welcome_sdk.commons.exceptions.video_selfie.ScreenRecordingPermissionDeniedException ``` with ```kotlin com.incode.welcome_sdk.commons.exceptions.IncodeException.PermissionNotGranted.ScreenCapturePermissionNotGranted ``` #### 6.7 UnknownException has been renamed Replace instances of ```kotlin com.incode.welcome_sdk.commons.exceptions.IncodeException.UnknownException ``` with ```kotlin com.incode.welcome_sdk.commons.exceptions.IncodeException.GenericException ``` #### 6.8 The following unused exceptions have been removed ```kotlin com.incode.welcome_sdk.commons.exceptions.ApprovalForbiddenException com.incode.welcome_sdk.commons.exceptions.ExistingSessionException ``` ## Welcome SDK Migration from V5.40.x to 5.41.0 ### 1. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:3.0.5' ``` ### 2. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:nfc:1.5.0' ``` ### 3. API changes #### 3.1 Breaking change in SelfieScanListener The `SelfieScanListener` interface has been updated to include a new method: `onSelfieScanReady(NonUiSelfieScanController)`. This change requires all implementations of the `SelfieScanListener` interface to provide an implementation for this new method. If you don't use non-ui mode, you can leave the method empty. An example of build error: `does not override abstract method onSelfieScanReady(NonUiSelfieScanController) in SelfieScanListener` ## Welcome SDK Migration from V5.39.0 to 5.40.0 ### 1. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:3.0.4' ``` ### 2. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:nfc:1.4.4' implementation 'com.incode.sdk:video-streaming:1.6.0' implementation 'com.incode.sdk:extensions:1.2.1' implementation 'com.incode.sdk:model-face-recognition:3.5.1' implementation 'com.incode.sdk:model-id-face-detection:3.5.1' implementation 'com.incode.sdk:model-liveness-detection:3.2.1' ``` ### 3. minSdk changes If you use the `video-streaming` dependency, you need to upgrade your `minSdk` to 24 or higher. The requirement is coming from the `OpenTok` dependency, which now requires a minimum SDK version of 24. This update is necessary to ensure compatibility with the 16KB page size support mandated by Google starting from November 1st 2025. More info [here](https://developer.android.com/guide/practices/page-sizes). ## Welcome SDK Migration from V5.38.0 to 5.39.0 ### 1. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:3.0.3' ``` ### 2. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:extensions:1.2.0' implementation 'com.incode.sdk:nfc:1.4.3' ``` ### 3. Accessing `customerUUID` from the SDK In previous versions, it was possible (though unintended) to access the `customerUUID` via: ```kotlin IncodeWelcome.getInstance() .incodeWelcomeRepositoryComponent .incodeRepository .customerUUID ``` ```java IncodeWelcome.getInstance() .getIncodeWelcomeRepositoryComponent() .getIncodeRepository() .getCustomerUUID(); ``` This approach relied on internal SDK APIs that were not meant to be publicly accessible and has now been removed for better encapsulation and future-proofing. You should now obtain the `customerUUID` in the `onApproveComplete()` callback after the approval process: ```kotlin override fun onApproveCompleted(approveResult: ApproveResult) { // Store the `approveResult.uuid` in your app if needed } ``` ```java @Override public void onApproveCompleted(ApproveResult approveResult) { // Store the `approveResult.uuid` in your app if needed } ``` If your app needs to persist the `customerUUID`, it’s now your responsibility to store it in your own data layer. ### 4. Handling `metadata` from `IdScanResult` and `SelfieScanResult` When invoking certain Incode APIs externally that use these results, providing the `metadata` is now mandatory in the following scenario: * Deepsight is enabled. * Capture-Only mode is being used. The following Incode APIs require `metadata` in their request body in this scenario: * `omni/add/front-id/v2` * `omni/add/front-second-id/v2` * `omni/add/back-id/v2` * `omni/add/back-second-id/v2` * `omni/add/face/third-party` The `metadata` can be provided like so: ```bash curl --request POST \ --url https://demo-api.incodesmile.com/omni/add/face/third-party \ --header 'X-Incode-Hardware-Id: [YOUR_TOKEN_HERE]' \ --header 'accept: application/json' \ --header 'api-version: 1.0' \ --header 'content-type: application/json' \ --header 'x-api-key: [YOUR_API_KEY_HERE]' \ --data ' { "base64Image": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEB...", "metadata": "[ENCRYPTED_STRING_RETURNED_IN_SELFIE_SCAN_RESULT]", "faceCoordinates": { "leftEyeX": 1391.01, "leftEyeY": 1334.62, "rightEyeX": 918.383, "rightEyeY": 1359.96, "leftMouthX": 918.383, "leftMouthY": 1359.96, "rightMouthX": 918.383, "rightMouthY": 1359.96, "noseTipX": 918.383, "noseTipY": 1359.96, "x": 448, "y": 778, "width": 1366, "height": 1366 } } ' ``` ### 5. Handling the version of Sentry compiled into your app potentially changing This release migrates the version of Sentry used for SDK crash reporting from the JVM variant, `io.sentry:sentry`, to the Android-specific variant, `io.sentry:sentry-android`. As such, if your app also integrates the Android-specific variant of Sentry and uses a lower version than that included in the Omni SDK (7.19.0), by default, the final app will have 7.19.0 compiled in. ### 6. New font style used `SelfieScan` V2 The following font style are added and currently used in `SelfieScan` V2: ```xml onboard_sdk_FontFamilyBold_v2 onboard_sdk_FontFamilyMedium_v2 onboard_sdk_FontFamilyRegular_v2 ``` ### 7. Deprecated APIs The `FaceInfo` methods now include an optional `FaceEventListener` parameter for callbacks, and the older versions without this parameter are deprecated. ```kotlin IncodeWelcome.setFaces(faceInfoList: List) IncodeWelcome.addFace(faceInfo: FaceInfo) IncodeWelcome.removeFace(customerUUID: String) ``` ```java IncodeWelcome.setFaces(List faceInfoList); IncodeWelcome.addFace(FaceInfo faceInfo); IncodeWelcome.removeFace(String customerUUID); ``` Replace with: ```kotlin IncodeWelcome.setFaces(faceInfoList: List, faceEventListener: FaceEventListener?) IncodeWelcome.addFace(faceInfo: FaceInfo, faceEventListener: FaceEventListener?) IncodeWelcome.removeFace(customerUUID: String, faceEventListener: FaceEventListener?) ``` ```java IncodeWelcome.setFaces(List faceInfoList, FaceEventListener faceEventListener); IncodeWelcome.addFace(FaceInfo faceInfo, FaceEventListener faceEventListener); IncodeWelcome.removeFace(String customerUUID, FaceEventListener faceEventListener); ``` ### 8. Updated resource name If you wanted to customize the logo at the top of the `IdScan` and `Selfie` V2 modules, you needed to override the incode logo resource: `onboard_sdk_incode_logo.xml`. This resource was not intended to be customizable, so please update your customizations to the new resource name: `onboard_sdk_logo_header.xml`. By default, this resource contains the Incode logo, and you can customize it to your own. ## Welcome SDK Migration from V5.37.0 to 5.38.0 ### 1. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:3.0.2' ``` ### 2. Update string resources The following string has been removed. If your implementation previously customized it, it's safe to remove it: ```xml I would like to sign the displayed contract in a legally binding way by means of the ensuing signature procedures ``` ### 3. Creating a `DocumentScan` module Prior to the introduction of `Builder` classes for configuring modules in a `FlowConfig`, it was possible to create a `DocumentScan` module object directly. This approach is now deprecated. Instead, use `DocumentScan.Builder()` to configure the `DocumentScan` module in your `FlowConfig`. ## Welcome SDK Migration from V5.36.0 to 5.37.0 ### 1. Dependency removal The `qr-face-login` dependency is no longer available and has been removed in this version of the SDK. Please update your project configuration accordingly. Remove the `qr-face-login` dependency from your `build.gradle`: ```groovy implementation 'com.incode.sdk:qr-face-login:version' ``` Consequently, the following components have been removed from SDK: * The `startQrFaceLogin()` method from `IncodeWelcomeAPI` * The `QR_FACE_LOGIN` mode from `SelfieScan.Mode` * The `MissingQrFaceLoginDependencyException` from `com.incode.welcome_sdk.commons.exceptions` * The `QrFaceLoginListener` from `com.incode.welcome_sdk.listeners` ### 2. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:3.0.1' ``` ### 3. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:model-face-recognition:3.5.0' implementation 'com.incode.sdk:model-id-face-detection:3.5.0' ``` ### 4. Assisted Onboarding re-enabled for Face Capture/`SelfieScan` Integrators that were unable to upgrade to 5.36.0 due to Assisted Onboard being disabled can now upgrade to this version. The module configurations previously affected will behave as they did prior to 5.36.0. ### 5. Removed string resources The following strings have been removed while improving camera permission screens. Look for the `PermissionOnboarding` section in the [SDK Customization How-To Guide](/sdk-reference/android-customization#override-stringsxml) for which strings are eligible for customization: ```xml Note: Depending on your phone, it may say OK, Allow or While using the app OK, Allow or While using the app Allow Incode to take pictures and record video? Allow Only this time Don\'t allow Camera permission is required to capture your document Got it, allow permission Quit process ``` ## Welcome SDK Migration from V5.35.0 to 5.36.0 ### 1. Dependency removal The `camera` dependency is no longer available in this version of the SDK. This feature is now part of the `core-light` library. Please update your project configuration accordingly to avoid duplicated classes issues at compile-time. Remove the `camera` dependency from your `build.gradle`. ```groovy implementation 'com.incode.sdk:camera:version' ``` ### 2. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:3.0.0' ``` ### 3. Handling Assisted Onboarding being disabled for Face Capture/`SelfieScan` This release temporarily disables Assisted Onboarding for the `SelfieScan` module. Because of this, the following module configurations will show no effect: * Assisted Onboarding configuration in the Face Capture module on the Incode Dashboard * `SelfieScan.Builder().setAssistedOnboardingEnabled()` * `SelfieScan.Builder().setCameraFacing(CameraFacing.BACK)` As such, for integrators dependent on Assisted Onboarding functionality, do _NOT_ upgrade to this SDK version. Assisted Onboarding for Face Capture/`SelfieScan` will be restored in a future release. ## Welcome SDK Migration from V5.34.0 to 5.35.0 ### 1. Update minSdk Support for Android 5 (API levels 21 & 22) has been dropped. Please update your `minSdk` to 23 or higher. ```groovy minSdk 23 ``` ### 2. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:2.7.0' ``` ### 3. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:camera:1.1.1' implementation 'com.incode.sdk:nfc:1.4.1' implementation 'com.incode.sdk:qr-face-login:1.2.6' ``` ### 4. API Changes This release has some breaking API changes of note. #### 4.1 `ScreenRecordModule` If you were using the `ScreenRecordModule` object in your integration, this class has been renamed to `RecordModule` to represent types of recording outside of Screen Recording coming in a future release. Replace ```kotlin ScreenRecordModule ``` With ```kotlin RecordModule ``` #### 4.2 `DeviceFingerprintKt` If you were accessing the JSON representation of the `DeviceFingerprint` via `DeviceFingerprintKt.toJSON()`, this method has been moved inside the `DeviceFingerprint` class proper. Replace ```kotlin DeviceFingerprintKt.toJSON() ``` With ```kotlin DeviceFingerprint.toJSON() ``` ## Welcome SDK Migration from V5.33.0 to 5.34.0 ### 1. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:2.6.7' ``` ### 2. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:nfc:1.4.0' implementation 'com.incode.sdk:qr-face-login:1.2.5' ``` ### 3. API Changes The `deleteUserLocalData()` method has been converted to a static method. To update your code: Replace ```kotlin IncodeWelcome.getInstance().deleteUserLocalData() ``` With ```kotlin IncodeWelcome.deleteUserLocalData(context) ``` ## Welcome SDK Migration from V5.33.0 to 5.33.1-nu :::warning This SDK version contains variants, beta features and configurations specific for certain use cases. There is no need for anyone using a mainline SDK version to upgrade to this version unless discussed with your CSM. All relevant changes will be included in future standard releases. If Android Studio shows a warning about this new version being available, that can be safely ignored. If you have any questions, please contact your Incode representative. ::: ## Welcome SDK Migration from V5.32.0 to 5.33.0 ### 1. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:2.6.6' ``` ### 2. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:camera:1.1.0' implementation 'com.incode.sdk:qr-face-login:1.2.4' ``` ### 3. Dependency removal The `kiosk-login` dependency is no longer available and has been removed in this version of the SDK. Please update your project configuration accordingly. Remove the `kiosk-login` dependency from your `build.gradle`. ```groovy implementation 'com.incode.sdk:kiosk-login:version' ``` ### 4. Changes to callback methods Callback methods in the `OnboardingListener` that previously had nullable arguments (`?`) have been updated to use non-nullable arguments instead. The `onError` callback methods now also use a non-nullable `error: Throwable` argument. If your code defines nullable arguments (`?`) for these callbacks, you will need to remove the (`?`) to align with the updated interface. For example: Replace ```kotlin override fun onSelfieScanCompleted(selfieScanResult: SelfieScanResult?) {} override fun onError(error: Throwable?) {} ``` With ```kotlin override fun onSelfieScanCompleted(selfieScanResult: SelfieScanResult) {} override fun onError(error: Throwable) {} ``` ### Login mode `HYBRID` was removed The `FaceAuthMode#HYBRID` option has been removed, as it is no longer supported by our backend. Please replace with `FaceAuthMode#SERVER`. ## Welcome SDK Migration from V5.30.0 to 5.31.0 ### 1. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:2.6.5' ``` ### 2. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:camera:1.0.1' implementation 'com.incode.sdk:model-face-recognition:3.2.0' implementation 'com.incode.sdk:model-liveness-detection:3.2.0' ``` ## Welcome SDK Migration from V5.29.0 to 5.30.0 ### Transition to the New ID Capture Experience This feature is currently available in opt-in mode, controlled via a feature flag. To opt in, please contact the Customer Support team. ## Welcome SDK Migration from V5.28.0 to 5.29.0 ### Upgrade compileSdk With the update of the internal Compose dependencies, you will need to upgrade your project's compileSdk to level 34: ```groovy compileSdk 34 ``` ### Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:2.6.4' ``` ### Deprecated APIs The following methods have been deprecated and will be removed in a future release: ```kotlin VideoSelfie.Builder.setAssistedOnboardingEnabled() ``` ```java VideoSelfie.Builder.setAssistedOnboardingEnabled() ``` ### Transition to the New Video Selfie UI Experience With the introduction of the new Video Selfie UI experience and the removal of the old Video Selfie UI, certain string resources from `strings.xml` and JSON animation files have been removed. If you had previously customized the Video Selfie and Video Selfie Tutorial screens, please remove your customizations for the following resources: #### Video Selfie Tutorial Screen ```xml Let’s record a video Follow the instructions during the video @string/onboard_sdk_btn_continue ``` ``` onboard_sdk_lottie_tutorial_video_selfie.json ``` #### Video Selfie Screen ```xml Proof of Address Show your Proof of Address and then press Continue We need you to verbally confirm that you accept the terms Once you’ve answered, tap Continue:\ Once you’ve accepted, tap Continue: ``` ### Update string resources The following string has been used for the Review Your Photo screen subtitle: ```xml Make sure the letters are clear and it has good lighting ``` It's replaced with two new strings: ```xml Ensure that the text on the ID is readable The ID photo must be sharp and without glare ``` ### Deprecated styles The following style has been deprecated: ```java onboard_sdk_ScanFeedbackText ``` To maintain backward compatibility, it has been replaced with: ```java onboard_sdk_ScanFeedbackTextSmall ``` ### If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:kiosk-login:1.3.5' implementation 'com.incode.sdk:nfc:1.3.5' implementation 'com.incode.sdk:qr-face-login:1.2.3' ``` ### The vertical style of the Help screen in the `IdScan` module has been removed. The following customization will no longer work, and can be removed: ```xml true ``` ## Welcome SDK Migration from V5.26.0 to 5.26.2-compat :::warning This SDK version contain variants, beta features and configurations specific for certain use cases. There is no need for anyone using a mainline SDK version to upgrade to this version unless discussed with your CSM. All relevant changes will be included in future standard releases. If Android Studio shows a warning about this new version being available, that can be safely ignored. If you have any questions, please contact your Incode representative. ::: ## Welcome SDK Migration from V5.25.0 to 5.26.0 ### If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:nfc:1.3.4' implementation 'com.incode.sdk:qr-face-login:1.2.2' implementation 'com.incode.sdk:kiosk-login:1.3.3' ``` ### Changes in behavior #### IdScan and SelfieScan modules Old behavior: * Denying Camera or Microphone permissions in `IdScan` and `SelfieScan` modules results in an `onUserCancelled()` callback. New behavior: * Denying Camera or Microphone permissions in `IdScan` and `SelfieScan` modules now results in an `onError(PermissionDeniedException())` callback. ### Changes to `video-streaming` This release now requires a device to have more than 2GB of RAM to use `video-streaming`. If a device has exactly 2GB of RAM or less, and `streamFrames` is enabled, the setting will be ignored. ### API Changes The following field's type was changed from `String` to `String?` (nullable): `CurpValidationResult.curp`. ### Deprecated APIs The following methods have been deprecated and will be removed in a future release: ```java IncodeWelcome.fetchAllFlows(@NonNull String token, FetchFlowsListener fetchFlowsListener) IncodeWelcome.fetchFlow(String flowId, String token, FetchFlowListener fetchFlowListener) ``` ```kotlin IncodeWelcome.fetchAllFlows(token: String, fetchFlowsListener: FetchFlowsListener?) IncodeWelcome.fetchFlow(flowId: String?, token: String?, fetchFlowListener: FetchFlowListener?) ``` ## Welcome SDK Migration from V5.24.0 to 5.25.0 ### 1. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:2.6.3' ``` ### 2. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:nfc:1.3.3' implementation 'com.incode.sdk:qr-face-login:1.2.1' implementation 'com.incode.sdk:kiosk-login:1.3.2' ``` ### 3. Update string resources The following strings have been used for the Exit Confirmation dialog buttons, as well as for a couple of other screens: ```xml Yes No ``` The yes/no strings for the Exit Confirmation dialog buttons have now been replaced with the following strings: ```xml Quit Get back ``` If you customized the Exit Confirmation dialog buttons, please update your customizations to the new strings. ### Deprecated APIs The following methods have been deprecated and will be removed in a future release: ```java IncodeWelcome.fetchRegions(FetchRegionsListener fetchRegionsListener) SessionConfig.Builder.setRegionIsoCode(String regionIsoCode) IncodeWelcome.downloadLibraries() IncodeWelcome.isLibrariesReady() // Always returns true IncodeWelcome.subscribeForLibrariesReady(FaceRecognitionPrepareListener faceRecognitionReadyListener) ``` ```kotlin IncodeWelcome.fetchRegions(fetchRegionsListener: FetchRegionsListener) SessionConfig.Builder.setRegionIsoCode(regionIsoCode: String) IncodeWelcome.downloadLibraries() IncodeWelcome.isLibrariesReady() // Always returns true IncodeWelcome.subscribeForLibrariesReady(faceRecognitionReadyListener: FaceRecognitionPrepareListener?) ``` ### Changes to `OnboardingSessionListener` The `region` argument in `onOnboardingSessionCreated(String token, String interviewId, String region)` method is being deprecated. The value of `region` is now always `"ALL"`. This argument will be removed in a future release. ## Welcome SDK Migration from V5.23.0 to V5.24.0 ### If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:nfc:1.3.2' implementation 'com.incode.sdk:qr-face-login:1.2.0' ``` ### Changes in behavior #### Geolocation module Old behavior: * Denying Geolocation permission in `Geolocation` module results in `onUserCancelled()` callback. New behavior: * Denying Geolocation permission in `Geolocation` module now results in `onError(PermissionDeniedException())` callback. ### Changes to `CommonConfig` For configuring auto-capture timeouts in the `IdScan` and `SelfieScan` modules, replace the methods that were removed: ```java CommonConfig.Builder.setIdAutoCaptureTimeout() CommonConfig.Builder.setSelfieAutoCaptureTimeout() ``` ```kotlin CommonConfig.Builder.setIdAutoCaptureTimeout() CommonConfig.Builder.setSelfieAutoCaptureTimeout() ``` With the following methods: ```java IdScan.Builder.setIdAutoCaptureTimeout() SelfieScan.Builder.setSelfieAutoCaptureTimeout() ``` ```kotlin IdScan.Builder.setIdAutoCaptureTimeout() SelfieScan.Builder.setSelfieAutoCaptureTimeout() ``` Note that these methods are now parts of the respective modules' configurations. ### Changes to `ScreenName` class Renamed constants: ``` GEOLOCATION_PERMISSIONS_EXPLAINED -> GEOLOCATION GEOLOCATION_PERMISSIONS_DIALOGUE -> GEOLOCATION_PERMISSION_MANDATORY_DIALOG VIDEO_SELFIE_VOICE_CONSENT_PERMISSION_DIALOGUE -> MICROPHONE_PERMISSION_MANDATORY_DIALOG, ``` Deleted (unused) constants: ``` FRONT_ID_CAMERA_PERMISSIONS BACK_ID_CAMERA_PERMISSIONS DOCUMENT_CAPTURE_CAMERA_PERMISSIONS VIDEO_SELFIE_PERMISSIONS_DIALOGUE ``` New constants: ``` CAMERA_PERMISSION_MANDATORY_DIALOG ``` ## Welcome SDK Migration from V5.21.0 to V5.22.0 ### 1. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:nfc:1.3.1' ``` ```groovy implementation 'com.incode.sdk:video-streaming:1.5.5' ``` ## Welcome SDK Migration from V5.20.0 to V5.21.0 ### 1. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:2.6.2' ``` ### 2. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:nfc:1.3.0' implementation 'com.incode.sdk:kiosk-login:1.3.1' ``` ## Welcome SDK Migration from V5.18.0 to V5.20.0 ### 1. Update core-light dependency to the latest version ```groovy implementation 'com.incode.sdk:core-light:2.6.1' ``` ### 2. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:nfc:1.2.1' ``` ## Welcome SDK Migration from V5.17.2 to V5.18.0 ### 1. Update core-light dependency Replace ```groovy implementation 'com.incode.sdk:core-light:2.5.1' ``` With ```groovy implementation 'com.incode.sdk:core-light:2.6.0' ``` ### 2. If you use any of the following optional dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:kiosk-login:1.3.0' implementation 'com.incode.sdk:model-face-recognition:3.0.0' implementation 'com.incode.sdk:model-id-face-detection:2.1.0' implementation 'com.incode.sdk:model-liveness-detection:3.0.0' implementation 'com.incode.sdk:nfc:1.2.0' ``` ### 3. Updates to Face Mask checks The model dependency previously required for performing face mask checks is now incorporated into `core-light:2.6.0`. As such, `model-mask-detection` is no longer required and should be removed. Similarly, face mask checks no longer have a configurable threshold or variable confidence level. Any usage of the following APIs should be removed: * `CommonConfig.getMaskThreshold()` * `CommonConfig.Builder.setMaskThreshold()` * `SelfieScanResult.maskConfidence` ## Welcome SDK Migration from V5.17.0 to V5.17.2 ### 1. Update core-light dependency Replace ```groovy implementation 'com.incode.sdk:core-light:2.5.0' ``` With ```groovy implementation 'com.incode.sdk:core-light:2.5.1' ``` ### 2. Update video-streaming dependency Replace ```groovy implementation 'com.incode.sdk:video-streaming:1.5.3' ``` With ```groovy implementation 'com.incode.sdk:video-streaming:1.5.4' ``` ## Welcome SDK Migration from V5.16.0 to V5.17.0 ### 1. If you use any of the following dependencies, make sure to update to the latest versions ```groovy implementation 'com.incode.sdk:nfc:1.1.0' implementation 'com.incode.sdk:kiosk-login:1.2.0' implementation 'com.incode.sdk:qr-face-login:1.1.0' ``` ### 2. If you are using the conference dependency Replace ```groovy implementation 'com.incode.sdk:conference:1.5.2' ``` With ```groovy implementation 'com.incode.sdk:video-streaming:1.5.3' ``` ### 3. Updates to External Analytics External analytics (for screens outside of the Incode SDK) is no longer being controlled using the `IncodeWelcome.Builder.setLoggingEnabled()` method. It now has its own separate methods: `IncodeWelcome.Builder.setExternalAnalyticsEnabled()` enables or disables collecting analytics events for screens outside of the Incode SDK. Default value is `true`. `IncodeWelcome.Builder.setExternalScreenshotsEnabled()` enables or disables collecting screenshots of screens outside of the Incode SDK. External Analytics must be enabled for this configuration to take effect. Default value is `false`. To change the default behavior, please use the new APIs. ## Welcome SDK Migration from V5.14.0 to V5.15.0 ### 1. Update core-light dependency Replace ```groovy implementation 'com.incode.sdk:core-light:2.4.0' ``` With ```groovy implementation 'com.incode.sdk:core-light:2.5.0' ``` ### 2. Update kiosk-login dependency Replace ```groovy implementation 'com.incode.sdk:kiosk-login:1.0.0' ``` With ```groovy implementation 'com.incode.sdk:kiosk-login:1.1.0' ``` ## Welcome SDK Migration from V5.12.0 to V5.13.0 ### 1. Update core-light dependency Replace ```groovy implementation 'com.incode.sdk:core-light:2.3.0' ``` With ```groovy implementation 'com.incode.sdk:core-light:2.4.0' ``` ### 2. ID side detection is bundled with the latest version of ID validation model, so the following dependency is no longer necessary: ```groovy implementation 'com.incode.sdk:model-id-face-detection:2.0.0' ``` If present, please remove it from your `build.gradle`. ## Welcome SDK Migration from V5.11.0 to V5.12.0 ### Changes to `VerifyListener` `onError()` method of the `VerifyListener` now receives a `Throwable error` as an argument, so you can see the actual exception that has been thrown. If you are using `VerifyListener` in your code: Replace ```kotlin override fun onError() {} ``` ```java @Override public void onError() {} ``` With ```kotlin override fun onError(error: Throwable?) {} ``` ```java @Override public void onError(Throwable error) {} ``` ## Welcome SDK Migration from V5.X.X to V5.8.0 ### 1. Update core-light dependency Replace ```groovy implementation 'com.incode.sdk:core-light:2.2.0' ``` With ```groovy implementation 'com.incode.sdk:core-light:2.3.0' ``` ### 2. Face detector that detects faces on ID was moved to a new dependency. If any of the following methods are used, ```kotlin IdScan.Builder.setEnabledFrontShownAsBackCheck(true) IdScan.Builder.setEnableBackShownAsFrontCheck(true) ``` ```java IdScan.Builder.setEnabledFrontShownAsBackCheck(true) IdScan.Builder.setEnableBackShownAsFrontCheck(true) ``` make sure to add the following line to your module-level `app/build.gradle` ```groovy implementation 'com.incode.sdk:model-id-face-detection:2.0.0' ``` ### 3. Time unit for setting the maximum length of a video selfie recording changed from minutes to seconds. Replace: ```kotlin VideoSelfie.Builder.setMaxVideoLength(X) ``` ```java VideoSelfie.Builder.setMaxVideoLength(X) ``` With: ```kotlin VideoSelfie.Builder.setMaxVideoLength(X * 60) ``` ```java VideoSelfie.Builder.setMaxVideoLength(X * 60) ``` ## Welcome SDK Migration from V4.X.X to V5.0.0 ### Removed APIs The following APIs have been removed: ```kotlin createNewOnboardingSession() setOnboardingSession() ``` ```java createNewOnboardingSession() setOnboardingSession() ``` Use this new API for both cases: ```kotlin // Use this API to resume existing session or to perform setup when using startOnboardingSection() API setupOnboardingSession() ``` ```java // Use this API to resume existing session or to perform setup when using startOnboardingSection() API setupOnboardingSession() ``` ### Removed Configs The following classes have been removed: ```kotlin OnboardingConfigV2 OnboardingFlowConfig ``` ```java OnboardingConfigV2 OnboardingFlowConfig ``` Instead, you can use these: ```kotlin SessionConfig // Session related configuration: region, interviewId, configurationId, validationModuleList, externalId, externalToken, customFields. FlowConfig // Flow or Module related configuration; You can add modules through this config. CommonConfig // SDK wide configuration: thresholds, UI behaviors ``` ```java SessionConfig // Session related configuration: region, interviewId, configurationId, validationModuleList, externalId, externalToken, customFields. FlowConfig // Flow or Module related configuration; You can add modules through this config. CommonConfig // SDK wide configuration: thresholds, UI behaviors ``` ### Removed callback methods The following method has been removed: ```kotlin VideoSelfieListener.onVideoRecorded() ``` ```java VideoSelfieListener.onVideoRecorded() ``` Instead, use this method: ```kotlin VideoSelfieListener.onVideoRecorded(videoSelfieResult: VideoSelfieResult) ``` ```java VideoSelfieListener.onVideoRecorded(VideoSelfieResult videoSelfieResult) ``` ### Changed or renamed APIs #### startOnboardingV2() The `V2` has been removed from the API method and class names. * `startOnboardingV2()` becomes `startOnboarding` * `OnboardingListenerV2` becomes `OnboardingListener` Use `SessionConfig` and `FlowConfig` instead of `OnboardingConfigV2`. ```kotlin // Old startOnboardingV2(context: Context, onboardingConfig: OnboardingConfigV2, onboardingListener: OnboardingListenerV2) // New startOnboarding(context: Context, sessionConfig: SessionConfig, flowConfig: FlowConfig, onboardingListener: OnboardingListener) ``` ```java // Old startOnboardingV2(Context context, OnboardingConfigV2 onboardingConfig, OnboardingListenerV2 onboardingListener) // New startOnboarding(Context context, SessionConfig sessionConfig, FlowConfig flowConfig, OnboardingListener onboardingListener) ``` #### startOnboardingSection() The argument `interviewId` has been removed from the `startOnboardingSection()` method. `interviewId` is set internally when `setupOnboardingSession()` is called. Make sure to call `setupOnboardingSession()` prior to calling `startOnboardingSection()`. ```kotlin // Old startOnboardingSection(context: Context, interviewId: String, onboardingFlowConfig: OnboardingFlowConfig, onboardingListenerV2: OnboardingListenerV2) // New startOnboardingSection(context: Context, flowConfig: FlowConfig, onboardingListener: OnboardingListener) ``` ```java // Old startOnboardingSection(Context context, String interviewId, OnboardingFlowConfig onboardingFlowConfig, OnboardingListenerV2 onboardingListenerV2) // New startOnboardingSection(Context context, FlowConfig flowConfig, OnboardingListener onboardingListener) ``` ### Examples of how to use the new Configs Example: Create a `SessionConfig`: ```kotlin val sessionConfigBuilder: SessionConfig.Builder = SessionConfig.Builder() sessionConfigBuilder.setRegion(...) sessionConfigBuilder.setConfigurationId(...) sessionConfigBuilder.setCustomFields(...) sessionConfigBuilder.setQueueName(..) val sessionConfig: SessionConfig = sessionConfigBuilder.build() ``` ```java SessionConfig.Builder sessionConfigBuilder = new SessionConfig.Builder(); sessionConfigBuilder.setRegion(...); sessionConfigBuilder.setConfigurationId(...); sessionConfigBuilder.setCustomFields(...); sessionConfigBuilder.setQueueName(...); SessionConfig sessionConfig = sessionConfigBuilder.build(); ``` Example: Create a `FlowConfig`: ```kotlin val flowConfigBuilder: FlowConfig.Builder = FlowConfig.Builder() val intro: Intro = Intro.Builder() .setIntroChecks(...) .setAllowContinueWithoutConsent(...) .build() flowConfigBuilder.addIntro(intro) flowConfigBuilder.addPhone() val idScan: IdScan = IdScan.Builder() .setShowIdTutorials(...) .setWaitForTutorials(...) .setEnableFrontShownAsBackCheck(...) .build() flowConfigBuilder.addID(idScan) val flowConfig: FlowConfig = flowConfigBuilder.build() ``` ```java FlowConfig.Builder flowConfigBuilder = new FlowConfig.Builder(); Intro intro = new Intro.Builder() .setIntroChecks(...) .setAllowContinueWithoutConsent(...) .build(); flowConfigBuilder.addIntro(intro); flowConfigBuilder.addPhone(); IdScan idScan = new IdScan.Builder() .setShowIdTutorials(...) .setWaitForTutorials(...) .setEnableFrontShownAsBackCheck(...) .build(); flowConfigBuilder.addID(idScan); FlowConfig flowConfig = flowConfigBuilder.build(); ``` Example: Create a `CommonConfig`: ```kotlin val commonConfig: CommonConfig = CommonConfig.Builder() .setShowExitConfirmation(...) .setShowCloseButton(...) .setIdGlareThreshold(...) .setIdBlurThreshold(...) .build() IncodeWelcome.getInstance().setCommonConfig(commonConfig) ``` ```java CommonConfig commonConfig = new CommonConfig.Builder() .setShowExitConfirmation(...) .setShowCloseButton(...) .setIdGlareThreshold(...) .setIdBlurThreshold(...) .build(); IncodeWelcome.getInstance().setCommonConfig(commonConfig); ``` The following method has been removed in this release: ```kotlin OnboardingConfigV2.setShowReviewPhoto(showReviewPhoto: Boolean) ``` ```java OnboardingConfigV2.setShowReviewPhoto(boolean showReviewPhoto) ``` Instead, use the following method in the `IdScan` config builder: ```kotlin val idScan: IdScan = IdScan.Builder() ... .setShowRetakeScreen(showRetakeScreen: Boolean) .build() ``` ```java IdScan idScan = new IdScan.Builder() ... .setShowRetakeScreen(boolean showRetakeScreen) .build(); ``` --- - Path: `release-notes/migration-guide-1` - URL: https://developer.incode.com/release-notes/migration-guide-1/ - Markdown: https://developer.incode.com/release-notes/migration-guide-1.md # Migration Guide ## Migration from 1.X.X to 2.0.0 * Update Android `minSdkVersion` to 23 (`23.0`). * Replace `OnboardingConfiguration` with the appropriate `OnboardingSessionConfiguration` and/or `OnboardingFlowConfiguration`. * When calling `AddIdScan` on `OnboardingFlowConfiguration` instead of just one callback `IdScanCallback`, there are now 3 separate callbacks with appropriate results: `IdFrontScanCallback` returning `IdFrontScanResult`, `IdBackScanCallback` returning `IdBackScanResult` and `IdProcessCallback` returning `IdProcessResult`. * When calling `AddFaceMatch` on `OnboardingFlowConfiguration`, remove the `faceMatchParams` parameter. * When calling `StartOnboarding`, replace the `OnboardingConfiguration` parameter with 2 parameters `sessionConfig` and `flowConfig`, which are instances of `OnboardingSessionConfiguration` and `OnboardingFlowConfiguration`. * `SetOnboardingSession` and `CreateNewOnboardingSession` methods are replaced with the `SetupOnboardingSession` method that accepts instances of `OnboardingSessionConfiguration`. * Remove `interviewId` parameter from `StartOnboardingSection` and pass an instance of `OnboardingFlowConfiguration`. * From `VerifyFace`, remove `customerToken` parameter, and the result is now `VerifyFaceResult` type instead of `SelfieScanResult`. --- - Path: `release-notes/platform-release-notes-2026` - URL: https://developer.incode.com/release-notes/platform-release-notes-2026/ - Markdown: https://developer.incode.com/release-notes/platform-release-notes-2026.md # Platform Release Notes 2026 ## 2026 September 7 _Demo: 1 September 2026 | Production: 7 September 2026_ ## Dashboard ECOSYSTEM - Ecosystem now offers a Greenhouse integration. Configuration is available as a tile in the Marketplace. Ecosystem administrators can configure the integration with an integration ID, workflow selection, and client credentials. Separate integrations can be set up for IDV and KYB flows. ESCALATION MANAGEMENT - The reason options in the Manual Review issue-selection picker have been updated. Options now show only when the related module is included in the flow or workflow, and shadow mode counts as included. The False Approval picker lists ID Verification, Face Recognition, Liveness, Deepsight, and Other. The False Rejection picker lists the same options plus GovMatch, Risk AI, and Antifraud. The ID Validation Crosscheck picker is now shown only when ID Validation is in the flow and offers Crosscheck, Validity check, MRZ check, and Other. GENERAL - The Identity View in Dashboard now shows the latest document per document type in addition to the Original Document from the session where the identity was created. Previously, only the original document was listed. - For sessions in Needs Review status, the Dashboard session header now displays the custom reason passed via the `newReason` field on the `/omni/manual-review` API. When no custom reason is supplied, the header continues to show the default system message describing why the session was routed to Needs Review. eKYB PREFILL - The eKYB Pre-fill Single Session view now shows a *Business Name Match* pill next to the Registration Number in the Customer Input section for all countries. Previously this was available for US only. - Refined the eKYB Pre-fill Single Session view: - For India eKYB Pre-fill, the *State Registrations* section now shows all GSTINs for the business, along with the associated Registration State and Status for each. - For US eKYB Pre-fill, the *Directors* label has been removed from the Owners, Directors and Personnel section, since the underlying data source does not separate these roles for US. - Removed the *X% ownership covered* text from the Owners, Directors and Personnel section title for all countries. - Added an *Other Addresses* section for all countries where the information is available, shown below Other Names. - Sections with a *Show All* option (UBOs, All GSTINs, Other Names, Other Addresses) now offer a matching *Collapse* option to return the list to its shorter view. eKYC - There are new eKYC sources for Venezuela and Colombia: - **Venezuela Civil Register**: Mandatory fields are ***Name*** and ***National ID Number***. ***Date of Birth*** is included by default but can be removed in module configuration. - **Colombia Civil Register 1**: Mandatory fields are ***Name***, ***National ID Number***, and ***Issue Date***. ***Date of Birth*** and ***Gender*** are included by default but can be removed in module configuration. - The eKYC module configuration now offers an *Auto fill from OCR* option for the National ID Number and Tax ID Number fields. When enabled, these fields are pre-filled from ID OCR during Onboarding for eKYC sources that require them, including India DMV and Argentina Credit Bureau. ### Fixes ECOSYSTEM - Fixed an issue that caused deleted candidates to remain visible in the candidate dropdown on the Candidate Verification page. Deleted candidates are now removed immediately without requiring a page refresh. - Fixed an issue that caused Helpdesk and Recruiter roles in Ecosystem to be logged out when opening the Session view. These roles can now open sessions without interruption. - Fixed an issue in the Ecosystem Self Serve integration where entering an unknown email address as a login hint displayed a success screen instead of a validation error. Unknown emails now surface the expected validation message. eKYB - Fixed the label for the eKYB Checks module on the Modules tab in Dashboard. The label now reads correctly and includes a description of the module. - Fixed an issue that caused KYB session results to display a map or Street View for the customer-submitted address even when the address could not be verified. Map and Street View are now shown only with a Verified or Approximate Match. - Fixed an issue that caused the Single Session view for KYB Verification to appear blank when a session ended with the submitted Tax ID and Business Name not found. Unverified results are now displayed as expected. - Fixed an issue that caused the *Business Name* filter in the Dashboard Sessions list to return no results for KYB Pre-fill sessions. The filter now returns matching sessions for both KYB Verification and KYB Pre-fill. GENERAL - Fixed several Spanish translations in Dashboard, including the workflow editor label and the Consent module label. - Fixed an issue that caused the ML consent checkbox to appear twice when creating a new Data Sharing Consent in Dashboard. The checkbox now appears only once, as a read-only option. - Fixed an inconsistency where the *SCORE* column in the Dashboard Sessions list and the score shown on the session detail view could disagree for the same session. The two views now report the same score. - Fixed an issue in Virtual Private Cloud (VPC) deployments that caused newly completed sessions to not appear in the Dashboard Sessions list. Sessions now surface as expected. WORKFLOWS - Fixed an issue in the Workflow builder that caused a Condition to become uneditable after a node was added to a branch previously set to *Continue to next step*. The Condition can now be reopened and edited as the Workflow grows. ## Web app ### Enhancements - The Electronic Signature module has been migrated to UXv2 for both Web flows and Workflows on desktop and mobile. - KYB company verification is now available for Greece and Ireland. The KYB onboarding flow accepts Tax ID, Business Name, Address, UBO Names, and Director Names. Accepted Tax ID formats vary by country: - **Greece**: AFM (9 digits, optionally with an `EL` VAT prefix) or GEMI registration number (11 or 12 digits). - **Ireland**: CRO registration number (5-9 digits, numeric) or VAT number (`IE` + 7 digits + 1-2 letters). - **Portugal**: NIF (9 digits), which serves as both the company registration number and VAT number. - KYB Pre-fill is now available for two additional countries. The KYB Pre-fill onboarding flow accepts Tax ID as the only mandatory input, with Business Name and Address as optional inputs: - **Italy**: CCIAA/NREA (2 letters + 6-7 digits), VAT/Tax Code (11 digits), or Codice Fiscale (16-character alphanumeric, for sole traders). - **Germany**: Commercial register number (HRB or HRA followed by digits) or VAT number (DE + 9 digits). - Improved the KYB Pre-fill onboarding experience: - Corrected the *Tax ID* input label on step 2 of the onboarding flow. - For UK KYB Pre-fill, the Address field now appears in the onboarding form when Address is selected as an optional input in module configuration, and supports address autofill. - The summary page at the end of the KYB Pre-fill onboarding flow no longer displays pre-fill results to the end user, matching the behavior of standard KYB onboarding. ### Fixes - Fixed an issue that caused the intro screen to be skipped on desktop when running a Workflow with **Continue to Desktop** enabled. The intro screen now displays as expected on both desktop and mobile. - Fixed an issue that caused users on Samsung devices to get stuck on the ID capture screen after a failed front ID upload in the UXv1 SDK. Users are now prompted to retry the capture as expected. - Fixed an issue that caused an infinite loader to appear when Samsung users took a Manual ID Capture in Incode ID Default flows. Manual ID Capture now completes as expected on all supported devices. - Fixed an issue that caused ID capture to fail after starting a step-up flow when Deepsight was enabled at the provisioning level but disabled at the flow level. The Deepsight configuration set on the flow is now respected during step-up. ## Server ### Enhancements - The KYB `addressMatch` result now returns at least Approximate Match whenever both `cityMatch` and `postalCodeMatch` are Verified for UK, Italy, France, Germany, and Spain company lookups. Previously, `addressMatch` could be Unverified even when city and postal code both matched. This aligns the behavior in these countries with the existing US logic. - The KYB pre-fill response for Germany now includes the full set of company details returned by the underlying data source, including `registrationDate`, `creditRating` and `creditRatingDescription`, `industryDesc`, `activityDesc`, `turnover`, `employeeCount`, `websites`, `shareholders`, `ultimateParent`, and `immediateParent`. Previously only a subset of fields was returned. - Terms and Conditions acceptance for Qualified Electronic Signature (QES) sessions is now recorded server-side as a distinct state before signing. Each session persists which checkboxes were accepted, the personalized contract text shown to the user, the associated links, and a timestamp. The recorded acceptance is available in the Dashboard for audit. Contact your Incode representative if you are interested in this feature. - The `/omni/b2b/v1/identities/{id}` response now includes a `documents` array with OCR data from the latest session per document type. This applies retroactively to identities and sessions already in the system. Contact your Incode representative if you are interested in this feature. - The `POST /omni/customer/add-parent` and `POST /omni/session/add-parent-customer` endpoints have been removed. Any integrations calling these endpoints will need to be updated. Contact your Incode representative if you were relying on this functionality. - The KYB Pre-fill API response now includes a `tinMatch` field with a Verified or Unverified result for all countries. Previously this field was returned for US only. - The India KYB Pre-fill API response now includes a `state` field for each entry in the `allGSTINs` array, indicating the Indian state associated with each GSTIN. - Improved the error reason returned by KYB Verification and KYB Pre-fill for non-US countries when the submitted Tax ID cannot be found. The response now includes a `reasonCodes` field with the message *Tax ID was not found.* to clearly indicate why results are Unverified. ### Fixes - Fixed an issue that caused only the first Custom Watchlist module in a Workflow to run when the same Workflow contained two or more Custom Watchlist modules. Every Custom Watchlist module in a Workflow now executes and its results are available to any Conditions that follow it. - Fixed an issue that caused the Custom Watchlist Condition to evaluate as not matched when the ID number or external ID was submitted through a form and *Use fallback search* was enabled. Values submitted through forms are now correctly evaluated against the Custom Watchlist. - Updated the authentication flow to Colombia government validation to keep the service running after a provider-mandated auth requirement change. No customer action is required. - Fixed an issue in Colombia government validation that caused sessions submitted with an unsupported document subtype (for example, PEP Tutor or Tarjeta de Identidad) to fail with `USER_NOT_FOUND`. These documents now return `DOCUMENT_TYPE_NOT_SUPPORTED` with an `UNKNOWN` score before the provider is called. - Fixed an issue in UK KYB Pre-fill where the `tin` field in the response returned the input Tax ID rather than the company registration number when a VAT number was provided as the input. The `tin` field now returns the 8-digit company registration number regardless of whether the input was a registration number or a VAT number. - Fixed an issue in the QR-code handoff between desktop and mobile that caused the same device session identifier to be assigned to both devices. Desktop and mobile sessions in a handoff now receive distinct device session identifiers. -