# Jumio Documentation > Jumio Documentation — REST APIs, SDKs, and integration guides for identity verification, credentials, and risk signals. --- # QuickStart https://documentation.jumio.ai/docs/quickStart/ # Welcome to Jumio: Quickstart Guide This introductory guide provides a high-level overview of **Jumio’s end-to-end identity verification platform**, designed to help you quickly and securely onboard users while meeting compliance requirements. Whether you're integrating identity verification, liveness detection, or document authentication, this guide will walk you through Jumio’s key products and features to help you build your verification flows with confidence and speed. Our goal is to get you up and running as quickly as possible—so you can start verifying identities and delivering trusted user experiences right away. --- # ID + Selfie Verification https://documentation.jumio.ai/docs/quickStart/ID_SelfieVerification # Quickstart Guide: ID + Selfie Verification Follow these steps to authenticate, create or update account, launch identity verification workflows, and handle the response. ## Prerequisites To retrieve your Credentials, log in to the portal and obtain your **client ID** and **client secret**. These are required to authenticate the /token endpoint. ## Step-by-Step Process ### Step 1: Obtain an OAuth2 Bearer Token - Generate an OAuth2 Bearer token by calling the `/token` endpoint with the POST HTTP method. - Use **Basic Authentication** with the **client ID** and **client secret** found in the settings section of your Jumio Portal. - Once obtained, include the token in the `Authorization` header for all subsequent API requests. :::tip Refer to the [Authentication documentation](../developer-resources/API/authorization) for the specific endpoint to obtain this token. ::: #### Access Token URLs (OAuth2) #### Header ``` Accept: application/json ``` #### Body (x-www-form-urlencoded) ``` grant_type=client_credentials ``` #### Example Response ``` { "access_token": "", "expires_in": 3600, "token_type": "Bearer" } ``` :::note - OAuth 2.0 access tokens are valid for **60 minutes (3600 seconds)** by default. - To avoid unnecessary authentication requests and reduce integration costs, **do not call the `/auth` endpoint before every transaction**. Instead, **reuse the same access token until it expires**, and request a new one only when needed. - For testing purposes, you can use Postman's built-in **OAuth 2.0 authorization type** (under the Authorization tab), which allows you to retrieve and manage tokens automatically across your requests or collections. - For a step-by-step walkthrough, check out this [short video guide](https://share.vidyard.com/watch/HZqWPsZAAHaPVRYktaDudf). ::: ### Step 2: Create or Update an Account Use the `/accounts` endpoint to initiate a new workflow for either a [new](../developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts) or an [existing](../developer-resources/API/account#tag/Account/paths/~1api~1v1~1accounts~1%7BaccountId%7D/put) user. :::info A workflow defines which Jumio services will process your user's credentials. ::: #### New User - US: POST https://account.amer-1.jumio.ai/api/v1/accounts - EU: POST https://account.emea-1.jumio.ai/api/v1/accounts - SG: POST https://account.apac-1.jumio.ai/api/v1/accounts #### Existing User - US: PUT https://account.amer-1.jumio.ai/api/v1/accounts/{{accountId}} - EU: PUT https://account.emea-1.jumio.ai/api/v1/accounts/{{accountId}} - SG: PUT https://account.apac-1.jumio.ai/api/v1/accounts/{{accountId}} #### Header ``` Accept: application/json ``` #### Example Request ``` { "customerInternalReference": "transaction_1234", "workflowDefinition": { key": "10549" //ID + Selfie + Supporting Data } } ``` #### Example Response ``` { "timestamp": "ISO-8601 timestamp", "account": { "id": "string" }, "web": { "href": "https://hosted.jumio.com/...", "successUrl": "https://yourapp.com/success", "errorUrl": "https://yourapp.com/error" }, "sdk": { "token": "JWT token" }, "workflowExecution": { "id": "string", "credentials": [ { "id": "string", "category": "ID | DATA | SELFIE | FACEMAP", "label": "string", "allowedChannels": ["WEB", "API", "SDK"], "api": { "token": "JWT token", "workflowExecution": "https://api.jumio.ai/.../workflow-executions/{id}", "parts": { "front": "https://.../parts/FRONT", "back": "https://.../parts/BACK", "prepared_data": "https://.../parts/PREPARED_DATA", "face": "https://.../parts/FACE" } } } ] } } ``` ### Step 3: Launch the Workflow The account creation response provides three integration options: #### Option 1: Use Jumio's Hosted Interface Use workflowExecution.web.href in one of these ways: - Redirect: Send users to the URL in a new browser tab - iFrame: Embed the experience in your webpage - WebView: Load the URL in a mobile app WebView component `` #### Option 2: Integrate Jumio SDKs Initialize the SDK using workflowExecution.sdk.token. Refer to the [Jumio SDK documentation](../developer-resources/SDKs/introduction) for implementation details. #### Option 3: Build Custom Interface with API Use the workflowExecution.api.workflowExecution endpoint to upload images directly. You'll need to: - Upload **front, back,** and **selfie** images. - Finalize the workflow using the **finalization endpoint**. **_For guidance on using this approach, contact [Jumio support](https://www.jumio.com/contact/support/)._** ### Step 4: Wait for the Callback Jumio will send a callback when the workflow is complete. This only includes No PII data/non-sensitive data status info, so proceed to retrieve full details. You can check the callback here. :::note Callback time varies by workflow—wait accordingly. ::: ### Step 5: Retrieve the Workflow Results Upon receiving the callback, consume the retrieval API with the GET HTTP method: - US: `https://retrieval.amer-1.jumio.ai/api/v1/accounts/{accountId}/workflow-executions/{workflowExecutionId}` - EU: `https://retrieval.emea-1.jumio.ai/api/v1/accounts/{accountId}/workflow-executions/{workflowExecutionId}` - SG: `https://retrieval.apac-1.jumio.ai/api/v1/accounts/{accountId}/workflow-executions/{workflowExecutionId}` Once you receive the response from the Retrieval API, parse it to: - Determine the final status (e.g., passed, rejected, etc.). Learn more about risk scores here. - Review the extracted document data. - Take the appropriate next steps based on the results. #### Example Response
``` { "workflow": { "id": "UUID", "status": "PROCESSED", "definitionKey": "10011", "userReference": "MyUser", "customerInternalReference": "transaction_1234" }, "account": { "id": "UUID" }, "createdAt": "2022-11-28T23:45:02.528Z", "startedAt": "2022-11-28T23:50:37.221Z", "completedAt": "2022-11-28T23:50:55.232Z", "credentials": [ { "id": "UUID", "category": "SELFIE", "parts": [ { "classifier": "FACE", "href": "https://retrieval.amer-1.jumio.ai/.../parts/FACE" } ], "consent": { "decisionAccepted": true, "collectedBy": "CUSTOMER" } }, { "id": "UUID", "category": "FACEMAP", "parts": [ { "classifier": "FACEMAP" }, { "classifier": "LIVENESS_1", "href": "https://retrieval.amer-1.jumio.ai/.../parts/LIVENESS_1" }, { "classifier": "LIVENESS_3", "href": "https://retrieval.amer-1.jumio.ai/.../parts/LIVENESS_3" }, { "classifier": "LIVENESS_2", "href": "https://retrieval.amer-1.jumio.ai/.../parts/LIVENESS_2" }, { "classifier": "LIVENESS_5", "href": "https://retrieval.amer-1.jumio.ai/.../parts/LIVENESS_5" }, { "classifier": "LIVENESS_4", "href": "https://retrieval.amer-1.jumio.ai/.../parts/LIVENESS_4" }, { "classifier": "LIVENESS_6", "href": "https://retrieval.amer-1.jumio.ai/.../parts/LIVENESS_6" } ], "consent": { "decisionAccepted": true, "collectedBy": "CUSTOMER" } }, { "id": "UUID", "category": "ID", "parts": [ { "classifier": "FRONT", "href": "https://retrieval.amer-1.jumio.ai/.../parts/FRONT" }, { "classifier": "BACK", "href": "https://retrieval.amer-1.jumio.ai/.../parts/BACK" } ], "consent": { "decisionAccepted": true, "collectedBy": "CUSTOMER" } } ], "decision": { "type": "WARNING", "details": { "label": "WARNING" }, "risk": { "score": 50.0 } }, "consent": { "obtained": "yes", "obtainedAt": "2022-11-28T23:50:40.136Z" }, "steps": { "href": "https://retrieval.amer-1.jumio.ai/.../steps" }, "capabilities": { "extraction": [ { "id": "UUID", "credentials": [ { "id": "UUID", "category": "ID" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } }, "data": { "type": "DRIVING_LICENSE", "subType": "REGULAR_DRIVING_LICENSE", "issuingCountry": "USA", "firstName": "JOHN JACOB", "lastName": "SMITH", "dateOfBirth": "1969-01-18", "expiryDate": "2025-01-18", "issuingDate": "2019-12-26", "documentNumber": "N1234567", "state": "CA", "gender": "M", "currentAge": "54" } } ], "similarity": [ { "id": "UUID", "credentials": [ { "id": "UUID", "category": "SELFIE" }, { "id": "UUID", "category": "ID" } ], "decision": { "type": "PASSED", "details": { "label": "MATCH" } }, "data": { "similarity": "MATCH" } } ], "liveness": [ { "id": "UUID", "credentials": [ { "id": "UUID", "category": "SELFIE" }, { "id": "UUID", "category": "FACEMAP" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } }, "data": { "type": "JUMIO_STANDARD", "predictedAge": 44, "ageConfidenceRange": "14-67" } } ], "dataChecks": [ { "id": "UUID", "credentials": [ { "id": "UUID", "category": "ID" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } } } ], "imageChecks": [ { "id": "UUID", "credentials": [ { "id": "UUID", "category": "SELFIE" }, { "id": "UUID", "category": "ID" } ], "decision": { "type": "WARNING", "details": { "label": "REPEATED_FACE" } }, "data": { "faceSearchFindings": { "status": "DONE", "findings": [ "22771260-8cb0-42a2-a38a-d8f853063cc2", "27232651-4b18-4cf1-8d4a-df0451abc717", "9541ae91-834e-4914-a30d-6534fed4eb6d", "9414413d-2c76-44d2-9052-8876fa327a02" ] } } } ], "usability": [ { "id": "UUID", "credentials": [ { "id": "UUID", "category": "ID" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } } }, { "id": "UUID", "credentials": [ { "id": "UUID", "category": "FACEMAP" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } } }, { "id": "UUID", "credentials": [ { "id": "UUID", "category": "SELFIE" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } } } ] } } ```
For further details, advanced use cases, or support with customization, please refer to the complete [API documentation](../developer-resources/API/) or contact [Jumio support](https://www.jumio.com/contact/support/). --- # selfie.DONE https://documentation.jumio.ai/docs/quickStart/selfieDone # selfie.DONE selfie.DONE is an innovative and user-friendly verification method that significantly reduces friction in the ID verification process for trusted users. Instead of scanning an ID every time, Jumio can reuse a previously verified ID when no risk is detected. The user experience flow starts with a **Liveness check**. Based on the result, Jumio either: - **Reuses a reusable ID** (if the user has already been verified successfully before and is trusted), or - **Continues with the standard ID verification flow** (if no reusable qualified ID is found or risk is detected). This provides a faster and smoother user experience while maintaining strong fraud protection. :::important - **selfie.DONE requires Jumio Premium Liveness to reuse a previously verified ID.** Premium Liveness ensures strong liveness verification before ID reuse. If it is not enabled, the verification flow automatically continues with the standard ID verification after Liveness. - **selfie.DONE supports Central and South American countries.** For users located outside these regions, reusable ID searches are not available, and the user must complete a standard ID scan. If you are looking **selfie.DONE support for other regions where you operate please contact [Jumio Support or Jumio Sales](https://support.jumio.com/s/)**. ::: ## Key Benefits **1. Faster verification** For trusted users who have previously completed ID verification, there is no need to scan the same ID again. selfie.DONE reuses a trusted ID, so verification takes less time and feels smoother. **2. More completed sign-ups** With fewer steps, more people finish the process. This results in higher conversion rates and lower drop-off rates. **3. Keep and win more customers** A simple journey helps you keep existing customers and attract new ones who value speed and ease. **4. Strong security** Even when using a stored ID, every check runs against Jumio’s latest fraud models and identity network. You get less friction without compromising on fraud risk protection. ## Supported Channel and Market - **Channel**: Web SDK and Mobile SDK (API channel not currently supported). ## Prerequisites selfie.DONE supports past ID reuse based on the data provided for each transaction. To use the latest release of selfie.DONE, customers must meet the following requirements: - Be natively integrated on the Jumio platform. - Use the **Web or Mobile SDK channels** for verification. - Have **Liveness Premium** and **ID Verification** enabled as part of the verification journey. - Allow **Biometrics (Face) Lookup** and **ID Data Lookup** on the tenant account. :::important Reusable ID usage is allowed only for customers utilizing the **Direct Consent model**, where Jumio operates as the Independent Controller. ::: ### Supported Search Criteria The ability to trigger a reusable ID search depends on different combinations of **user data supplied within [Prepared Data](https://documentation.jumio.ai/docs/references/credentials/#data).** If the required data is not provided or Jumio does not find a matching user, the transaction automatically proceeds with a **new ID scan**. Currently, there are two supported user data options available for selfie.DONE: 1. Name and Date of Birth (Recommended – Global) 2. Country-Specific Identification Number #### 1. Name and Date of Birth (Recommended – Global) Use the individual’s full name along with their date of birth. This search criterion is supported globally and is the **recommended default** for searches across all countries within your tenant account’s Accepted IDs configuration. | **Search Criteria** | **Applicable Countries** | **Required Fields in Prepared Data** | | -------------------- | -------------------------------- | ---------------------------------------------------------------------------- | | Name + Date of Birth | IDs from all supported countries | firstName, middleName (if present on Govtg-issued ID), lastName, dateOfBirth | :::important Provide **First Name, Middle Name (if present in Govt. issued ID), Last Name, and Date of Birth** to enable reusable ID search across all supported countries. This is the recommended user data to be supplied for a selfie.DONE. Unless explicitly required by a country: - Provide only First Name, Middle Name (if present in Govt. issued ID), Last Name, and Date of Birth. - Do not include Middle Name, unless it appears explicitly on the official document (e.g., Philippines) ::: #### 2. Country-specific Identification Number selfie.DONE supports **identifier-based reusable ID search** for specific countries using country-specific unique identifiers. Identifier searches always use an **exact match** strategy. | **Search Criteria** | **Applicable Countries** | **Required Prepared Data Fields** | | ------------------------ | ------------------------ | -------------------------------------- | | CPF + Document Country | Brazil | personalNumber (CPF), addressCountry | | CURP + Document Country | Mexico | personalNumber (CURP), addressCountry | | DNI + Document Country | Peru, Spain | personalNumber (DNI), addressCountry | | PESEL + Document Country | Poland | personalNumber (PESEL), addressCountry | :::important - **Country-specific identification numbers** (such as CPF or CURP, etc.) approach should be used when the collection and use of such identifiers is prevalent as part of the onboarding process in a country, and users are okay to provide them. Examples: CPF number in Brazil or CURP in Mexico, etc. - Identifier-based searches are performed **only if** the Identification Number country is **provided as part of the address country field within** the Prepared data. - If the country is not provided as part of the addressCountry, the identifier search will not return a match, and the transaction will proceed with a standard ID verification flow. - Except for Brazil, identifier-based searches (personalNumber + addressCountry) generally have a **lower likelihood of returning a reusable ID** compared to First Name + Middle Name (if present in Govt. issued ID) + Last Name + Date of Birth–based searches. - In the current version, reusable ID search is limited to transactions originating in Central and South America. Users located in other regions must scan a new ID. If you are looking selfie.DONE support for other regions where you operate please contact [Jumio Support or Jumio Sales](https://support.jumio.com/s/). ::: #### 3. Limiting the ID returned by selfie.DONE **Default limitation on reusable IDs returned** To maintain consistency with normal ID Verification and customers’ compliance requirements, Jumio always limits the search to the “Accepted IDs” configuration of the tenant account where the transaction is processed. You can find them listed for your tenant account on Jumio Portal → Settings → Identity Verification → Accepted IDs. ![](./images/defaultLimitation.png) ##### Limiting reusable IDs returned per transaction Further, to limit the number of returned reusable IDs per transaction, you can use Country and/or Document Type in the ID Credential section of the [Account API](https://documentation.jumio.ai/docs/references/credentials/#specifying-the-document-in-the-account-request). This will limit the returned reusable ID to the provided Country and/or Document Type, if found with Jumio. **Example** ![](./images/credExample.png) ## How Does This Work? ### Step 1: Data Preparation Before initiating the verification process, the Customer collects the required information from the user and includes it in the initial Account Initiation call as part of the [Prepared Data](https://documentation.jumio.ai/docs/developer-resources/API/uploadingSupportData#example-prepared-data-body). #### Recommended (Global) Provide First Name, Middle Name (if present in Govt. issued ID), Last Name, and Date of Birth to enable a global reusable ID search across all supported countries within your tenant account’s Accepted IDs configuration. **Example** - First Name: Jane - Middle Name: Mary - Last Name: Doe - Date of Birth: 1992-08-14 #### Country-specific Identification Number (Alternate approach): For certain countries, a government-issued identification number may be provided along with the address country. For more details, check [this](#2-country-specific-identification-number) section. **Example: Brazil-issued Documents** - Address Country: BRA - CPF field provided in the personalNumber field of prepared data (no special characters) **Limiting the search per transaction** - Check [this](#3-limiting-the-id-returned-by-selfiedone) section to limit the reusable ID returned to specific countries and/or ID types. ### Step 2: Liveness Check The user performs a **liveness check** to confirm physical presence, - Instructions are provided to guide the user through the proper face capture process. - Consent is obtained as required for the transaction. - Liveness checks detect and flag malicious attempts using photos, videos, or deepfakes. Hence, when the liveness result is Passed, the face is captured successfully, and the system proceeds to search for an ID using the search criteria. When the qualified IDs are found, Jumio confirms by performing biometric matching against past qualified reusable IDs found. This ensures the highest level of security and accurate data sharing on behalf of the ID owner. If any risk is flagged during the liveness check, or if no eligible reusable ID is found, the workflow bypasses ID reuse and proceeds with a standard ID verification flow. ### Step 3: User Confirmation If **one or more eligible reusable IDs are found**, Jumio applies additional security and integrity checks and presents single ID for reuse, which has the highest confidence with respect to that transaction. **A. The system displays the type of ID identified for reuse.** - ID Image is not shared with the user **B. The user can choose to:** - Use this ID to complete the transaction, or - Initiate a new ID scan and upload a new ID if needed. User confirmation is required to reuse the previously verified ID. If no eligible reusable ID is found, or if any risk is detected by Jumio, the user is seamlessly routed to a standard ID verification flow for extraction and verification. Decision making occurs in the background, and the user remains unaware. ### Step 4: Completing Transaction #### 1. Using Reusable ID a. The transaction completes faster since ID verification was already performed. b. All background processing, including **extraction** and **fraud risk checks**, is executed to ensure security. - This enables the use of the latest fraud detection models and Jumio’s network knowledge about risky connections. - Your current integration with Jumio doesn’t change, and ID Verification output format and data are received as usual. c. Any other **custom risk checks** — such as Brazil CPF check, Cross Transaction Risk, Device Risk Check, etc are executed as usual if configured as part of the workflow and enabled for the Customer account. ### Step 5: Viewing Reusable ID Usage in Transaction Results When a transaction is processed through selfie.DONE, i.e., uses a Reusable ID for processing; this is reflected in the transaction results. On the Jumio Portal, the transaction details page displays a **“Reusable Identity”** section indicating: - PreVerified ID: Whether a reusable ID was used for the transaction. - User Accepted: Whether the user accepted the reuse of the previously verified ID during the flow. - ID Source: Source of reusable ID. Default is Jumio, except Brazil where it can also be Local Datasource. :::note If no eligible reusable ID is found, this section will not appear, and the transaction will reflect standard ID verification information. ::: ![Viewing Reusable ID](./images/viewingReusableID.png) #### Tracking Reusable ID Usage Reusable ID use can be tracked using the Jumio Retrieval API. Refer to the Retrieval API documentation [here](https://documentation.jumio.ai/developer-resources/api/retrieval#tag/Retrieval/operation/getWorkflowExecutionDetails). Customers can also identify transactions where a reusable ID was used using **Jumio Portal** in the following ways: - Explorer page - Filter transactions using the _Pre-Verified ID_ = True/False filter. ![Tracking On Explorer](./images/trackingonExplorer.png) - Reporting - The _Pre-Verified ID_ field is available as an extractable field in reports. ![Reporting](./images/reporting.png) ## Build a Workflow with selfie.DONE You can configure and manage the selfie.DONE verification flow directly in the **Jumio Workflow Editor**. This self-service setup lets you define when to reuse a previously verified ID or trigger a new ID verification. ### Steps to Configure #### Step 1: Open the Workflow Editor in the Jumio Portal. #### Step 2: Create a new workflow or select an existing one to update. ![Workflow_Editor](./images/1_WorkflowEditor.png) #### Step 3: In the Workflow Builder, add the following components: #### Step 3.1: Configure Data Acquisition - Navigate to Credentials Options and add Data Acquisition as the first step in the workflow. ![Credential_Acquisition](./images/2_DataAcquisition.png) #### Step 3.2: Configure Selfie / Facemap Acquisition #### For **Facemap Acquisition**, follow the steps below, - From **Credentials** Options, add a **Facemap Acquisition** step. - Ensure that the **Web and/or Mobile SDK** is selected as a supported channel. ![Facemap_Acquisition](./images/3_FaceMap_Acquiistion.png) - Ensure that **Storage, Usability,** and **Liveness** are selected as Capabilities. ![Facemap_Storage](./images/3_1_FaceMap.png) #### For **Selfie Acquisition**, follow the steps below, - From **Credentials** Options, add a **Selfie Acquisition** step. - Select the **Web and/or Mobile SDK** as the supported channel. ![Selfie_Acquisition](./images/4_SelfieAcquistion.png) - Enable the following capabilities: **Storage, Usability, Liveness, Similarity,** and **Image Checks**. ![Selfie_Storage](./images/Step3.png) #### Step 3.3: Add ID Acquisition - From Credentials Options, add an ID Acquisition step. - Under **Advanced Configuration**, select the **Web and/or Mobile SDK** as the supported channel. ![ID_Acquiistion](./images/5_IDAcquisistion.png) - Select Reusable ID as the Acquisition Type. ![Reusable_ID](./images/5_1_ReusableID.png) - Under Basic Configuration, enable the following capabilities: Storage, Usability, Extraction, Image Checks, Data Checks, and Similarity. ![IDStorage](./images/dataCheck.png) #### Step 3.4: Add ID / Identity Verification and Risk Evaluation - From the **Common** section, add an **ID or Identity Verification** step. ![Identity_Verification](./images/6_RiskEvaluation.png) - From the Common section, add a Risk Calculation step and the End of Workflow step. ![RiskCalculation](./images/7_RiskCalculation.png) #### Step 4: Save and Publish your workflow. - You will notice that the **Custom Workflow Saved Successfully**. ![SavePublish](./images/8_SavePublish.png) :::info Include additional elements, such as Lookups or other risk signals, as required. ::: --- # Doc Proof https://documentation.jumio.ai/docs/quickStart/docProof # Quickstart Guide: Doc Proof This guide outlines the essential steps to integrate Jumio's Doc Proof, utilizing OAuth 2.0 authentication and the Jumio-hosted user experience (Web or SDK). It includes the process of setting up prepared data, launching the workflow, and handling the results. ## Prerequisites To retrieve your Credentials, log in to the portal and obtain your client ID and client secret. These are required to authenticate the /token endpoint. ## Step-by-Step Process ### Step 1: Authenticate and Get OAuth2 Bearer Token - Generate an OAuth2 Bearer token by calling the /token endpoint with the POST HTTP method. - Use Basic Authentication with the client ID and client secret found in the settings section of your Jumio Portal. - Once obtained, include the token in the Authorization header for all subsequent API requests. :::note Refer to the [Authentication documentation](../developer-resources/API/authorization) for the specific endpoint to obtain this token. ::: #### Access Token URLs (OAuth2) #### Header ``` Accept: application/json ``` #### Body (x-www-form-urlencoded) ``` grant_type=client_credentials ``` #### Example Response ``` { "access_token": "", "expires_in": 3600, "token_type": "Bearer" } ``` :::note - OAuth 2.0 access tokens are valid for **60 minutes (3600 seconds)** by default. - To avoid unnecessary authentication requests and reduce integration costs, **do not call the `/auth` endpoint before every transaction**. Instead, **reuse the same access token until it expires**, and request a new one only when needed. - For testing purposes, you can use Postman's built-in **OAuth 2.0 authorization type** (under the Authorization tab), which allows you to retrieve and manage tokens automatically across your requests or collections. - For a step-by-step walkthrough, check out this **[short video guide](https://share.vidyard.com/watch/HZqWPsZAAHaPVRYktaDudf)**. ::: ### Step 2: Initiate a Doc Proof Workflow Use the /accounts endpoint to initiate a doc proof workflow for either a [new](../developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts) or an [existing](../developer-resources/API/account#tag/Account/paths/~1api~1v1~1accounts~1%7BaccountId%7D/put) user. :::tip A workflow defines which Jumio services will process your user's credentials. ::: #### New User - US: POST https://account.amer-1.jumio.ai/api/v1/accounts - EU: POST https://account.emea-1.jumio.ai/api/v1/accounts - SG: POST https://account.apac-1.jumio.ai/api/v1/accounts #### Existing User - US: PUT https://account.amer-1.jumio.ai/api/v1/accounts/{accountId} - EU: PUT https://account.emea-1.jumio.ai/api/v1/accounts/{accountId} - SG: PUT https://account.apac-1.jumio.ai/api/v1/accounts/{accountId} #### Access Token URLs (OAuth2) #### Header ``` Accept: application/json ``` #### Body (x-www-form-urlencoded) ``` grant_type=client_credentials ``` #### Example Request ``` { "customerInternalReference":"transaction_1234", "workflowDefinition":{ "key": 10170, "credentials": [ { "category": "DOCUMENT", "country": { "predefinedType": "DEFINED", "values": ["USA"] }, "type": { "predefinedType": "DEFINED", "values": ["BS"] } } ] }, } ``` - workflowDefinition: Specifies the workflow configuration. - workflowDefinition.key: Set to 10170 to activate the Doc Proof and Multi Doc Upload Image upload (No fraud checks). - type: Defines the specific document type to be requested from the user. The Document Code may be, (Bank Statement): "BS", Example (Utility Bill): "UB" etc., Note: Refer to the [Supported Documents](../references/credentials/#supported-documents) for the complete and up-to-date list of supported document codes. #### Example Response The JSON response will contain URLs and tokens for different integration channels: - web.href: URL for Jumio's hosted web client. Redirect user or embed in an ` ``` #### Option 2: Integrate Jumio SDKs Initialize the SDK using workflowExecution.sdk.token. Refer to the Jumio SDK documentation for implementation details. #### Option 3: Build Custom Interface with API Use the workflowExecution.api.workflowExecution endpoint to upload images directly. Finalize the workflow using the finalization endpoint. **Endpoint URL** ``` PUT https://api.{{region}}.jumio.link/api/v1/accounts/{{accountId}}/workflow-executions/{{workflowExecutionId}} ``` For guidance on using this approach, contact [Jumio support](https://www.jumio.com/contact/support/). ### Step 4: Callback Handling 1. Jumio will send a POST request to the configured callback URL upon workflow completion. 2. You will receive callbacks for Doc Proof once the workflow is completed. 3. The callback payload contains limited information and primarily serves as a notification of workflow completion. ### Step 5: Retrieve Workflow Details Upon receiving the callback, make an immediate GET request to the Retrieval API. To consume the "Workflow Details," refer to the Retrieval API Endpoint. You will likely need to include a workflow ID (potentially available in the callback or the initial account creation response). The response retrieved will contain the detailed outcome of the Doc Proof process, including verification status, extracted data (if applicable), and any rejection reasons or error codes. ``` { "workflow": { "id": "string", "status": "PROCESSED", "definitionKey": "10026", "userReference": "mandatory user reference", "customerInternalReference": "transaction_1234" }, "account": { "id": "string" }, "createdAt": "2025-06-17T08:35:55.121Z", "startedAt": "2025-06-17T08:36:57.629Z", "completedAt": "2025-06-17T08:36:58.239Z", "credentials": [ { "id": "string", "category": "DOCUMENT", "parts": [ { "classifier": "1", "href": "https://retrieval.emea-1.jumio.ai/.../parts/1" } ] } ], "decision": { "type": "PASSED", "details": { "label": "PASSED" }, "risk": { "score": 0.0 } }, "steps": { "href": "https://retrieval.emea-1.jumio.ai/.../steps" }, "capabilities": {} } ``` For further details, advanced use cases, or support with customization, please refer to the complete [API documentation](../developer-resources/API/) or contact [Jumio support](https://www.jumio.com/contact/support/). --- # Authentication https://documentation.jumio.ai/docs/quickStart/authentication # Quickstart Guide: Authentication ## Prerequisites To initiate the Jumio Authentication Workflow, you must have an existing basis for verification (i.e., a valid selfie). Examples include: - A completed workflow with a "PASSED" liveness decision (liveness.decision = PASSED). - A previously captured selfie using Jumio’s user interface (preferred), or an image enrolled via API. ## Step-by-Step Process ### Step 1: Authenticate and Get OAuth2 Bearer Token - Generate an OAuth2 Bearer token by calling the `/token` endpoint with the POST HTTP method. - Use **Basic Authentication** with the **client ID** and **client secret** found in the settings section of your Jumio Portal. - Once obtained, include the token in the `Authorization` header for all subsequent API requests. :::tip Refer to the [Authentication documentation](../developer-resources/API/authorization) for the specific endpoint to obtain this token. ::: #### Access Token URLs (OAuth2) #### Header ``` Accept: application/json ``` #### Body (x-www-form-urlencoded) ``` grant_type=client_credentials ``` #### Example Response ``` { "access_token": "", "expires_in": 3600, "token_type": "Bearer" } ``` :::note - OAuth 2.0 access tokens are valid for **60 minutes (3600 seconds)** by default. - To avoid unnecessary authentication requests and reduce integration costs, **do not call the `/auth` endpoint before every transaction**. Instead, **reuse the same access token until it expires**, and request a new one only when needed. - For testing purposes, you can use Postman's built-in **OAuth 2.0 authorization type** (under the Authorization tab), which allows you to retrieve and manage tokens automatically across your requests or collections. - For a step-by-step walkthrough, check out this [short video guide](https://share.vidyard.com/watch/HZqWPsZAAHaPVRYktaDudf). ::: ### Step 2: Update an Account for Authentication Trigger an account and update by calling the `/accounts` endpoint with the PUT method. The body must include a valid `workflowDefinition` with key **10014**. #### Endpoint ``` https://account.{{api_endpoint}}.jumio.ai/api/v1/accounts/{{accountId}} ``` #### Region-Specific Endpoints
  • US: https://account.amer-1.jumio.ai/api/v1/accounts/{{accountId}}
  • EU: https://account.emea-1.jumio.ai/api/v1/accounts/{{accountId}}
  • SG: https://account.apac-1.jumio.ai/api/v1/accounts/{{accountId}}
#### Example Request ``` { "customerInternalReference": "transaction_1234", "workflowDefinition": { "key": 10014 } } ``` #### Example Response ``` { { "timestamp": "2025-06-17T15:44:48.584Z", "account": { "id": "UUID" }, "web": { "href": "https://jumio-go.web.emea-1.jumio.ai/web/client?baseUrl=https%3A%2F%2Fweb-sdk.emea-1.jumio.ai%2Fwebsdk%2Fv4%2Fapi&authorizationToken=eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_5XMOw4CMQxF0a2g1FiKHdtJ6JBopmUHzq9CQwESSIi9k4EV0F6d916uP493d3AYhaJGn5IEdHtntS5tdkuoQytCoCzAAz1k7gxoRakoshXe-A_HUJtag6GFgUNLkDj2uZUQfbOuXCd-jP4Pr-c-pl5Ou9vd1maX69q3_P3IQoGlCKRYCJgygRETiGCtvgfB0Nz7A6HwtdPnAAAA.Qgkm4uSfXqK5c1bZqZwRz1ZdihFvEWgnfZa6LaldH8mavc-fcLyFShAck72_OIVOPMcDFr_ofH7dBLIFsctcdA&locale=it" }, "sdk": { "token": "eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_5XMOw4CMQxF0a2g1FiKHdtJ6JBopmUHzq9CQwESSIi9k4EV0F6d916uP493d3AYhaJGn5IEdHtntS5tdkuoQytCoCzAAz1k7gxoRakoshXe-A_HUJtag6GFgUNLkDj2uZUQfbOuXCd-jP4Pr-c-pl5Ou9vd1maX69q3_P3IQoGlCKRYCJgygRETiGCtvgfB0Nz7A6HwtdPnAAAA.Qgkm4uSfXqK5c1bZqZwRz1ZdihFvEWgnfZa6LaldH8mavc-fcLyFShAck72_OIVOPMcDFr_ofH7dBLIFsctcdA" }, "workflowExecution": { "id": "UUID", "credentials": [ { "id": "UUID", "category": "FACEMAP", "allowedChannels": [ "WEB", "SDK" ] }, { "id": "UUID", "category": "SELFIE", "allowedChannels": [ "WEB", "SDK" ] } ] } } ``` ### Step 3: Complete the Authentication Workflow #### Option 1: Jumio Hosted Interface Use workflowExecution.web.href in one of the following ways: - Redirect to a browser tab - WebView in a mobile app - iFrame embedded in your website: ``` ``` #### Option 2: Jumio SDKs Use `workflowExecution.sdk.token` to initialize the SDK. Refer to [Jumio’s SDK documentation](../developer-resources/SDKs/introduction) for full implementation guidance. ### Step 4: Retrieve Workflow Details Use the Workflow Retrieval API to obtain the full outcome. #### Endpoint URL ``` https://retrieval.{{api_endpoint}}/api/v1/workflow-executions/{{workflow_execution_id}} ``` #### Example Response ``` { "workflow": { "id": "UUID", "status": "PROCESSED", "definitionKey": "10014", "customerInternalReference": "transaction_1234" }, "account": { "id": "UUID" }, ... "decision": { "type": "PASSED", "details": { "label": "PASSED" }, "risk": { "score": 0.0 } } } ``` The response retrieved will contain the detailed outcome of the Authentication process. For further details, advanced use cases, or support with customization, please refer to the complete [API documentation](../developer-resources/API/) or contact [Jumio support](https://www.jumio.com/contact/support/). --- # Standalone Risk Signal https://documentation.jumio.ai/docs/quickStart/standaloneRiskSignal # Quickstart Guide: Standalone Risk Signal In many workflows, you may need to provide or enhance the data. This typically includes information to activate risk signals (such as phone or email) and may also involve your custom, shared data inputs. ## Prerequisites To retrieve your Credentials, log in to the portal and obtain your **client ID** and **client secret**. These are required to authenticate the /token endpoint. ## Step-by-Step Process ### Step 1: Authenticate and Get OAuth2 Bearer Token - Generate an OAuth2 Bearer token by calling the `/token` endpoint with the POST HTTP method. - Use **Basic Authentication** with the **client ID** and **client secret** found in the settings section of your Jumio Portal. - Once obtained, include the token in the `Authorization` header for all subsequent API requests. :::tip Refer to the [Authentication documentation](../developer-resources/API/authorization) for the specific endpoint to obtain this token. ::: #### Access Token URLs (OAuth2)
  • US: https://auth.amer-1.jumio.ai/oauth2/token
  • EU: https://auth.emea-1.jumio.ai/oauth2/token
  • SG: https://auth.apac-1.jumio.ai/oauth2/token
#### Header ``` Accept: application/json ``` #### Body (x-www-form-urlencoded) ``` grant_type=client_credentials ``` #### Example Response ``` { "access_token": "", "expires_in": 3600, "token_type": "Bearer" } ``` :::note - OAuth 2.0 access tokens are valid for **60 minutes (3600 seconds)** by default. - To avoid unnecessary authentication requests and reduce integration costs, **do not call the `/auth` endpoint before every transaction**. Instead, **reuse the same access token until it expires**, and request a new one only when needed. - For testing purposes, you can use Postman's built-in **OAuth 2.0 authorization type** (under the Authorization tab), which allows you to retrieve and manage tokens automatically across your requests or collections. - For a step-by-step walkthrough, check out this [short video guide](https://share.vidyard.com/watch/HZqWPsZAAHaPVRYktaDudf). ::: ### Step 2: Create or Update an Account Use the `/accounts` endpoint to initiate a new workflow for either a [new](../developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts) or an [existing](../developer-resources/API/account#tag/Account/paths/~1api~1v1~1accounts~1%7BaccountId%7D/put) user. :::tip A workflow defines which Jumio services will process your user's credentials. ::: #### New User - US: POST https://account.amer-1.jumio.ai/api/v1/accounts - EU: POST https://account.emea-1.jumio.ai/api/v1/accounts - SG: POST https://account.apac-1.jumio.ai/api/v1/accounts #### Existing User - US: PUT https://account.amer-1.jumio.ai/api/v1/accounts/{{accountId}} - EU: PUT https://account.emea-1.jumio.ai/api/v1/accounts/{{accountId}} - SG: PUT https://account.apac-1.jumio.ai/api/v1/accounts/{{accountId}} #### Access Token URLs (OAuth2)
  • US: https://auth.amer-1.jumio.ai/oauth2/token
  • EU: https://auth.emea-1.jumio.ai/oauth2/token
  • SG: https://auth.apac-1.jumio.ai/oauth2/token
#### Header ``` Accept: application/json ``` #### Body (x-www-form-urlencoded) ``` grant_type=client_credentials ``` #### Example Response ``` { "customerInternalReference": "transaction_1234", "workflowDefinition": { key": "10549" //ID + Selfie + Supporting Data } } ``` ### Step 3: Initiate a Prepared Data Workflow for the Account Use the /accounts endpoint with the POST method along with your chosen workflowDefinition.key and customerInternalReference with respective key. **Endpoint** ``` https://account.{{api_endpoint}}.jumio.ai/api/v1/accounts/{{accountId}} ``` #### Region-Specific Endpoints - US: https://account.amer-1.jumio.ai/api/v1/accounts/{{accountId}} - EU: https://account.emea-1.jumio.ai/api/v1/accounts/{{accountId}} - SG: https://account.apac-1.jumio.ai/api/v1/accounts/{{accountId}} #### Example Request The body of the request is a JSON object with the desired or required values. For example: ``` { "customerInternalReference": "transaction_1234", "workflowDefinition": { "key": 10148 } } ``` #### Example Response ``` { "timestamp": "2025-06-17T15:12:06.525Z", "account": { "id": "UUID" }, "workflowExecution": { "id": "UUID", "credentials": [ { "id": "UUID", "category": "DATA", "allowedChannels": [ "API" ], "api": { "token": "eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_5XOPQpCMRAE4LukduHtyyabtbO09QbJ_oBgpaKCeHfzvIHlDN_AvJO_Dve0T8hlQVml1dxq2qWuerTZZw-jlRsw1QYkLNDIFNitBxYsHWXjP4zZOhkVWLVPnGsGoUXBFxk2zNcaMfEz_B-uJ4-pb-fLw69b_o0Nh45oDja4A3E4jHkeRpCoObeBnD5fIy12X-AAAAA.2u6Ol6XjKcEpKjXnLkK1C7iwpeCpOgeEEfmgHhtdRvHTo-_EaV75l49-UjkIUZraMY7bP-q9QhPRAxhFUK17-A", "parts": { "prepared_data": "https://api.emea-1.jumio.link/api/v1/accounts/3efd4278-7468-4979-84dc-7edaf1515a19/workflow-executions/13da4d45-2ca8-4363-940c-e09bdbde26ff/credentials/d8e0ac83-4bb4-4d22-b529-67337fe7591c/parts/PREPARED_DATA" }, "workflowExecution": "https://api.emea-1.jumio.link/api/v1/accounts/3efd4278-7468-4979-84dc-7edaf1515a19/workflow-executions/13da4d45-2ca8-4363-940c-e09bdbde26ff" } } ] } } ``` ### Step 4: Upload Prepared Data Prepared data is uploaded by making a POST request to the prepared_data URL from the account response. The request uses Bearer Token authorization with the token from the account response. :::note - If your workflow involves ID, selfie, or document checks that are collected through Jumio’s user interface (SDK or Web), the prepared data must be submitted before initiating these checks. - To prevent SQL/XML injection threats, the character set `[^<>"/;`%{}|]` is not allowed in the prepared data body values for the following keys: firstName, lastName, middleName, paternalSurname, maternalSurname, email, and phoneNumber. ::: #### Prepared Data Upload URL ``` POST /api/v1/accounts/{accountId}/workflow-executions/{workflowExecutionId}/credentials/{credentialId}/parts/PREPARED_DATA ``` #### Example ##### Example 1: Prepared Data: eKYC ``` { "firstName": "Cortez", "lastName": "Crook", "email": "johndoe@gmail.com", "phoneNumber": "+8009376310", "dateOfBirth": "1990-08-10", "socialSecurityNumber": "999999999", "sex": "0", "address": { "line1": "1302 Fayette drive", "postalCode": "46816", "city": "Fort Wayne", "subdivision": "IN", "country": "USA" }, "id": { "idNumber": "N1244572", "type": "DRIVER_LICENSE" }, "kyc": { "registrationDate": "2016-06-07", "registrationIpAddress": "176.80.185.187" } } ``` ##### Example 2: Prepared Data: Email Risk ``` { "email": "johndoe@gmail.com" } ``` #### Example Response ``` { "timestamp": "2025-06-17T15:13:54.025Z", "account": { "id": "UUID" }, "workflowExecution": { "id": "UUID" }, "api": { "token": "eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_5XOPQpCMRAE4LukduHtyyabtbO09QbJ_oBgpaKCeHfzvIHlDN_AvJO_Dve0T8hlQVml1dxq2qWuerTZZw-jlRsw1QYkLNDIFNitBxYsHWXjP4zZOhkVWLVPnGsGoUXBFxk2zNcaMfEz_B-uJ4-pb-fLw69b_o0Nh45oDja4A3E4jHkeRpCoObeBnD5fIy12X-AAAAA.2u6Ol6XjKcEpKjXnLkK1C7iwpeCpOgeEEfmgHhtdRvHTo-_EaV75l49-UjkIUZraMY7bP-q9QhPRAxhFUK17-A", "parts": {}, "workflowExecution": "https://api.emea-1.jumio.link/api/v1/accounts/3efd4278-7468-4979-84dc-7edaf1515a19/workflow-executions/13da4d45-2ca8-4363-940c-e09bdbde26ff" } } ``` ### Step 5: Finalize the Transaction Finalize the workflow using the finalization endpoint **Endpoint URL** ``` PUT https://api.{{region}}.jumio.link/api/v1/accounts/{{accountId}}/workflow-executions/{{workflowExecutionId}} ``` For guidance on using this approach, contact [Jumio support](https://www.jumio.com/contact/support/). **Example Response** ``` { "timestamp": "2025-06-17T15:19:08.980Z", "account": { "id": "UUID", }, "workflowExecution": { "id": "UUID" } } ``` ### Step 6: Wait for the Callback Jumio will send a callback when the workflow is complete. This only includes No PII data/non-sensitive data status info, so proceed to retrieve full details. You can check the callback [here](../developer-resources/callback). :::tip Callback times vary by workflow—please wait accordingly. For Testing purposes you may use Webhooks as mentioned [here](https://webhook.site/). ::: ### Step 7: Retrieve the Workflow Details Once the workflow is completed and you’ve received the callback, retrieve the full decision and credential results using the workflowExecution endpoint. ``` { "workflow": { "id": "UUID", "status": "PROCESSED", "definitionKey": "10066", "userReference": "yourUser", "customerInternalReference": "transaction_1234" }, "account": { "id": "UUID" }, "createdAt": "2025-06-17T15:26:40.485Z", "startedAt": "2025-06-17T15:27:25.640Z", "completedAt": "2025-06-17T15:27:29.196Z", "credentials": [ { "id": "UUID", "category": "DATA", "parts": [ { "classifier": "PREPARED_DATA", "href": "https://retrieval.emea-1.jumio.ai/api/.../parts/PREPARED_DATA" } ] } ], "decision": { "type": "REJECTED", "details": { "label": "TXN_REJECTED" }, "risk": { "score": 100 } }, "steps": { "href": "https://retrieval.emea-1.jumio.ai/.../steps" }, "capabilities": { "emailVerification": [ { "id": "UUID", "credentials": [ { "id": "UUID", "category": "DATA" } ], "decision": { "type": "REJECTED", "details": { "label": "HIGH_RISK" } }, "data": { "emailVerificationStatus": "EmailInexistent", "firstVerifiedAt": "2015-10-27T00:00:00.000Z", "totalHits": "1", "emailExists": false, "domainExists": true, "domainName": "jumio.com", "domainCompany": "Jumio", "domainRiskLevel": "LOW", "domainCreationDate": "2004-03-30T07:07:55.000Z", "advice": "DATA_REVIEW", "domainCountry": "USA", "domainCategory": "Technology", "domainCorporate": true } } ] } ] } ] } } ``` The response retrieved will contain the detailed outcome of the Prepared Data process. For further details, advanced use cases, or support with customization, please refer to the complete [API documentation](../developer-resources/API/) or contact [Jumio support](https://www.jumio.com/contact/support/). --- # Fastfill + Existing Credentials Verification https://documentation.jumio.ai/docs/quickStart/fastFill # QuickStart Guide: Fastfill + Existing Credentials Verification # Fastfill enables customers to capture and extract ID data quickly and pre-fill user information (first name, last name, date of birth, etc.) without running fraud or authenticity checks. To maintain complete security, customers must run the full ID Verification workflow **after Fastfill** by using the [Existing Credentials workflow](https://documentation.jumio.ai/docs/developer-resources/API/CreateUpdateAccounts/using-existing-credential). This guide explains how to authenticate, launch Fastfill, extract user data, and complete verification using the previously captured ID. ## Prerequisites To retrieve your Credentials, log in to the portal and obtain your **client ID** and **client secret**. These are required to authenticate the /token endpoint. ## Step-by-Step Process ### Step 1: Authenticate and Get OAuth2 Bearer Token - Generate an OAuth2 Bearer token by calling the /token endpoint with the **POST** HTTP method. - Use **Basic Authentication** with the **client ID and client secret** found in the **settings** section of your customer portal. - Once obtained, include the token in the Authorization header for all subsequent API requests. :::note Refer to the [Authentication documentation](../developer-resources/API/authorization) for the specific endpoint to obtain this token. ::: #### Access Token URLs (OAuth2)
  • US: https://auth.amer-1.jumio.ai/oauth2/token
  • EU: https://auth.emea-1.jumio.ai/oauth2/token
  • SG: https://auth.apac-1.jumio.ai/oauth2/token
#### Header ``` Accept: application/json ``` #### Body (x-www-form-urlencoded) ``` grant_type=client_credentials ``` #### Example Response ``` { "access_token": "", "expires_in": 3600, "token_type": "Bearer" } ``` :::note - OAuth 2.0 access tokens are valid for **60 minutes (3600 seconds)** by default. - To avoid unnecessary authentication requests and reduce integration costs, **do not call the `/auth` endpoint before every transaction**. Instead, **reuse the same access token until it expires**, and request a new one only when needed. - For testing purposes, you can use Postman's built-in **OAuth 2.0 authorization type** (under the Authorization tab), which allows you to retrieve and manage tokens automatically across your requests or collections. - For a step-by-step walkthrough, check out this **[short video guide](https://share.vidyard.com/watch/HZqWPsZAAHaPVRYktaDudf)**. ::: ### Step 2: Initiate a Fastfill Transaction (Capture + Extraction Only) Fastfill is used strictly for fast data capture and extraction. It does not perform fraud detection or authenticity checks. Use the /accounts endpoint to initiate a Fastfill workflow definition (for example, workflow 10172) :::tip A workflow defines which Jumio services will process your user's credentials. ::: #### New User - US: POST https://account.amer-1.jumio.ai/api/v1/accounts - EU: POST https://account.emea-1.jumio.ai/api/v1/accounts - SG: POST https://account.apac-1.jumio.ai/api/v1/accounts #### Existing User - US: PUT https://account.amer-1.jumio.ai/api/v1/accounts/{accountId} - EU: PUT https://account.emea-1.jumio.ai/api/v1/accounts/{accountId} - SG: PUT https://account.apac-1.jumio.ai/api/v1/accounts/{accountId} #### Access Token URLs (OAuth2)
  • US: https://auth.amer-1.jumio.ai/oauth2/token
  • EU: https://auth.emea-1.jumio.ai/oauth2/token
  • SG: https://auth.apac-1.jumio.ai/oauth2/token
#### Header ``` Accept: application/json ``` #### Body (x-www-form-urlencoded) ``` grant_type=client_credentials ``` #### Example Request ``` { "customerInternalReference":"transaction_1234", "workflowDefinition":{ "key": 10172, }, "web": { "href": "https://hosted.jumio.com/...", "successUrl": "https://yourapp.com/success", "errorUrl": "https://yourapp.com/error" } } ``` #### Example Response ``` { "timestamp": "ISO-8601 timestamp", "account": { "id": "UUID" }, "web": { "href": "href": "https://hosted.jumio.com/fastfill/...", "successUrl": "https://yourapp.com/success" }, "sdk": { "token": "" }, "workflowExecution": { "id": "UUID", "credentials": [ { "id": "UUID", "category": "ID", "label": "ID", "allowedChannels": [ "WEB", "API", "SDK" ], "api": { "token": "", "parts": { "front": "https://api.amer-1.jumio.ai/api/v1/accounts//workflow-executions/{workflowExecutionId}/credentials/{credentialId}/parts/FRONT", "back": "https://api.amer-1.jumio.ai/api/v1/accounts//workflow-executions/{workflowExecutionId}/credentials/{credentialId}/parts/BACK" }, "workflowExecution": "https://api.amer-1.jumio.ai/api/v1/accounts//workflow-executions/" } } ] } } ``` ### Step 3: User Completes Fastfill Flow The end-user scans their ID. Data such as first name, last name, address, and date of birth is extracted automatically. #### Key Benefits - User onboarding becomes very fast (“Registrazione Veloce” in Italian) - Customer receives highly reliable, machine-extracted data :::important Fastfill does not run Fraud checks or Image checks. ::: ### Step 4: Retrieve Extracted Data (Optional) Use the Retrieval API to fetch the extracted ID data if needed. ``` GET /api/v1/accounts/{accountId}/workflow-executions/{workflowExecutionId} ``` ### Step 5: Run Full ID Verification using Existing Credentials After Fastfill, run a complete Verification workflow using **Existing Credentials**, allowing Jumio to reuse: - the previously uploaded ID document - extracted data - images This avoids asking the user to resubmit their ID. Use the Existing Credentials workflow, commonly after Fastfill. **Endpoint URL** ``` PUT https://account.{{region}}.jumio.ai/api/v1/accounts/{accountId} ``` Use a workflowDefinition key representing **ID Verification**, such as **10570** (or any customer-specific verification workflow). #### Example Request ``` { "customerInternalReference": "transaction_1234", "workflowDefinition": { "key": "10570" } } ``` ### Step 6: Workflow Finalization Once the supporting data has been uploaded, the workflow must be finalized to start the verification process. While integrating via API, you must explicitly call the finalization endpoint. #### Example Finalization Call ``` curl --location --request PUT 'https://api.amer-1.jumio.ai/api/v1/accounts/{accountId}/workflow-executions/{workflowExecutionId}' \ --header 'Authorization: Bearer xxx' ``` ### Step 7: Retrieve Final Verification Result Once processing is completed, retrieve the full results, including: - Verification status - Extracted data - Images - Reject reasons (if applicable) Upon receiving the callback, consume the retrieval API with the GET HTTP method: - US: https://retrieval.amer-1.jumio.ai/api/v1/accounts/{accountId}/workflow-executions/{workflowExecutionId} - EU: https://retrieval.emea-1.jumio.ai/api/v1/accounts/{accountId}/workflow-executions/{workflowExecutionId} - SG: https://retrieval.apac-1.jumio.ai/api/v1/accounts/{accountId}/workflow-executions/{workflowExecutionId} Once you receive the response from the Retrieval API, parse it to: - Determine the final status (e.g., passed, rejected, etc.). Learn more about risk scores here. - Review the extracted document data. - Take the appropriate next steps based on the results. #### Example Response ``` { "workflow": { "id": "UUID", "status": "PROCESSED", "definitionKey": "10570", "userReference": "MyUser", "customerInternalReference": "transaction_1234" }, "account": { "id": "UUID" }, "createdAt": "2022-11-28T23:45:02.528Z", "startedAt": "2022-11-28T23:50:37.221Z", "completedAt": "2022-11-28T23:50:55.232Z", "credentials": [ { "id": "UUID", "category": "ID", "parts": [ { "classifier": "FRONT", "href": "https://retrieval.amer-1.jumio.ai/.../parts/FRONT" }, { "classifier": "BACK", "href": "https://retrieval.amer-1.jumio.ai/.../parts/BACK" } ], "consent": { "decisionAccepted": true, "collectedBy": "CUSTOMER" } } ], "decision": { "type": "WARNING", "details": { "label": "WARNING" }, "risk": { "score": 50.0 } }, "consent": { "obtained": "yes", "obtainedAt": "2022-11-28T23:50:40.136Z" }, "steps": { "href": "https://retrieval.amer-1.jumio.ai/.../steps" }, "capabilities": { "extraction": [ { "id": "UUID", "credentials": [ { "id": "UUID", "category": "ID" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } }, "data": { "type": "DRIVING_LICENSE", "subType": "REGULAR_DRIVING_LICENSE", "issuingCountry": "USA", "firstName": "JOHN JACOB", "lastName": "SMITH", "dateOfBirth": "1969-01-18", "expiryDate": "2025-01-18", "issuingDate": "2019-12-26", "documentNumber": "N1234567", "state": "CA", "gender": "M", "currentAge": "54" } } ], "usability": [ { "id": "UUID", "credentials": [ { "id": "UUID", "category": "ID" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } } }, { "id": "UUID", "credentials": [ { "id": "UUID", "category": "FACEMAP" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } } }, { "id": "UUID", "credentials": [ { "id": "UUID", "category": "SELFIE" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } } } ] } } ``` For further details, advanced use cases, or support with customization, please refer to the complete [API documentation](../developer-resources/API/) or contact [Jumio support](https://www.jumio.com/contact/support/). --- # Introduction https://documentation.jumio.ai/docs/developer-resources/API/Integration_Intro # Introduction This guide outlines the essential steps and best practices for integrating with the Jumio Platform. It begins with key integration prerequisites, followed by instructions on how to authenticate, obtain proper authorization, and create transactions. You'll also learn how to create or update accounts, understand applicable rate limits, and manage credential acquisition workflows. To support various use cases, the guide covers how to upload support data, initiate batch transactions, and configure callbacks. Additionally, you’ll find details on how to view or retrieve workflow transactions, test with the mock service, and manage end-user consent requirements. Finally, we include best practices to ensure a smooth implementation, steps to perform a health check, and guidance on how to provide feedback to improve the integration experience. --- # Integration Prerequisites https://documentation.jumio.ai/docs/developer-resources/API/integration-prerequisites # Integration Prerequisites Work with your Jumio Account Manager to complete these prerequisites before getting started with the Jumio integration. ## Workflow Key Value(s) Obtain your workflow key value from your Jumio Account Manager. You will use the workflow key value to trigger your workflow as described in this document. If your integration will use multiple workflows, obtain all required keys. ## OAuth2 Token Activation for API Integration Contact your Jumio Account Manager to activate OAuth2 for your account. Client ID and Client secret are used to generate an OAuth2 access token. OAuth2 has to be activated for your account before an OAuth2 access token can be generated. ## Jumio Platform Configuration There are **Identity Verification Settings** that need to be configured before starting your Jumio integration. See [About the Identity Verification Settings](/docs/portals/settings/managingUserandTenant#about-the-identity-verification-settings). ## Supported TLS Cipher Suites The following cipher suites (listed in server-preferred order) are supported by Jumio during the TLS handshake: - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384 - TLS_CHACHA20_POLY1305_SHA256 - ECDHE-ECDSA-AES128-GCM-SHA256 - ECDHE-RSA-AES128-GCM-SHA256 - ECDHE-ECDSA-AES256-GCM-SHA384 - ECDHE-RSA-AES256-GCM-SHA384 These additional cipher suites are supported for the following domains: ``` portal..jumio.ai portal.jumio.ai *.web..jumio.ai web-sdk..jumio.ai diws..jumio.ai auth..jumio.ai ``` - ECDHE-ECDSA-CHACHA20-POLY1305 - ECDHE-RSA-CHACHA20-POLY1305 --- # Authenticate https://documentation.jumio.ai/docs/developer-resources/integration # Authenticate You integrate the Jumio Platform with your organization’s website, application, or mobile app when you want to use Jumio’s identity verification technology to ensure that your customers are who they claim to be. :::info Before starting your integration, complete the [Jumio Integration Prerequisites](/docs/developer-resources/API/integration-prerequisites). Consult with your Jumio account representative for additional information and assistance. ::: ## Jumio Platform Integration Process The Jumio Platform integration process outlines the steps required to securely connect your website, application, or mobile app with Jumio’s identity verification services. This process includes authenticating API requests, configuring user accounts, initiating verification workflows, acquiring credentials, and handling transaction updates. By completing these steps, you enable your application to submit identity verification transactions to the Jumio Platform, track their status, and retrieve verification results in a secure and scalable manner. ## Authenticate API Requests Using OAuth2 - Implement a service to obtain bearer tokens for authorizing API requests via the [Jumio Endpoint](https://documentation.jumio.ai/docs/developer-resources/API/) or use the Java Client Library for automatic token management. ## Enable Credential Acquisition - Enable credential upload and workflow initiation through the Jumio Web Client, Mobile SDKs, Java Client Library, and/or REST APIs, checkout [Credential Acquisition](/docs/developer-resources/API/credential-acquisition). - Create or update user accounts using the Rest APIs, checkout [this](/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts) or the Java Client Library to initiate transactions. ## Handle Callbacks and Retrieve Transactions - Set up a [Callback service](/docs/developer-resources/callback) for handling status notifications about the transactions. - [View or Retrieve](/docs/developer-resources/retrieval) workflow transaction. ![Integration Diagram](../../src/images/customerIntegration.png) --- # Authorization https://documentation.jumio.ai/docs/developer-resources/API/authorization import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; # Authorization :::caution Basic authentication is currently deprecated for the Jumio REST APIs. ::: ## OAuth 2.0 Authorization and Access Token Generation All calls to Jumio REST APIs should be authorized using OAuth2 Bearer Tokens. You obtain the bearer token by calling the Access Token URL (OAuth2) for your region with your API token and secret values, which you can find in the Jumio Portal under: **_Settings > Identity Verification > API credentials > OAuth2 Clients_** ## Transaction-Specific Tokens :::info A transaction-specific token is generated when you create or update an account. This token, used for uploading credentials and finalizing the workflow, is included in the response of the account creation or update call. ::: ## Security Best Practices for Token Handling As a security best practice, requests for bearer tokens should be server-to-server, to avoid making your Client ID and Client secret values available to an end-user’s device. Regardless of the integration channel, the end-user’s device should notify your server when a token is required. Your server should make the call to the Jumio OAuth server, and then pass the token to the end-user device. Client ID and Client secret are used to generate an OAuth2 access token. OAuth2 has to be activated for your account. Contact your Jumio Account Manager for activation. Access your Client ID and Client secret from the Portal. See [API Credentials](/docs/portals/settings/IDVSettings#api-credentials). ## Access Token Validity and Refresh :::important - OAuth 2.0 access tokens are valid for **60 minutes (3600 seconds)** by default. - To avoid unnecessary authentication requests, access tokens are cached internally, and consecutive calls may return the same token. To prevent 401 Unauthorized errors, refresh the token a few minutes before it expires. You can check the token’s expiration by decoding it and examining the exp (expiration) and iat (issued at) claims. - For testing purposes, you can use Postman’s built-in OAuth 2.0 authorization type (under the Authorization tab), which can automatically retrieve and manage tokens across your requests or collections. ::: ## Transport Security Requirements The TLS Protocol is required to securely transmit your data, and we strongly recommend using the latest version. For information on cipher suites supported by Jumio during the TLS handshake see [Supported Cipher Suites](/docs/developer-resources/API/integration-prerequisites#supported-cipher-suites). ## Access Token URLs (OAuth2) - **US:** `https://auth.amer-1.jumio.ai/oauth2/token` - **EU:** `https://auth.emea-1.jumio.ai/oauth2/token` - **SG:** `https://auth.apac-1.jumio.ai/oauth2/token` ## Rate Limits and Error Handling :::note Calls with missing, incorrect, or suspicious headers or parameter values will result in `HTTP status code 400 Bad Request Error` or `403 Forbidden`. `oauth2/token` requests are subject to [Rate Limits](../API/CreateUpdateAccounts/rate-limits). The default rate limit is 10 per second. If the rate limit is reached, a `HTTP 429 Too many requests` status code is returned. ::: ## Example: Request Access Token ```bash curl --location 'https://auth.amer-1.jumio.ai/oauth2/token'\ -u CLIENT_ID:CLIENT_SECRET \ --header 'Accept: application/json'\ --data-urlencode 'grant_type=client_credentials' ``` ```python import requests from requests.auth import HTTPBasicAuth client_id = "CLIENT_ID" client_secret = "CLIENT_SECRET" url = "https://auth.amer-1.jumio.ai/oauth2/token" response = requests.post( url, auth=HTTPBasicAuth(client_id, client_secret), headers={"Accept": "application/json"}, data={"grant_type": "client_credentials"} ) ```` ```java import org.springframework.http.*; import org.springframework.web.client.RestTemplate; import org.springframework.util.*; public class OAuthClient { public static void main(String[] args) { String clientId = "CLIENT_ID"; String clientSecret = "CLIENT_SECRET"; String url = "https://auth.amer-1.jumio.ai/oauth2/token"; RestTemplate restTemplate = new RestTemplate(); // Set Basic Auth Header HttpHeaders headers = new HttpHeaders(); headers.setBasicAuth(clientId, clientSecret); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); // Create body MultiValueMap body = new LinkedMultiValueMap<>(); body.add("grant_type", "client_credentials"); HttpEntity> request = new HttpEntity<>(body, headers); // Send POST request ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, request, String.class); System.out.println(response.getBody()); } } ```` ```php "client_credentials" ]); $options = [ "http" => [ "header" => [ "Authorization: Basic " . base64_encode("$clientId:$clientSecret"), "Content-Type: application/x-www-form-urlencoded", "Accept: application/json" ], "method" => "POST", "content" => $data ] ]; $context = stream_context_create($options); $response = file_get_contents($url, false, $context); if ($response === FALSE) { die("Error occurred while making the request."); } echo $response; ?> ```` ```typescript import axios from "axios"; import qs from "qs"; // To encode form data const clientId = "CLIENT_ID"; const clientSecret = "CLIENT_SECRET"; const url = "https://auth.amer-1.jumio.ai/oauth2/token"; async function fetchToken() { try { const response = await axios.post( url, qs.stringify({ grant_type: "client_credentials" }), { headers: { "Accept": "application/json", "Content-Type": "application/x-www-form-urlencoded", }, auth: { username: clientId, password: clientSecret, }, } ); console.log(response.data); } catch (error) { console.error("Error fetching token:", error); } } fetchToken(); ```` --- # Callback Integration https://documentation.jumio.ai/docs/developer-resources/callback # Callback Integration Configure a callback URL to automatically receive notifications about the status of each transaction. You can set a **global callback URL** in the [Application Settings](../portals/settings/aboutIDVSettings) in the Jumio Portal, or override it per request using the `callbackUrl` as an optional field in the Account creation or update request body, see [Creating or Updating Accounts](./API/CreateUpdateAccounts/creating-and-updating-accounts). ## Best Practices - Use callbacks to track workflow processing. - Save the received callback data and respond with **200 OK** to Jumio. - After receiving callbacks, retrieve transaction details or images using the retrieval APIs, refer [Calling Retrieval APIs](./API/retrieval). ## Callback IP Allowlist Allowlist the following IP addresses and hostnames for callbacks, and use them to verify that the callback originated from Jumio. | Data Center Region | IP Addresses | Callback Hostname | | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------- | | **US Data Center** |
  • 34.202.241.227
  • 34.226.103.119
  • 34.226.254.127
  • 52.8.136.236
  • 54.177.61.57
  • 54.183.15.212
| `callback.amer-1.jumio.ai` | | **EU Data Center** |
  • 34.253.41.236
  • 35.157.27.193
  • 52.48.0.25
  • 52.57.194.92
  • 52.58.113.86
  • 52.209.180.134
| `callback.emea-1.jumio.ai` | | **SGP Data Center** |
  • 3.0.109.121
  • 52.76.184.73
  • 52.77.102.92
  • 13.238.100.17
  • 13.238.203.238
  • 52.64.132.26
| `callback.apac-1.jumio.ai` | ## Callback Parameters An HTTP **POST** request is sent to your specified callback URL containing an application/json formatted string with the transaction status and metadata. | Parameter | Type | Notes | | --------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `callbackSentAt` | string | UTC timestamp of the callback in the format: `YYYY-MM-DDThh:mm:ss.SSSZ` | | `userReference` | string | User reference (if set in initiate call) | | `workflowExecution` | object | Contains details about the workflow execution. | | `workflowExecution.id` | string | UUID of the workflow | | `workflowExecution.href` | string | URL to retrieve workflow details | | `workflowExecution.definitionKey` | string | Key of the workflow definition that was executed | | `workflowExecution.status` | string | Possible values:
  • `INITIATED`- Transaction created; user has not started the workflow.
  • `PROCESSED`- The workflow has been successfully processed.
  • `ACQUISITION_STARTED`- The user has opened the transaction link, and the acquisition started. Note: This status is only available if enabled. Please contact Jumio Support to activate it.
  • `ACQUIRED`- The user has completed the required verification steps. Note: This status is only available if enabled. Please contact Jumio Support to activate it.
  • `SESSION_EXPIRED`- The session expired before the user could complete the workflow.
  • `TOKEN_EXPIRED`- The access token has expired before the transaction was started.
| | `account` | object | Contains account details. | | `account.id` | string | UUID of the account | | `account.href` | string | URL to retrieve account details | **Example** ```json { "callbackSentAt": "2025-07-28T14:27:46.776Z", "userReference": "string", "workflowExecution": { "id": "2222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "href": "https://retrieval.emea-1.jumio.ai/api/v1/workflow-executions/2222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "definitionKey": "10172", "status": "PROCESSED" }, "account": { "id": "11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "href": "https://retrieval.emea-1.jumio.ai/api/v1/accounts/11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx" } } ``` --- # View or Retrieve Workflow Transactions https://documentation.jumio.ai/docs/developer-resources/retrieval # View or Retrieve Workflow Transactions Workflow transactions record end-user activity and provide decisions, risk scores, and credential evaluation results. Each transaction includes: - **Metadata**: Unique transaction ID, account ID, and UTC timestamps. - **Service Information**: Decisions and scores returned, rules triggered, and credentials evaluated. - **Transaction decisions and risk scores**: Overall decision, risk score, and rules applied to determine the outcome. Transactions can be: - Viewed in the [Jumio Portal](../portals/explorer/viewing-transaction-details). - Retrieved programmatically via [Retrieval APIs](../developer-resources/retrieval#calling-retrieval-apis). ## Transaction Decisions and Risk Scores Each executed transaction includes a **decision**. The decision is based on the risk scorethat indicates the overall level of fraud risk for the transaction. The decision is provided as a JSON object in the [Workflow Details](../developer-resources/retrieval#workflow-details) response and can be seen in the Portal. **Example: Decision Object** ```json "decision": { "type": "WARNING", "details": { "label": "WARNING" }, "risk": { "score": 50.0 } } ``` ### Risk Scores Scores for transactions range from -1 to 100, with: - -1 indicating that the workflow was not executed. - 0 indicating no identified risk. - 100 indicating extremely high risk. :::note Transactions that are started but not completed are assigned a score of -1 and a decision:type value of NOT_EXECUTED. This usually happens when the end-user exits the process before submitting the necessary credentials. ::: ```json "decision": { "type": "NOT_EXECUTED", "details": { "label": "TOKEN_EXPIRED" }, "risk": { "score": -1.0 } }, ``` ### Decision Types The transactions is assigned a **decision type** value based on the score. By default the decision types are determined as follows: - PASSED = 0-30 - WARNING = 31-70 - REJECTED = 71-100 - NOT_EXECUTED = -1 :::tip The decision type thresholds can be configured to meet your needs and risk appetite. Contact [Jumio Support](https://www.jumio.com/contact/support/). ::: ### Decision Details Labels | Decision Type | Label | Description | | ------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | PASSED | PASSED | Label is the same as the type value. | | REJECTED | REJECTED | Label is the same as the type value. | | WARNING | WARNING | Label is the same as the type value. | | NOT_EXECUTED | TOKEN_EXPIRED | The bearer token obtained from the [Creating or Updating Accounts](../developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts) response expired prior to finalization. | | NOT_EXECUTED | SESSION_EXPIRED | The session expired prior to finalization. | ### Capability Decisions Each capability or risk signal that is called by the transaction workflow returns its own risk score and decision type. For transactions that call a single service, the transaction score and decision type are the same as the service score. However, the service is first assigned a decision type based on factors specific to each service, and the service score depends on the decision type: - PASSED = 0 - WARNING = 50 - REJECTED = 100 - NOT_EXECUTED = -1 See the reference topics listed under [Capabilities Overview](../references/capabilities/) and [Risk Signals](../references/riskSignals/overviewRiskSignals) for descriptions of when and why the decision types are assigned. For workflows that call multiple services or risk signals, the overall transaction score is calculated from the weighted average of each of the services. Weights are applied so that more significant services and signals have a greater impact on the overall score. :::info The values of any rules that are triggered by the transaction also impact the overall score. See [Rules Management](../portals/rules-management/rulesManagement). ::: ## Calling Retrieval APIs Use the Retrieval APIs to programmatically fetch workflow transactions, credentials, and risk scores, enabling automated access to transaction data. These APIs provide the following capabilities: - **Workflow Status**: Obtain the processing status of a transaction. Depending on the workflow, a transaction may take several minutes to complete. The Status API helps determine when the transaction details are available. - **Workflow Details**: Retrieve workflow metadata, credentials (including URLs for accessing each credential part), and the capabilities executed during the workflow. - **Workflow Steps**: Get information about each service called during the workflow and the capabilities executed for that service. - **Individual Workflow Credentials**: Access specific credentials associated with a transaction. - **PDF Transaction Report**: Download a transaction report as a PDF via a provided URL. For the complete API specification see: [Retrieval API Reference](../developer-resources/API/retrieval) ### Retrieval Best Practices and Recommended Retry Policy Before retrieving transaction details, ensure that the transaction is **complete**: - If you have implemented a **Callback service**, wait for the callback before requesting the transactions details. - Alternatively, use the **Workflow Status API**. If the transaction status is: - PROCESSED: The transaction is complete, and details/images can be retrieved. - SESSION_EXPIRED or TOKEN_EXPIRED: The transaction was unsuccessful, and details will not be available. **Recommended Retry Policy** To accommodate any brief interruptions to the retrieval service Jumio recommends you implement a retry policy: - Start with an initial retry after 40 seconds. - Allow a maximum of 10 consecutive unsuccessful retrieval attempts after receiving the callback. - Recommended retry intervals(in seconds): `40, 60, 100, 160, 240, 340, 460, 600, 760, 940` :::important If the transaction status remains UNPROCESSED after 940 seconds (approx. 15.5 minutes) of retrying using the recommended exponential backoff strategy, you should: - Stop further retrieval attempts. - Check the [Jumio Status Page](https://monitor.jumio.com/) for any known incidents or delays. - If no issue is reported, reach out to [Jumio Support](https://support.jumio.com/s/) for further investigation. This approach avoids unnecessary load on your system and Jumio's APIs during potential service incidents or processing delays. ::: ### Workflow Status The Status API returns information about the status of the transaction. This is typically used to verify that the transaction has completed before retrieving the details. **Example Status Response** ```json { "account": { "id": "42ff9aeb-62ce-4481-99bd-b56346a4ba1a", "href": "https://retrieval.amer-1.jumio.ai/api/v1/accounts/42ff9aeb-62ce-4481-99bd-b56346a4ba1a" }, "workflowExecution": { "id": "c3257562-941c-440c-bc9b-f59478bb48ef", "href": "https://retrieval.amer-1.jumio.ai/api/v1/workflow-executions/c3257562-941c-440c-bc9b-f59478bb48ef", "definitionKey": "10549", "status": "PROCESSED" } } ``` | Parameter | Type | Note | | ------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | account | object | Possible values:
- account.id
- account.href | | account.id | string | UUID of the account | | account.href | string | URL to retrieve account details | | workflowExecution | object | Possible values:
- workflowExecution.id
- workflowExecution.href
- workflowExecution.definitionKey
- workflowExecution.status | | workflowExecution.id | string | UUID of the workflow | | workflowExecution.href | string | URL to retrieve workflow details | | workflowExecution.definitionKey | string | Key of the workflow definition which you executed | | workflowExecution.status | string | Possible values:
- INITIATED
Waiting for credentials to be uploaded and the transaction finalized.
- ACQUIRED
Transaction has been finalized but processing has not completed.
- PROCESSED
The transaction is completed.
- SESSION_EXPIRED
The session expired prior to finalization.
- TOKEN_EXPIRED
The authorization token expired prior to finalization. | ### Workflow Details The Execution Details API returns detailed information about: - The workflow metadata and execution timestamps in UTC: - `createdAt`
The timestamp when the end user started the customer journey. - `startedAt`
The timestamp when the workflow execution started, following the call to finalize after all credentials were uploaded. - `completedAt`
The timestamp when the transaction was completed, the decision was available, and the documents saved. - An array of the credentials that were evaluated, including URLs for accessing the credential parts.
See also: [Credential Reference](../references/credentials/#id) for information about the various types of credentials. :::tip If enabled for your tenant, each credential object will include a `"consent"` object with information on if and when the end user consent was obtained. See [Jumio End-User Consent Documentation](../developer-resources/API/end-user-consent). ::: - The overall decision that was rendered by the workflow.
See [Transaction Decisions and Risk Scores](./retrieval#transaction-decisions-and-risk-scores). - If enabled for your tenant, a `"consent"` object with information on if and when the end user consent was obtained.
See [Jumio End-User Consent Documentation](../developer-resources/API/end-user-consent). - An array of the capabilities that were executed, with details on the decision that was rendered by the capability, and any additional data returned by the capability. See also: [Capabilities Reference](../references/capabilities/). :::info Detail requests are subject to Rate Limits. ::: **Example: Details Response**
```json { "workflow": { "id": "41f71912-1c6b-4e2f-b340-d6dc10cd69b8", "status": "PROCESSED", "definitionKey": "10549", "userReference": "MyUser", "customerInternalReference": "MyCompany" }, "account": { "id": "572ac7b5-9f83-409d-ba8e-f0014e411c7e" }, "createdAt": "2022-11-28T23:45:02.528Z", "startedAt": "2022-11-28T23:50:37.221Z", "completedAt": "2022-11-28T23:50:55.232Z", "credentials": [ { "id": "bce8a24b-16ba-46a8-994e-fa76e4c4845b", "category": "SELFIE", "parts": [ { "classifier": "FACE", "href": "https://retrieval.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/credentials/bce8a24b-16ba-46a8-994e-fa76e4c4845b/parts/FACE" } ], "consent": { "decisionAccepted": true, "collectedBy": "CUSTOMER" } }, { "id": "e25c0737-5753-4812-ab5c-94813e067ec9", "category": "FACEMAP", "parts": [ { "classifier": "FACEMAP" }, { "classifier": "LIVENESS_1", "href": "https://retrieval.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/credentials/e25c0737-5753-4812-ab5c-94813e067ec9/parts/LIVENESS_1" }, { "classifier": "LIVENESS_3", "href": "https://retrieval.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/credentials/e25c0737-5753-4812-ab5c-94813e067ec9/parts/LIVENESS_3" }, { "classifier": "LIVENESS_2", "href": "https://retrieval.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/credentials/e25c0737-5753-4812-ab5c-94813e067ec9/parts/LIVENESS_2" }, { "classifier": "LIVENESS_5", "href": "https://retrieval.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/credentials/e25c0737-5753-4812-ab5c-94813e067ec9/parts/LIVENESS_5" }, { "classifier": "LIVENESS_4", "href": "https://retrieval.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/credentials/e25c0737-5753-4812-ab5c-94813e067ec9/parts/LIVENESS_4" }, { "classifier": "LIVENESS_6", "href": "https://retrieval.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/credentials/e25c0737-5753-4812-ab5c-94813e067ec9/parts/LIVENESS_6" } ], "consent": { "decisionAccepted": true, "collectedBy": "CUSTOMER" } }, { "id": "fdb1bc31-99a0-4671-8f2a-2bf7ca2faace", "category": "ID", "parts": [ { "classifier": "FRONT", "href": "https://retrieval.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/credentials/fdb1bc31-99a0-4671-8f2a-2bf7ca2faace/parts/FRONT" }, { "classifier": "BACK", "href": "https://retrieval.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/credentials/fdb1bc31-99a0-4671-8f2a-2bf7ca2faace/parts/BACK" } ], "consent": { "decisionAccepted": true, "collectedBy": "CUSTOMER" } } ], "decision": { "type": "WARNING", "details": { "label": "WARNING" }, "risk": { "score": 50.0 } }, "consent": { "obtained": "yes", "obtainedAt": "2022-11-28T23:50:40.136Z" }, "steps": { "href": "https://retrieval.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/workflow-executions/41f71912-1c6b-4e2f-b340-d6dc10cd69b8/steps" }, "capabilities": { "extraction": [ { "id": "5483e41e-08a7-4d9d-a09d-9f21e41b9e72", "credentials": [ { "id": "fdb1bc31-99a0-4671-8f2a-2bf7ca2faace", "category": "ID" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } }, "data": { "type": "DRIVING_LICENSE", "subType": "REGULAR_DRIVING_LICENSE", "issuingCountry": "USA", "firstName": "JOHN JACOB", "lastName": "SMITH", "dateOfBirth": "1969-01-18", "expiryDate": "2025-01-18", "issuingDate": "2019-12-26", "documentNumber": "N1234567", "state": "CA", "gender": "M", "currentAge": "54" } } ], "similarity": [ { "id": "1fc799e4-f0ba-4dde-aaae-af857eef7b6e", "credentials": [ { "id": "bce8a24b-16ba-46a8-994e-fa76e4c4845b", "category": "SELFIE" }, { "id": "fdb1bc31-99a0-4671-8f2a-2bf7ca2faace", "category": "ID" } ], "decision": { "type": "PASSED", "details": { "label": "MATCH" } }, "data": { "similarity": "MATCH" } } ], "liveness": [ { "id": "789f4e4a-7c2f-4764-a98d-c519d082ba6d", "credentials": [ { "id": "bce8a24b-16ba-46a8-994e-fa76e4c4845b", "category": "SELFIE" }, { "id": "e25c0737-5753-4812-ab5c-94813e067ec9", "category": "FACEMAP" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } }, "data": { "type": "JUMIO_STANDARD", "predictedAge": 44, "ageConfidenceRange": "32-56" } } ], "dataChecks": [ { "id": "da2a93b5-8a1f-4db6-bdfa-fb57ada57b12", "credentials": [ { "id": "fdb1bc31-99a0-4671-8f2a-2bf7ca2faace", "category": "ID" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } } } ], "imageChecks": [ { "id": "b336a404-7775-4793-9cf6-30a7e5be1d0b", "credentials": [ { "id": "bce8a24b-16ba-46a8-994e-fa76e4c4845b", "category": "SELFIE" }, { "id": "fdb1bc31-99a0-4671-8f2a-2bf7ca2faace", "category": "ID" } ], "decision": { "type": "WARNING", "details": { "label": "REPEATED_FACE" } }, "data": { "faceSearchFindings": { "status": "DONE", "findings": [ "22771260-8cb0-42a2-a38a-d8f853063cc2", "27232651-4b18-4cf1-8d4a-df0451abc717", "9541ae91-834e-4914-a30d-6534fed4eb6d", "9414413d-2c76-44d2-9052-8876fa327a02" ] } } } ], "usability": [ { "id": "1bb41666-2745-4c9a-bd5f-d0e338d0242b", "credentials": [ { "id": "fdb1bc31-99a0-4671-8f2a-2bf7ca2faace", "category": "ID" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } } }, { "id": "db0fd83a-5f9f-4739-94f7-7868194ba1dc", "credentials": [ { "id": "e25c0737-5753-4812-ab5c-94813e067ec9", "category": "FACEMAP" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } } }, { "id": "e991586b-3345-4a2d-bfc3-1690ccb477b3", "credentials": [ { "id": "bce8a24b-16ba-46a8-994e-fa76e4c4845b", "category": "SELFIE" } ], "decision": { "type": "PASSED", "details": { "label": "OK" } } } ] } } ```
### Workflow Steps The Steps API returns details about the services that were called by the workflow. The response includes a `"steps"` array that contains an object for each service that was called as a workflow step. Each step object contains the decision rendered by that service, a "capabilities" aray that contains an object for each capability that was executed as part of the step, and an array that simply lists the IDs of each capability that was called. **Example: Steps Response**
```json { "steps": [ { "id": "73898f70-edd5-4bff-8d15-8f6e9eb81329", "name": "ID_IV", "decision": { "type": "WARNING", "details": { "label": "WARNING" } }, "capabilities": [ { "id": "1bb41666-2745-4c9a-bd5f-d0e338d0242b", "category": "usability" }, { "id": "db0fd83a-5f9f-4739-94f7-7868194ba1dc", "category": "usability" }, { "id": "e991586b-3345-4a2d-bfc3-1690ccb477b3", "category": "usability" }, { "id": "b336a404-7775-4793-9cf6-30a7e5be1d0b", "category": "imageChecks" }, { "id": "da2a93b5-8a1f-4db6-bdfa-fb57ada57b12", "category": "dataChecks" }, { "id": "5483e41e-08a7-4d9d-a09d-9f21e41b9e72", "category": "extraction" }, { "id": "1fc799e4-f0ba-4dde-aaae-af857eef7b6e", "category": "similarity" }, { "id": "789f4e4a-7c2f-4764-a98d-c519d082ba6d", "category": "liveness" } ], "capabilityIds": [ "1bb41666-2745-4c9a-bd5f-d0e338d0242b", "db0fd83a-5f9f-4739-94f7-7868194ba1dc", "e991586b-3345-4a2d-bfc3-1690ccb477b3", "b336a404-7775-4793-9cf6-30a7e5be1d0b", "da2a93b5-8a1f-4db6-bdfa-fb57ada57b12", "5483e41e-08a7-4d9d-a09d-9f21e41b9e72", "1fc799e4-f0ba-4dde-aaae-af857eef7b6e", "789f4e4a-7c2f-4764-a98d-c519d082ba6d" ] } ] } ```
### Workflow Credentials You can use the GET parts API to download the credential images and data that are associated with a transaction The fully parameterized URLs for retrieving the credential parts are available in the Workflow Details response. **Example** ```json "credentials": [ { "id": "66e0a64a-4afe-4e29-89e7-ae53db4aba93", "category": "ID", "clientIp": "xx.xx.xxx.xxx", "parts": [ { "classifier": "FRONT", "href": "https://retrieval.amer-1.jumio.ai/api/v1/accounts/6fec5b29-0e4c-42c4-b41f-72dc45307e53/credentials/66e0a64a-4afe-4e29-89e7-ae53db4aba93/parts/FRONT", "captureType": "camera" } ] } ], ``` There will be a URL for each uploaded credential part. The part can be downloaded with a GET request to the URL. Authorization requires a valid bearer token for your tenant. See [Authorization](../developer-resources/API/authorization) for information about obtaining the bearer token. The form of the URLs is: ``` https://retrieval.{data_center}/api/v1/accounts/{accountId}/credentials/{credentialId}/parts/{classifier} ``` #### Classifier Values and Return Types The response body of a successful request will contain the credential part as it was stored at the conclusion of the transaction. | Credential | Type | Classifier Description | | ---------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ID | FRONT | The file may be a PNG or a JPEG, depending on what was uploaded. | | ID | FRONT_WITH_FLASH | If the ID was captured on a mobile device with a flash, the image taken with the flash is available in addition to the non-flash FRONT image. | | ID | BACK | The file may be a PNG or a JPEG, depending on what was uploaded. | | SELFIE | FACE | The file may be a PNG or a JPEG, depending on what was uploaded. | | FACEMAP | LIVENESS\__n_ | The parts for a FACEMAP credential typically include one or several JPEG images that can be downloaded using the URLs with the LIVENESS_n classifiers. | | DOCUMENT | ORIGIN | If a PDF was uploaded, it will be available using the URL with the ORIGIN classifier.
Individual pages will also be available as JPEG files using URLs with the page number as the classifier. For example, to download the JPEG image of page 2, use:
/parts/2 | | DATA | PREPARED_DATA | Contains the extracted and processed data from the uploaded credentials. | | DATA | DEVICE_RISK | Contains risk-related information about the device used during the transaction. | | ID | FRONT_CROPPED | Cropped image of the front side of the ID captured by the user during the front-side capture process.(Planned for mid January 2026) | | ID | BACK_CROPPED | Cropped image of the back side of the ID captured by the user during the back-side capture process. (Planned for mid January 2026) | | SELFIE | FACE_CROPPED | Cropped image of the user’s face captured during the selfie capture process. (Planned for early-mid February 2026) | #### captureType Value The captureType will only be returned if your tenant is enabled. Contact [Support](https://www.jumio.com/contact/support/) if you are interested in this feature. For ID and Selfie parts, the `captureType` value indicates how the part was captured by the end user. Values may be: - `camera `if the camera in the end user's device was used to capture the image. - `upload `if the image was uploaded from the end user's device. ### PDF Generation The Generate API returns a presigned URL that can be used to download a transaction report as a PDF. This document provides the overall decision and risk score for the transaction as well as the decision and summary information returned by each capability executed by the workflow. The PDF transaction report is identical to the PDF accessible from the [transaction details](../portals/explorer/viewing-transaction-details) page in the Jumio Portal. **Example: PDF Generation Response** ```json { "workflowId": "8a68ee36-1663-473c-ae32-924ecdb0f33f", "presignedUrl": "https://core-us-prod-kyx-transaction-pdf.s3.us-east-1.amazonaws.com/8a68ee36-1663-473c-ae32-924ecdb0f33f.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIA373BKWO4OBSY5POP%2F20240520%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20240520T180143Z&X-Amz-Expires=7200&X-Amz-Security-Token=IQoJb3JpZ2luX2VjELr%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLW ..." } ``` --- # Delete Credentials https://documentation.jumio.ai/docs/developer-resources/API/CreateUpdateAccounts/deleting-credentials # Delete Credentials You can delete the credentials associated with an **account**, or a specific **transaction**. The transaction metadata and decision will not be deleted. ## 1. All Credentials Deletion You can delete all credentials associated with an account or a specific transaction. ### Ad-Hoc Deletion Use the following APIs for deleting all credentials for transactions: - [Delete All Credentials for an Account API](https://documentation.jumio.ai/developer-resources/api/retrieval#tag/Retrieval/operation/deleteAllPIIData) to delete all the credentials associated with the transaction. - [Delete All Credentials for a Transaction API](https://documentation.jumio.ai/developer-resources/api/retrieval#tag/Retrieval/operation/deletePIIDataForWorkflowExecution) to delete a specific credential part associated with the transaction. ### Deletion via Jumio Portal You can also delete all credentials for transactions through the Jumio Portal by navigating to the transaction details view. ![](./deleteTransaction.png) ## 2. Retention Period-Based Deletion You can also contact [Jumio Support](https://support.jumio.com/s/) to set a retention period for all transactions for your tenant for automatic deletion of all credentials. It is normally agreed as part of the account setup process. ### How it Works Retention policies are configured by contacting Jumio Support The retention period is typically agreed upon during account setup Deletion is triggered based on the last activity timestamp within an account (not per individual transaction) ### Key Consideration This ensures that products such as Authentication continue to function for users who remain active within the retention period. ## 3. Biometrics Credentials Only Deletion Jumio supports deleting only biometric credentials within transactions, without affecting other data. ### Ad-Hoc Deletion (via API) Use the following APIs: - [Delete Only Biometrics for an Account API](https://documentation.jumio.ai/developer-resources/api/retrieval#tag/Retrieval/operation/deleteAllPIIData). Deletes biometric credentials for all transactions under an account - [Delete Only Biometrics for a Transaction API](https://documentation.jumio.ai/developer-resources/api/retrieval#tag/Retrieval/operation/deleteBiometricsDataForWorkflowExecution). Deletes biometric credentials for a specific transaction :::note | **What Gets Deleted** | **What Is Retained** | | -------------------------------------------------------------- | ----------------------------------------------- | | Face vectors and embeddings | Original images (e.g., selfies or ID documents) | | Stored biometric templates used for matching or authentication | Transaction metadata | | | Verification results | | | Other non-biometric credentials | ::: ### Impact of Biometrics Deletion Once biometric data is removed: - Face matching and face lookup can no longer be performed for that transaction - Authentication and liveness checks cannot reuse previously stored biometric data - Deleted biometric data is not recreated, even if the transaction is accessed again ### Deletion via Jumio Portal You can also delete biometric credentials through the Jumio Portal by navigating to the transaction details view. ![](./deleteTransaction.png) ## 4. Retention Period-Based Biometrics Deletion You can configure automatic deletion specifically for biometric data. - Requires configuration through Jumio Support - Applies to all transactions within a tenant - Typically defined during account setup :::important - Retention and deletion policies for credentials containing PII are governed by Data Settings in the Jumio Portal - Retention-based deletion uses the last activity time within an account, not individual transaction timestamps - This ensures continued functionality for active users ::: :::warning Credential deletion is permanent and irreversible. Once deleted, the data cannot be recovered. ::: --- # Test with the Mock Service https://documentation.jumio.ai/docs/developer-resources/API/test-with-the-mock-service # Test with the Mock Service Jumio provides a mock service you can use to generate specific transaction outcomes. This is useful for testing any decision logic you have developed to respond to specific decisions returned by Jumio. Consistently producing the full range of decision values your integration may encounter is often difficult or impossible using actual transactions. By using the mock service you can develop robust sets of tests that use synthetic transactions to produce specific outcomes. :::tip The mock service requires a dedicated tenant that is configured to support it. Contact [Jumio Support](https://www.jumio.com/contact/support/) or your account manager to create and configure the tenant if you want to use the mock service. All transactions that are initiated in a tenant that is configured to use the mock service will use the service. ::: You initiate a synthetic transaction as you would any other transaction, with these differences: - Use OAuth2 credentials from a tenant configured to support the mock service to obtain the bearer token for authorizing the account request. - Specify the desired state of the decision in a JSON string passed as the value of the `"customerInternalReference"` key in the body of the account request. ## Example: Synthetic Transaction The following example shows how to initiate a synthetic ID+Selfie transaction for workflow 10549. The account request body is the same as for a regular transaction, except that the `"customerInternalReference"` value is a string representation of a JSON object that specifies the desired decision state. ### Account Request Body ``` { "customerInternalReference": "{\\"customerInternalReference\\":\\"mockuser\\", \\"decisionLabel\\":\\"NFC\_CERTIFICATE\\", \\"credentialWithDecision\\":\\"ID\\", \\"extractionOverrides\\":{\\"firstName\\":\\"JOHN\\", \\"idType\\":\\"PASSPORT\\", \\"issuingCountry\\":\\"USA\\", \\"lastName\\":\\"DOE\\"}}", "userReference":"Jumio Documentation", "workflowDefinition":{ "key": 10549 }, "userConsent": { "userIp": "226.80.211.232", "userLocation": { "country": "USA", "state": "IL" }, "consent": { "obtained": "yes", "obtainedAt": "2022-07-20T17:20:35.000Z" } } } ``` :::note The `customerInternalReference` value is a string. Therefore quotation marks inside the JSON object must be escaped using a \\ character. ::: ### Decision The transaction details for a mock transaction are available from the retrieval API or in the Portal. For the account request above, the transaction decision would look like this: ``` "decision": { "type": "REJECTED", "details": { "label": "MISMATCHING\_DATAPOINTS" }, "risk": { "score": 99.0 } }, ``` In the `"capabilities"` block the `"dataChecks"` JSON would look like this: ``` "dataChecks": \[ { "id": "5960c353-614c-445c-9506-219e1a1dbd38", "credentials": \[ { "id": "df82c2ed-76e8-4ff9-aa53-270b5a9e3d54", "category": "ID" } \], "decision": { "type": "REJECTED", "details": { "label": "MISMATCHING\_DATAPOINTS" } } } \], ``` In this case the `"MISMATCHING_DATAPOINTS"` label specified in the account request is only returned by the Data Checks capability. The other workflow capabilities have a `decision.type` value of `"PASSED"` and a `decision.details.label` value of `"OK"`. :::note If a workflow capability has a dependency on a capability that is given a `decision.type` of `"REJECTED"`, the dependent capability will have a `decision.type` value of `"NOT_EXECUTED"` and a `decision.details.label` value of `"PRECONDITION_NOT_FULFILLED"`. ::: ### Specifying the Decision State The value of the `"customerInternalReference"` field in the account request body is a string representation of a JSON object. The fields in the JSON object determine the decision values that will be returned for the mock transaction: - A fitting decision for the given `"decisionLabel"` value will be applied to any fitting capability in any fitting credential. - If there are mutliple credentials, the credential can be selected by the `"credentialWithDecision"` value. - Specific values to be returned in the `capabilities.extraction.data` object can be set in `"extractionOverrides"` value. The value is a nested JSON string. By default, all decisions for capabilities that do not return the specified `"decisionLabel"` will have a `"type"` value of `"PASSED"` and a `"label"` value of `"OK"`. Any capabilities that have a dependency on a capability with a mocked `"REJECTED" decision.type` will be set to `"NOT_EXECUTED"`. | Field | Description | | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | customerInternalReference | Provides a way to set the value as you would for a regular transaction. | | decisionLabel | Specifies the decision label you want to appear in the decision. This value will be used to determine the decision for any capability that returns the label, as well as for the overall transaction decision. | | credentialWithDecision | Allows you to specify which credential will trigger the decision. For example, if the workflow processes both an ID and a Selfie and both are evaluated by the Usability capability, you can control which Usability instance gets the decision. | | extractionOverrides | A nested JSON sting that allows you to override the default Extraction data values. | --- # Business Logic Guidelines https://documentation.jumio.ai/docs/developer-resources/businessLogicGuide # How to Handle Workflow Results in Jumio? Handling workflow results effectively is essential to ensure a smooth and secure identity verification process. In Jumio, workflow results provide valuable insights into the outcome of each verification step, enabling your business logic to determine the appropriate next actions for users. This guide outlines best practices and key considerations for interpreting workflow results and implementing decision logic—helping you streamline user experiences, reduce friction, and maintain compliance and security standards. ## Top-Level Decision Object The top-level object in the Jumio response consists of a score and a type by default. This logic results from evaluating the applicable capabilities. Additionally, if configured with a ruleset ID, Jumio can apply a decision-mapping layer that summarizes complex verification outcomes into clear, standardized result codes. This optional feature makes it easier to understand why a transaction was rejected or flagged by surfacing the underlying reason directly in the top-level response. - Please ask your Jumio representative for assistance with enabling this, if desired. Doing so will allow the results of the ruleset to be displayed at the top-level workflow response object for easy decisioning. - Otherwise, your business logic will need to parse through the capabilities in the response to determine where any irregularities occurred (see table [below](#recommended-actions-for-common-verification-outcomes) for common handling decisions for various outcomes). ## Standard Jumio Verification Rules :::note Jumio includes some default behavior that you may wish to change. Speak to an Integration Specialist at Jumio to learn about how to align this behavior to your use case requirements. ::: Some examples include: - Jumio rejects photocopied documents by default. - By default, multiple people detection occurs during the liveness detection capability. - Repeated faces result in **“WARNING”** decisions. - Jumio does not, by default, return **“WARNING”** decisions for expired documents – this needs to be configured with assistance from your Jumio representative. ## Recommended Actions for Common Verification Outcomes The following table summarizes common Jumio results and suggested actions for handling them. These examples are not exhaustive and should be adapted to your specific business logic and risk requirements. | **Step / Capability** | **Jumio Result** | **Common Action** | | -------------------------------------------------------------------------------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Risk Score = 0** | Low risk | Indicates low or no detected risk. Approve the user. | | **[Usability](https://documentation.jumio.ai/docs/references/capabilities/usability)** | REJECTED | If a transaction comes back with REJECTED for the Usability category, that doesn’t necessarily mean that it’s a fraudulent transaction. It just means that the user wasn’t able to provide suitable images for the transaction, as described by the [specific decision detail label](https://documentation.jumio.ai/docs/references/capabilities/usability#decision-details-labels). Common next steps are to prompt to retry, perhaps on a different channel. For example, if the user formerly completed the transaction on their desktop browser, invite them to try again on their mobile browser, etc. | | **[Usability](https://documentation.jumio.ai/docs/references/capabilities/usability)** | WARNING | Route accordingly based on your use case requirements for the country/document. Check country settings and evaluate internally. | | **[Extraction](https://documentation.jumio.ai/docs/references/capabilities/extraction)** | REJECTED | Extraction is always either passed or not executed. NOT_EXECUTED can be the result of a competing automation setting configuration. This could be an artifact of an automated extraction issue or a “missing mandatory data point,” e.g., a required data point was not able to be extracted (such as if some glare were blurring the DOB field on a document, etc.). | | **[Image Checks](https://documentation.jumio.ai/docs/references/capabilities/image-checks)** | REJECTED | Typically maps to fraud/bad actor. Make your decision a specific function of the decision label. | | **[Image Checks](https://documentation.jumio.ai/docs/references/capabilities/image-checks)** | WARNING | There are currently only three WARNING decision labels for this category:
  • Different person
  • Repeated face
  • Ghost image quality insufficient
Additional detail about each of these exceptions is described [here](https://documentation.jumio.ai/docs/references/capabilities/image-checks#decision-details-labels). Each should be uniquely handled with regard to your use case requirements. It is strongly recommended to implement Jumio’s [update account endpoint](https://documentation.jumio.ai/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts) to minimize the occurrence of repeated faces to only those transactions that are not expected to be affiliated with the same account ID. | | **[Data Checks](https://documentation.jumio.ai/docs/references/capabilities/data-checks)** | REJECTED | Typically maps to fraud/bad actor. However, make your decision a specific function of the decision label. | | **[Data Checks](https://documentation.jumio.ai/docs/references/capabilities/data-checks)** | WARNING | Handle each of these as needed by your use case requirements, as each can be quite particular. | | **[Liveness](https://documentation.jumio.ai/docs/references/capabilities/liveness)** | REJECTED | Typically maps to fraud/bad actor. Each decision label possibility should be circumstantial and reviewed to align with your specific business use case requirements. Handle individually based on the specific reject reason (e.g., multiple people) to create some exception handling. | | **[Liveness](https://documentation.jumio.ai/docs/references/capabilities/liveness)** | WARNING | Each decision label possibility should be circumstantial and reviewed to align with your specific business use case requirements. | | **[Similarity](https://documentation.jumio.ai/docs/references/capabilities/similarity)** | NO_MATCH | Handle circumstantially. | | **[Similarity](https://documentation.jumio.ai/docs/references/capabilities/similarity)** | NOT_POSSIBLE | Hyper edge case, handle circumstantially. | :::note - A rejection in any single capability will result in a rejection for the entire transaction. - Many rejection reasons are highly specific and should be treated as edge cases, as they may not always indicate fraudulent behavior. For example, while most **Image Check – REJECTED** decision labels typically suggest potential fraud, the **PUNCHED** decision label may not necessarily imply fraudulent intent. ::: :::tip Need help building this into your code or platform? Contact our [Support team](https://support.jumio.com/s). ::: --- # Create Transaction https://documentation.jumio.ai/docs/developer-resources/API/create-transaction # Create a Transaction Transaction represents a single instance of a workflow execution (e.g. identity verification) tied to an account. To initiate a transaction, specify the associated account ID, workflow configuration, and any optional metadata. Each transaction is uniquely tracked and managed under its parent account. --- # Create, Update, or Link Accounts https://documentation.jumio.ai/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts # Create, Update or Link Accounts An account is a unique identifier (UUID) that is used to associate a set of credentials and transactions (i.e. workflow executions) with a customer. Each transaction is associated with one account, and an account can be associated with multiple transactions. - If you are onboarding a new customer, use the [POST](https://documentation.jumio.ai/docs/developer-resources/API/account) request to create a new account. - If you are updating an existing account, use the [PUT](https://documentation.jumio.ai/docs/developer-resources/API/account) request, with the account ID value as a path parameter. :::important - If you need to **[link an existing credential to an account](../CreateUpdateAccounts/using-existing-credential)** rather than creating a new one, include the existing CredentialID in your request payload. ::: For the complete API specification see: [Account API Reference](https://documentation.jumio.ai/docs/developer-resources/API/). :::note Creating or updating the account is always done through a REST API call, regardless of the integration channel. Account requests are subject to [Rate Limits](../CreateUpdateAccounts/rate-limits). ::: ## Account Request The request body for either an account creation or account update request is a JSON object. ### Required Fields | Field | Type | Max. Length | Notes | | ----------------------------------------------------------------------- | ------ | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | customerInternalReference | string | 100 | Customer internal reference for a request to link it in the customer backend (must not contain any PII). Must not contain any of the following characters: <>"/;`%{} | | [workflowDefinition](creating-and-updating-accounts#workflowdefinition) | object | 255 | A `key` value is required to specify the workflow for the transaction. Other values may be required, depending on the workflow. | ### Account Request Body Required Fields Example ```json { "customerInternalReference": "myTransactionReference", "workflowDefinition": { "key": 10549 } } ``` ### Optional Fields | Field | Type | Max. Length | Notes | | ------------------------------------------------------------------- | ------ | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | userReference | string | 100 | Reference for the end user in the customer backend (must not contain any PII) | | reportingCriteria | string | 255 | Additional information provided by a customer for searching and aggregation purposes | | callbackUrl | string | 255 | Definition of the callback URL for this particular request. Overrides callback URL in the Jumio Portal. | | tokenLifetime | string | min: 5m, max: 60d, default: 30m | Should be a valid date period unit definition: s - seconds, m - minutes, h - hours d - days. Example: ‘1d’ / ‘30m’ / ‘600s’. Overrides Authorization token lifetime in the Jumio Portal. | | [web](creating-and-updating-accounts#web) | object | | Used to override default values that are configured in the Portal. Only relevant for the WEB channel. | | [userConsent](creating-and-updating-accounts#userconsent) | object | | If your integration uses [REST APIs for Credential Acquisition](https://documentation.jumio.ai/docs/developer-resources/API/) you must obtain the end-user's consent to share their personal information with Jumio. See: [End-User Consent to Collect Personal Data](/docs/developer-resources/API/end-user-consent). | | [overrideSettings](creating-and-updating-accounts#overridesettings) | object | | Used to override some tenant settings. | ### workflowDefinition A workflowDefinition object is required for all requests, and must include a `key` value that specifies the workflow for the transaction. Additional objects may be required to configure workflows that use some services or risk signals, including: - [Credentials](creating-and-updating-accounts#credentials) object used to specify a particular type of credential to upload for the transaction. For example, the Document Verification service (standalone workflow 10026), or any workflow that uses the [extraction](../../../references/capabilities/extraction) capability to extract data from a [document](../../../references/credentials/#document) credential. - [Capabilities](creating-and-updating-accounts#capabilities) object used to specify configuration options for specific capabilities. #### credentials An array of the credentials required for the workflow. A credentials array is required if credentials are going to be uploaded by REST API calls. A credentials array is also used to: ##### credentials Object Example (ID) - Limit the sets of [ID](../../../references/credentials/#id) types and countries that are presented to end user during the customer journey. For example, the following limits the end user to choosing either USA or Canada, and either Driving License or ID Card. No other options are presented. ```json "credentials": [ { "category": "ID", "country": { "predefinedType": "DEFINED", "values": ["USA", "CAN", "BRA"] }, "type": { "predefinedType": "DEFINED", "values": ["DRIVING_LICENSE", "ID_CARD"] }, "subType": { "predefinedType":"DEFINED", "values":["DIGITAL_DRIVING_LICENSE_PDF"] } } ] ``` :::info - The `subType` field is only available **for Web integrations** and supports the following values:
  • `DIGITAL_DRIVING_LICENSE_PDF`- This option requires `country: "BRA"` and `type: "DRIVING_LICENSE"`.
  • `EIDAS`- This option requires `country: ` and `type: "DIGITAL_IDENTITY"`.
- In the Web Client, if exactly one country + document type combination is preconfigured in the credentials array, the document-type selection screen will be skipped, and the user will proceed directly to uploading that document. - If multiple country and/or document type options are preconfigured, then the Web Client will show a limited selection screen, displaying only those predefined countries and document types to the end user. ::: ##### credentials Object Example (Document) - Specify a [document](../../../references/credentials/#document) credential to use with a Document Verification workflow such as 10026. In this case the type and country must be specified to enable the [extraction](../../../references/capabilities/extraction) capability. For example, the following is required to enable the extraction of expected values from a Bank Statement from the USA: ```json "credentials": [             {                 "category": "DOCUMENT",                 "country": {                     "predefinedType": "DEFINED",                     "values": ["USA"]                 },                 "type": {                     "predefinedType": "DEFINED",                     "values": ["BS"]                 }               }         ] ``` ##### credentials Object Example (FACEMAP) Specify a FACEMAP credential to use with an Authentication workflow such as 10549. In this case, the category must be set to "FACEMAP" and a type must be specified to determine the FACEMAP source. Possible values for the FACEMAP type include: - JUMIO_STANDARD - JUMIO_PREMIUM For example, the following configuration is required to enable the use of Jumio Standard FACEMAP: ```json "credentials" : [{ "category" : "FACEMAP", "type" : { "values" : ["JUMIO_STANDARD"] } }] ``` | Field | Type | Notes | | -------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | id | string | UUID of the credentials | | category | string | Credential category. Possible values:
  • ID
  • DOCUMENT
  • FACEMAP
It is not common to specify a FACEMAP. Consult with your account representative for additional information. | | country | object | Defined at least one ISO 3166-1 alpha-3 country code for the workflow definition. Possible values: `ISO 3166-1 alpha-3 country code` | | type | object | Defined number of credential type codes. Possible values:
  • ID_CARD
  • DRIVING_LICENSE
  • PASSPORT
  • VISA
  • DIGITAL_IDENTITY
| | subType | object | The `subType` field is only available **for Web integrations** and supports the following values:
  • `DIGITAL_DRIVING_LICENSE_PDF`- This option requires `country: "BRA"` and `type: "DRIVING_LICENSE"`.
  • `EIDAS`- This option requires `country: ` and `type: "DIGITAL_IDENTITY"`.
| #### capabilities Provide values for capabilities that require additional configuration properties. | Field | Type | Notes | | ----------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------ | | [watchlistScreening](creating-and-updating-accounts#watchlistscreening) | object | Override the default search profile. | | [documentVerification](creating-and-updating-accounts#documentverification) | object | Configure additional capabilities to use with Document Verification. | | [ekycCheck](creating-and-updating-accounts#ekyccheck) | object | Used to specify a 1+1 or 2+2 search. | | [workflowDecision](creating-and-updating-accounts#workflowdecision) | object | Used to specify a ruleset to use instead of the default ruleset configured for the tenant. | | [ruleset](creating-and-updating-accounts#ruleset-to-work-with-default-scoring-deprecated) | object | Override the default ruleset used by the workflow. | ##### watchlistScreening Used to configure the [Watchlist Screening](../../../references/capabilities/watchlist) capability by overriding the default searchProfile. Consult your Jumio representative for additional information. ```json "capabilities":{ "watchlistScreening": { } } ``` :::info searchProfile is the alphanumeric string that is the identifier for your searchProfile. ::: ##### documentVerification Used to disable Extraction in cases where a Document is uploaded to be stored but extracting the data is not required. Consult your Jumio representative for additional information. ```json "capabilities": { "documentVerification": { "enableExtraction": "false" } } ``` ##### ekycCheck Includes a `searchType `value. Allowed values are: - `one` if requesting a 1+1 check - `two `if requesting a 2+x2 check ```json "capabilities": { "ekycCheck": { "searchType": "one" } } ``` ##### workflowDecision Used to specify a ruleset to use instead of the default ruleset configured for the tenant. ```json "capabilities": { "workflowDecision": { "riskScoreRulesetId": "81c616b7-d47e-4cb2-8c4f-17267f2106f3" } } ``` ##### ruleset to work with default scoring (deprecated) :::info Sending rules using the workflowDecision object is preferred over using a ruleset for most cases. This flow is only to handle exceptions. ::: Used to specify one or more rulesets to use instead of the default ruleset(s) used by the workflow. ```json "capabilities": { "ruleset": { "ids": ["id1", "id2", "id3"] } } ``` The values in the "ids" array are the ruleset IDs of the rulesets you want to use. See also: [Working with Rules](../../../portals/rules-management/working-with-rules#rules). #### web These values are only relevant for the WEB channel. They are used to override the default values that are configured in the Portal. See [Application Settings.](https://documentation.jumio.ai/docs/portals/settings/aboutIDVSettings) | Field | Type | Max. Length | Notes | | ---------- | ------ | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | successUrl | string | 1900 | URL to which the browser will send the end user at the end of a successful web acquisition user journey. Overrides default success URL.\* | | errorUrl | string | 1900 | URL to which the browser will send the end user at the end of a failed web acquisition user journey. Overrides default error URL.\* | | locale | string | 5 | Renders content in the specified language. Overrides Default locale. | :::note Success and error URLs provided through an Account request are less restrictive than the defaults. For example, local domains and schemes for deep linking are supported. ::: ##### web Object Example ```json "web":{ "successUrl":"https://www.yourcompany.com/success", "errorUrl":"https://www.yourcompany.com/error", "locale":"es" } ``` ### userConsent Checkout [End-User Consent to Collect Biometric Data](/docs/developer-resources/API/end-user-consent) for details. #### User Consent JSON ```json "userConsent": { "userIp": "226.80.211.232", "userLocation": { "country": "USA", "state": "IL" }, "consent": { "obtained": "yes", "obtainedAt": "2022-07-20T17:20:35.000Z" } } ``` ### overrideSettings You can override the following tenant settings for a transaction on the Web Client, the Web SDK and Mobile SDK: | Field | Type | Notes | | ----------------------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `crossDeviceOnly` | boolean | Specifies whether credential acquisition must be completed on a mobile device. Possible values:
  • `true`,
  • `false`.
| | `crossDeviceOption` | string | Specifies how a mobile device receives the connection. Possible values:
  • `DEFAULT` – end user can choose email or QR code;
  • `QR_ONLY` – only the QR code option is shown;
  • `EMAIL_ONLY` – only the email option is shown.
| | `allowedCaptureMethod` | string | Specifies which capture method(s) are allowed for document submission during the verification flow. Possible values:
  • `ALL` – Allows both live capture (photobooth) and file upload;
  • `PHOTOBOOTH` – Allows only live capture using the device camera.
| | `skipNFC` | boolean | Specifies whether the NFC process is triggered after a document scan. Possible values:
  • `true` – The NFC process is skipped.
  • `false` – The NFC process is triggered when supported by the document.
| #### overrideSettings Object Example ```json { "customerInternalReference":"myCompany", "overrideSettings":{ "crossDeviceOnly": true, "crossDeviceOption":"QR_ONLY", "allowedCaptureMethod":"ALL", "skipNFC": true }, "workflowDefinition":{ ... } } ``` ## Account Responses The response from the API includes the UUID and additional information you will need for the transaction, including: - The account ID and the workflow execution ID for the transaction. These values are used for [viewing or retrieving Workflow Transactions](../../retrieval). - The fully parameterized URL for the [Web Client](../../web-client/). - The authorization token you will need if you are using one of the [Mobile SDKs](../../SDKs/mobile-sdk/introduction-mobile). - Details about the credentials that need to be provided for evaluation by the workflow. This includes data that will be used by the integration channel to upload the credential and associate it with the account. :::tip Workflows that evaluate multiple instances of the same type of credential can provide a "label" value to distinguish between the instances. ::: - The URLs you will use if you are [Uploading Credentials](../../API/credentials#tag/Credentials) using the REST APIs.
Example Account Response ```json { "timestamp": "2022-11-28T23:45:02.536Z", "account": { "id": "572ac7b5-9f83-409d-ba8e-f0014e411c7e" }, "web": { "href": "https://greenunion.web.amer-1.jumio.ai/web/v4/app?authorizationToken=eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_5XOMQ7CMAwF0LtkxpKdOk7MxsjKDRInYWkBiUogIe5O2huw_v_09T-uvU-rOzoSUYka0XNSd3DZ7FxHHqLPFksA7WkCRq1QcmrQEYkbE1lsG98xU4-k5IFMCnDzHcrECFWqEVoVLWngV2__cLu0PvTj_lyXfIP1vlzB8jz7rduHvHRGDAmIMQB7GSeFK0zGOan2ZiG57w9fvJLI7AAAAA.0NpDK192_6kMSYfxFuqHPFkhdsKQBqieRvSqt3XAGLWRe7Y8u0aJalMa8TLEY8eA0XEw4TqRapVLDraRHUz4kQ&locale=en-US" }, "sdk": { "token": "eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_5XOMQ7CMAwF0LtkxpKdOk7MxsjKDRInYWkBiUogIe5O2huw_v_09T-uvU-rOzoSUYka0XNSd3DZ7FxHHqLPFksA7WkCRq1QcmrQEYkbE1lsG98xU4-k5IFMCnDzHcrECFWqEVoVLWngV2__cLu0PvTj_lyXfIP1vlzB8jz7rduHvHRGDAmIMQB7GSeFK0zGOan2ZiG57w9fvJLI7AAAAA.0NpDK192_6kMSYfxFuqHPFkhdsKQBqieRvSqt3XAGLWRe7Y8u0aJalMa8TLEY8eA0XEw4TqRapVLDraRHUz4kQ" }, "workflowExecution": { "id": "41f71912-1c6b-4e2f-b340-d6dc10cd69b8", "credentials": [ { "id": "fdb1bc31-99a0-4671-8f2a-2bf7ca2faace", "category": "ID", "allowedChannels": ["WEB", "API", "SDK"], "api": { "token": "eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_5XOMQ7CMAwF0LtkxpKdOk7MxsjKDRInYWkBiUogIe5O2huw_v_09T-uvU-rOzoSUYka0XNSd3DZ7FxHHqLPFksA7WkCRq1QcmrQEYkbE1lsG98xU4-k5IFMCnDzHcrECFWqEVoVLWngV2__cLu0PvTj_lyXfIP1vlzB8jz7rduHvHRGDAmIMQB7GSeFK0zGOan2ZiG57w9fvJLI7AAAAA.0NpDK192_6kMSYfxFuqHPFkhdsKQBqieRvSqt3XAGLWRe7Y8u0aJalMa8TLEY8eA0XEw4TqRapVLDraRHUz4kQ", "parts": { "front": "https://api.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/workflow-executions/41f71912-1c6b-4e2f-b340-d6dc10cd69b8/credentials/fdb1bc31-99a0-4671-8f2a-2bf7ca2faace/parts/FRONT", "back": "https://api.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/workflow-executions/41f71912-1c6b-4e2f-b340-d6dc10cd69b8/credentials/fdb1bc31-99a0-4671-8f2a-2bf7ca2faace/parts/BACK" }, "workflowExecution": "https://api.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/workflow-executions/41f71912-1c6b-4e2f-b340-d6dc10cd69b8" } }, { "id": "e25c0737-5753-4812-ab5c-94813e067ec9", "category": "FACEMAP", "allowedChannels": ["WEB", "SDK"] }, { "id": "bce8a24b-16ba-46a8-994e-fa76e4c4845b", "category": "SELFIE", "allowedChannels": ["WEB", "API", "SDK"], "api": { "token": "eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_5XOMQ7CMAwF0LtkxpKdOk7MxsjKDRInYWkBiUogIe5O2huw_v_09T-uvU-rOzoSUYka0XNSd3DZ7FxHHqLPFksA7WkCRq1QcmrQEYkbE1lsG98xU4-k5IFMCnDzHcrECFWqEVoVLWngV2__cLu0PvTj_lyXfIP1vlzB8jz7rduHvHRGDAmIMQB7GSeFK0zGOan2ZiG57w9fvJLI7AAAAA.0NpDK192_6kMSYfxFuqHPFkhdsKQBqieRvSqt3XAGLWRe7Y8u0aJalMa8TLEY8eA0XEw4TqRapVLDraRHUz4kQ", "parts": { "face": "https://api.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/workflow-executions/41f71912-1c6b-4e2f-b340-d6dc10cd69b8/credentials/bce8a24b-16ba-46a8-994e-fa76e4c4845b/parts/FACE" }, "workflowExecution": "https://api.amer-1.jumio.ai/api/v1/accounts/572ac7b5-9f83-409d-ba8e-f0014e411c7e/workflow-executions/41f71912-1c6b-4e2f-b340-d6dc10cd69b8" } } ] } } ```
:::note For ID and Selfie credentials upload JPEG or PNG files with a maximum size of 15 MB and the following image resolution limits: | Image Type | Resolution (min) | Resolution (max) | Additional Requirements | | ------------------ | ---------------- | ---------------- | ---------------------------------------------------------------------------------- | | **Document Image** | 563x355 px | 8000x8000 px | The document must be at least **512 px wide** and **323 px high**. | | **Selfie Image** | 480x640 px | 8000x8000 px | The face must be at least **320 px tall** and cover **at least 15%** of the image. | ::: --- # Use Existing Credentials https://documentation.jumio.ai/docs/developer-resources/API/CreateUpdateAccounts/using-existing-credential import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; # Use Existing Credentials In the Jumio platform, customers can reuse ID, Selfie, and Facemap Credentials from previous transactions for subsequent transactions—whether performed via web, mobile, or API channels. To be eligible for reuse, two conditions must be met, - The original Credential must have successfully passed usability checks. - Explicit user consent must have been obtained for the data. :::note This feature supports the entire Credential, not individual parts of it. If a workflow does not require any new Credentials and all existing Credentials are reused, the workflow will be automatically finalized. In this case, you can initialize the workflow using the account update API and either wait for the callback or call retrieval directly. ::: ## Consent Requirement Consent must be enabled to use this feature. The original transaction, in which the credential was provided to KYX, must include recorded consent. ## Channel Support Existing-credential workflows are supported through API and SDK channels. Use these channels to ensure proper functionality. ## Multi-Credential Support Workflows function best when each credential type is provided only once. Ensure there’s no duplication of credential types in the same workflow. ## Credential Support | Credential | Existing Credential Supported | Preconditions | | ---------- | ----------------------------- | ---------------------------------- | | ID | Yes | Usability PASSED, Consent Provided | | FACEMAP | Yes | Usability PASSED, Consent Provided | | SELFIE | Yes | Usability PASSED, Consent Provided | ## Setting Up a Workflow with Existing Credentials When creating a workflow in Jumio Designer, you can select whether to use an existing credential. ### Initialization - By default, the latest credential for that category on the account will be used. - If the credential (ID, SELFIE, FACEMAP) is usable, it will be applied automatically; otherwise, an error will occur during initialization. - You can also specify a credential explicitly using its credential identifier (`uuid`), which is included in the retrieval response of previous workflows. ### Auto-Finalization If all credentials are existing, the workflow will be finalized automatically. After performing an account update, you do not need to call the finalization API. **Sample workflows: 10112, 10113, 10114, 10115** ![](./workflow.png) ## Sample Requests ### Request 1: Account update – default (latest credential used) This request uses the normal account update payload. The latest credential of each type will be used automatically if usable. ### Request 2: Account update – specific credential IDs This request explicitly specifies which credential IDs to use for the transaction. ```json { "customerInternalReference": "myTransactionReference", "workflowDefinition": { "key": 10113 }, "userConsent": { "userIp": "xxx.80.211.xxx", "userLocation": { "country": "USA", "state": "IL" }, "consent": { "obtained": "yes", "obtainedAt": "2023-03-20T17:20:35.000Z" } }, "userReference": "myUserReference" } ``` ```json { "customerInternalReference": "myTransactionReference", "workflowDefinition": { "key": 10113, "credentials": [ { "category": "ID", "id": "dfxcv-faddf-cdfsfds-sdsdfa" }, { "category": "FACEMAP", "id": "asdfdfxcv-faddfdsf-cdfsfds-sdsd234" } ] }, "userConsent": { "userIp": "xxx.80.211.xxx", "userLocation": { "country": "USA", "state": "IL" }, "consent": { "obtained": "yes", "obtainedAt": "2023-03-20T17:20:35.000Z" } }, "userReference": "myUserReference" } ``` ## Sample Responses ### Case 1: When some credentials need to be uploaded In this scenario, some credentials already exist, while others must be uploaded by the end user. The account update response includes upload links only for the credentials that require new uploads. ### Case 2: When all credentials already exist If all required credentials are available, no upload links are included and processing starts immediately. Finalization is not required. ```json { "timestamp": "2023-09-08T06:30:52.164Z", "account": { "id": "89d585b9-ab3e-4de8-bb39-d79ecda2bfa7" }, "workflowExecution": { "id": "bc6d862e-a1ae-40fa-9781-8fc755f75976", "credentials": [ { "id": "b701e6c5-b74c-434a-866a-ef1f084a4d80", "category": "ID", "allowedChannels": ["WEB", "API", "SDK"], "api": { "token": "<>", "parts": { "front": "https://api.emea-1.jumio.link/api/v1/accounts/89d585b9-ab3e-4de8-bb39-d79ecda2bfa7/workflow-executions/bc6d862e-a1ae-40fa-9781-8fc755f75976/credentials/b701e6c5-b74c-434a-866a-ef1f084a4d80/parts/FRONT", "back": "https://api.emea-1.jumio.link/api/v1/accounts/89d585b9-ab3e-4de8-bb39-d79ecda2bfa7/workflow-executions/bc6d862e-a1ae-40fa-9781-8fc755f75976/credentials/b701e6c5-b74c-434a-866a-ef1f084a4d80/parts/BACK" }, "workflowExecution": "https://api.emea-1.jumio.link/api/v1/accounts/89d585b9-ab3e-4de8-bb39-d79ecda2bfa7/workflow-executions/bc6d862e-a1ae-40fa-9781-8fc755f75976" } }, { "id": "b701e6c5-b74c-434a-866a-ef1f084a4d80", "category": "SELFIE", "allowedChannels": [] } ] } } ``` ```json { "timestamp": "2023-09-08T06:30:52.164Z", "account": { "id": "89d585b9-ab3e-4de8-bb39-d79ecda2bfa7" }, "workflowExecution": { "id": "bc6d862e-a1ae-40fa-9781-8fc755f75976", "credentials": [ { "id": "b701e6c5-b74c-434a-866a-ef1f084a4d80", "category": "ID", "allowedChannels": [] } ] } } ``` ## Sample Error Responses ### Error 1: Account initiate used instead of account update ```json { "type": "about:blank", "title": "Bad Request: Workflow [10113] requires [ID, SELFIE] existing credentials therefore no new account can be created. The update account endpoint has to be used instead", "status": "400", "detail": "[]", "instance": "/api/v1/accounts" } ``` ### Error 2: Account update used but credentials are unusable ```json { "type": "about:blank", "title": "Bad Request: Workflow 10115 requires [ID] existing credentials but [ID] are unusable for the account 02e2c457-9424-43dd-b691-c1a9167a4144", "status": "400", "detail": "[]", "instance": "/api/v1/accounts/02e2c457-9424-43dd-b691-c1a9167a4144" } ``` ### Error 3: Account update used but credential ID is invalid ```json { "type": "about:blank", "title": "Bad Request: JSON parse error: Cannot deserialize value of type `java.util.UUID` from String dfxcv-faddf-cdfsfds-sdsdfa: UUID has to be represented by standard 36-char representation", "status": "400", "detail": "[]", "instance": "/api/v1/accounts/02e2c457-9424-43dd-b691-c1a9167a4144" } ``` :::warning If an eIDAS digital ID is used instead of a physical ID, the system does not have access to the ID face, meaning (face comparison) Similarity Checks cannot be performed. The actual ID image is also not returned. Additionally, the data points returned may differ when using an eIDAS digital ID. For risk scoring, this limitation may need to be addressed in your rules configuration. Credential reusability is also not supported when using an eIDAS digital ID. ::: --- # Credential Acquisition https://documentation.jumio.ai/docs/developer-resources/API/credential-acquisition # Credential Acquisition: Customer Journey Your end users must upload the required credentials and trigger the workflow that evaluates the credentials. Jumio refers to this process as the **"customer journey"** and provides several integration channels you can use to implement it. These include: - [Web Client](../web-client) offers intuitive guidance for your end-users and handles interactions with their camera and other device features. - [Jumio SDKs](../SDKs/Overview_of_SDKs) offer a complete default customer journey with options for customization. - [REST APIs](../API/) for credential uploads and workflow finalization, giving you full control over the customer journey. Depending on the workflow, you may also upload [supporting data](../../references/glossaries#supporting-data) in addition to an ID, Document, Selfie, and/or Facemap. Supporting data is used for enhanced fraud detection and to provide additional validation checks for extracted data. See [Uploading Supporting Data](../API/uploadingSupportData). :::note - Regardless of which implementation channel(s) you choose to use, all transactions are initiated by a REST API call to create or update an account. See [Creating or Updating Accounts](../../developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts). The response from the call includes the tokens and URLs described in the following topics. - Jumio software is currently not designed to work with kiosk solutions. Features such as taking a picture of the ID document and selfie will not function properly and may impact the user experience, quality, and accuracy. This includes iPads or other tablets that are operating in a mounted setup. ::: --- # Upload Supporting Data https://documentation.jumio.ai/docs/developer-resources/API/uploadingSupportData # Upload Support Data Supporting data are values that are uploaded in addition to other credential types to support fraud detection and improve identity verification. ## Examples of Supporting Data For example, uploading the following: - End user name - Phone number - Email address These values are typically not available from ID data alone and can be used to check against lists of known or suspected fraudulent actors. ## Types of Supporting Data Supporting data is typically either: - Entered by the end-user as form data prior to initiating the Jumio customer journey. - Retrieved from data stored previously. :::note Use the **[Uploading Prepared Data](./../API/credentials#tag/Credentials)** guide to submit supporting data via the PREPARED_DATA URL.” ::: Once the supporting data is uploaded, Jumio acquires any remaining credentials and executes the **verification workflow**. ![](../../img/SupportData.png) ## Supporting Data Values The following values can be uploaded as [Prepared Data](../../references/credentials/#data). | **Key** | **Type** | **Mandatory** | **Description** | | --------------------- | ---------------- | ------------- | ------------------------------------------------------ | | `firstName` | `string` | yes | First name of the subject. | | `lastName` | `string` | yes | Last name of the subject. | | `email` | `string($email)` | yes | Primary email address of the subject. | | `phoneNumber` | `string` | yes | Primary phone number of the subject in E.164 format. | | `dateOfBirth` | `LocalDate` | yes | Date of birth in `YYYY-MM-DD` format only. | | `address` | `Object` | yes | | | `address.line1` | `string` | yes | | | `address.line2` | `string` | no | | | `address.city` | `string` | yes | City of residence as it appears on the ID. | | `address.postalCode` | `string` | yes | Postal or zip code. | | `address.subdivision` | `string` | no | City subdivision of residence as it appears on the ID. | | `address.country` | `string` | yes | Country in ISO-3166-1 Alpha-3 Code format. | ## Example Prepared Data Body ``` { "firstName": "John", "lastName": "Smith", "phoneNumber": "+15031234567", "email": "email@gmail.com", "dateOfBirth": "1972-11-16", "address": { "line1": "12345 SW Address Ln", "postalCode": "12345", "city": "Any Town", "subdivision": "OR", "country": "USA" } } ``` --- # Batch Transactions - Jumio https://documentation.jumio.ai/docs/developer-resources/batch/batch-transactions # Batch Transactions You can initiate multiple transactions and upload the required credentials as a batch using SFTP and CSV files. This process supports uploading **ID, Selfie, and document images**, as well as supporting prepared data to improve verification and fraud detection. :::note This feature must be enabled for your tenant, contact [Jumio Support](https://www.jumio.com/contact/support/). The feature is only available to customers using the Jumio Platform and Portal. It is not available to customers using Netverify or other older Jumio products. ::: When batch processing is enabled for your tenant you can access the `Jumio Portal / Settings / Identity Verification / Batch Uploads` page. From which you can: - Generate the **SSH Key** for secure SFTP uploads. See [Batch Credentials](#batch-credentials). - Select **OAuth2 credentials** to authorize batch transactions. - Check the status of batch jobs you have run and locate processed transactions. See [Batch Status and Locating Processed Transactions](#batch-status-and-locating-processed-transactions). The batch files are uploaded to a folder identified by a UUID. See [Batch Uploads](#batch-uploads) for details on file formats, naming the folder, initiating the processing, and troubleshooting problems. ![](images/BatchUploadPage.png) ## Batch Credentials Setup For the Batch Credentials Setup navigate to Jumio Portal / Settings / Identity Verification / Batch Uploads page select Batch Credentials tab and do the following: - Select the **OAuth2 credentials** that will be used to authorize the transactions in the batch. - Generate the **SSH Key pairs** you will use to connect to the Jumio SFTP server. ![](images/GenerateSSHKey.png) ### OAuth2 Credentials for Batch Transactions Select the Oauth2 credentials that will be used to authorize the batch transactions. :::info You must select an active credential defined in the Jumio Portal / Settings / Identity Verification / Api Credentials / OAuth2 Clients page, with permissions to both **Initiate** and **Retrieve & Delete**. ::: 1. Navigate to the Jumio Portal / Settings / Identity Verification / Batch Uploads page and select the **Batch Credentials tab**. 2. From the API Credential drop-down list select the credential you want to use. The list will show all active credentials, so be sure and select a credential with with permissions to both **Initiate** and **Retrieve & Delete**. 3. Click **Save** and apply the credentials for all batch transactions. The selected credential will be used to authorize all batch transactions for the tenant. You can update the credential at any time by creating a new credential in the OAuth2 Clients page and repeating the steps above. ### SSH Key Generation for SFTP Generate the SSH key pair that will be used to encrypt data transfers between your SFTP client and the Jumio server for your tenant. 1. Navigate to the Jumio Portal / Settings / Identity Verification / Batch Uploads page and select the **Batch Credentials tab**. 2. Click **Generate new SSH Key**. 3. In the Generate new SSH Key dialog, verify that the **Merchant GUID for your tenant and your email** are correct, and click **Confirm**. 4. Copy both private and public keys from the SSH Key Pair dialog and store them securely where they can be accessed by your SFTP client. **Add Private Key to a \*.pem file** (example “sshkey.pem”) within your system to use within SFTP client for authentication :::important After you close the SSH Key Pair dialog the keys will no longer be available. If you lose the private key you must generate a new one. ::: 5. Close the dialog, and note the SFTP URL that is displayed. This is the URL you will connect to from your SFTP client. :::info The SSH key is valid for 30 days. Lost keys require generating a new key. ::: ## Batch Uploads To upload a batch and initiate the transaction processing: 1. Connect to the SFTP server for your tenant from your SFTP Client. See [SFTP Client](#sftp-client). 2. Create a folder with a UUID for the name. See [Create Folder with UUID Name](#create-folder-with-uuid-name). 3. Upload a CSV file with the transaction data. See [CSV File Format](#csv-file-format). 4. If the transactions require ID, Selfie, and/or Document images upload the archive file. See [Images](#images). 5. Upload a file named DONE to initiate processing. Monitor the status of the batch job in the Jumio Portal / Settings / Identity Verification / Batch Uploads page. See [Batch Status and Locating Processed Transactions](#batch-status-and-locating-processed-transactions). ### SFTP Client In your SFTP client connect to the server for your tenant using the **SFTP URL** shown in the Jumio Portal / Settings / Identity Verification / Batch Uploads / Batch Credentials tab: ![](images/SFTPUrl.png) Use the generated SSH Key for the connection. You will log into a home folder dedicated to your organization. :::tip Disable the **resume transfer** and **timestamp preservation** features if they are supported by your SFTP client. ::: #### Create Folder with UUID Name After connecting to the server create a folder on the server, using a UUID as the folder name. For example: ``` 096c7aef-c3dd-4427-9f93-f64295b8f2d6 ``` UUID generators are available in most programming languages. #### Examples: UUID Generators ``` Python import uuid random_uuid = uuid.uuid4() ``` ``` NodeJS import crypto from 'crypto'; function uuidv4() { return ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, c => (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16) ); } const randomUUID = uuidv4(); ``` ``` Java import java.util.UUID; UUID randomUUID = UUID.randomUUID(); ``` ``` .NET Guid randomUUID = Guid.NewGuid(); ``` :::note If you are creating a folder manually, you can also search and utilize one of “UUID Generator” websites available online. ::: ### CSV File Format Create a CSV (comma separated values) file with one header row and a row for each transaction in the batch. #### Sample CSV File **Download the sample file [here](/files/input.csv).** #### Example Batch CSV File ``` workflowDefinitionKey,accountId,riskScoreRulesetId,customerInternalReference,userReference,frontImage,backImage,faceImage,document1,document1Country,document1Types,userConsentUserIp,userConsentUserLocationCountry,userConsentUserLocationState,userConsentConsentObtained,userConsentConsentObtainedAt,preparedData.firstName,preparedData.lastName,preparedData.phoneNumber,preparedData.email,preparedData.address.line1,preparedData.address.postalCode,preparedData.address.city,preparedData.address.subdivision,preparedData.address.country 10015,7473ba2b-473c-4e71-b2ad-b7040b6bcb13,,test reference 1,user12762573,FRA_ID_front.jpg,FRA_ID_back.jpg,,,,,226.80.211.232,USA,CA,yes,2022-07-20T17:20:35.000Z,,,,,,,,, 10011,,,test reference 2,user23827923,FRA_ID_front.jpg,FRA_ID_back.jpg,FRA_ID_face.jpg,,,,226.80.211.232,USA,CA,yes,2022-07-20T17:20:35.000Z,,,,,,,,, 10010,,133e9f99-519b-481b-9d92-6fdcabb75b98,test reference 3,user12861249,,,,,,,226.80.211.232,USA,CA,yes,2022-07-20T17:20:35.000Z,Roger,Jackson,4.31503E+12,abhiabhiabhi@gmail.com,12345 SW Address Ln,12345,Any Town,OR,USA 10232,7473ba2b-473c-4e71-b2ad-b7040b6bcb13,,test reference 4,user12762573,,,,USA_SSC.jpeg,USA,SSC,226.80.211.232,USA,CA,yes,2022-07-20T17:20:35.000Z,Roger,Jackson,4.31503E+12,abhiabhiabhi@gmail.com,12345 SW Address Ln,12345,Any Town,OR,USA ,,,test reference 5,user98734538 ``` :::caution - Please be cautious while using MS-Excel for CSV file handling as it tends to change formatting for certain fields when saved, which may make the CSV file invalid. - There must be no more than 10,000 rows in the CSV file. - If there is any field which has comma (,) included, it needs to be put within double quotes (“”) to ensure file format remains valid. - The csv filename needs to be "input.csv". Any other filename will not be accepted. ::: #### Field Description | Field | Required | Description | | ---------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `workflowDefinitionKey` | yes | The workflow key. Default is `10015`. | | `customerInternalReference` | yes | Customer internal reference for a request to link it in the customer backend (must not contain any PII). Must not contain any of the following characters: `` <>"/;\`%{} `` | | `accountId` | no | Used only in case of Account Update and not a new Account Creation. Refers to Jumio-provided Account ID in response to Account Creation step. [More info](/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts). | | `riskScoreRulesetId` | no | Used to specify a ruleset to use instead of the default ruleset configured for the tenant. [More info](/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts). | | `userReference` | no | Reference for the end user in the customer backend (must not contain any PII). Must not contain any of the following characters: `` <>"/;\`%{} `` | | `frontImage` | no | File name of the front image, including path relative to the CSV file, if it is present in a subdirectory within the UUID directory. The file must be in the uploaded images. | | `backImage` | no | File name of the back image, including path relative to the CSV file, if it is present in a subdirectory within the UUID directory. The file must be in the uploaded images. | | `faceImage` | no | File name of the face (selfie) image, including path relative to the CSV file, if it is present in a subdirectory within the UUID directory. The file must be in the uploaded images. | | `document1` | no | For workflows with document verification. File name of the document, including path relative to the CSV file. File format and requirements: [see here](/docs/references/credentials/#document). | | `document1Country` | no | ISO 3166-1 alpha-3 country code of the document's origin. Used for document verification. | | `document1Types` | no | Type of the document being processed. Supported types listed [here](/docs/references/credentials/#document). | | `userConsentUserIp` | no\* | If applicable, [consent](../API/end-user-consent) is required similar to API channel. | | `userConsentUserLocationCountry` | no\* | If applicable, [consent](../API/end-user-consent) is required similar to API channel. | | `userConsentUserLocationState` | no\* | If applicable, [consent](../API/end-user-consent) is required similar to API channel. | | `userConsentConsentObtained` | no\* | If applicable, [consent](../API/end-user-consent) is required similar to API channel. | | `userConsentConsentObtainedAt` | no\* | If applicable, [consent](../API/end-user-consent) is required similar to API channel. | | `preparedData.firstName` | no\*\* | May be required if you are [uploading supporting data](../API/uploadingSupportData). | | `preparedData.lastName` | no\*\* | May be required if you are [uploading supporting data](../API/uploadingSupportData). | | `preparedData.phoneNumber` | no\*\* | May be required if you are [uploading supporting data](../API/uploadingSupportData). | | `preparedData.email` | no\*\* | May be required if you are [uploading supporting data](../API/uploadingSupportData). | | `preparedData.dateOfBirth` | no\*\* | May be required if you are [uploading supporting data](../API/uploadingSupportData). | | `preparedData.address.line1` | no\*\* | May be required if you are [uploading supporting data](../API/uploadingSupportData). | | `preparedData.address.postalCode` | no\*\* | May be required if you are [uploading supporting data](../API/uploadingSupportData). | | `preparedData.address.city` | no\*\* | May be required if you are [uploading supporting data](../API/uploadingSupportData). | | `preparedData.address.subdivision` | no\*\* | May be required if you are [uploading supporting data](../API/uploadingSupportData). | | `preparedData.address.country` | no\*\* | May be required if you are [uploading supporting data](../API/uploadingSupportData). | :::info - Populating the userConsent fields conforms to the requirements described in [End-User Consent to Collect Personal Data](../API/end-user-consent). - Any prepared data fields required by the workflow can be uploaded through the csv. Use the `preparedData` format in the header row. Some prepared data fields are required if you are [Uploading Supporting Data](../API/uploadingSupportData). ::: ### Images Upload all images referenced in the CSV file to the folder created with the UUID name. See also [Uploading Credentials](#batch-credentials) for additional information on image requirements. ## Batch Status and Locating Processed Transactions You can see details about the batch job in the the Jumio Portal / Settings / Identity Verification / Batch Uploads page. ### Status | Status Name | Comment | | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- | | CREATED | Initial job creation | | IN_PROGRESS | Job execution initialized | | IN_PROGRESS_INGEST | Validating the input file and ingesting into the database for processing | | IN_PROGRESS_PROCESS | Create/upload credentials and finalize workflows based on data from the ingest step | | IN_PROGRESS_WAITING_PROCESSED_CONFIRMATION | All workflows are created, credentials uploaded, and finalized; now waiting for PROCESSED messages for each workflow | | COMPLETED | Job execution received the target amount of workflow PROCESSED messages | | COMPLETED_WITH_ERROR | At least one of the workflows has been errored out. See [Error Messages](../batch/batch-transactions#error-messages) | | ERROR | An error is encountered in the middle of a job execution. See [Error Messages](../batch/batch-transactions#error-messages) | ### Error Messages Download the job information to see error messages. ![](images/downloadBatchErrors.png) There can be two error categories: - If input file validation fails. - If specific transactions have a processing error. #### File Validation Errors If the input file validation has errors (for example, if a required column is missing), no workflows will be executed. Fix the issue with the file and create a new batch job. #### File Validation Error Message Example ![](images/error-message-example.png) #### File Validation Error Messages | Error Name | Detail Present to User | Can User Self-Repair | Comment | | ---------------------- | ---------------------- | -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `INPUT_FILE_NOT_FOUND` | YES | YES | Either the `input.csv` is not found or an image file referenced within `input.csv` is not found. | | `INVALID_CSV` | YES | YES | The CSV is invalid. This could be due to:
  • A string is too long
  • Not all headers and data are present
  • Other reason causing invalidity
| | `INVALID_FILE_SIZE` | YES | YES | Either the `input.csv` exceeds the allowed file size, or one of the images referenced within `input.csv` exceeds the allowed file size. | ### Transaction Processing Errors Transactions from the input CSV are processed sequentially by the row number. If a transaction causes an error, the batch job will not stop and will continue processing all subsequent records. To identify any failures, you must download the error logs for the completed job. It will also show the total number of records, how many succeeded, and how many failed. These logs contain the error details for each problematic transaction, and you only need to correct and resubmit the specific records listed in them under a new Batch Upload job. ![](images/transaction_processing_error.png) #### Transaction Processing Error Message Example ![](images/sample_transaction_processing_error.png) #### Transaction Processing Error Messages | Error Name | Detail Present to User | Can User Self-Repair | Comment | | --------------------------------- | ---------------------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `JUMIO_WORKFLOW_API` | NO | NO/YES | This is an internal error, due to the Jumio API not being able to complete the workflow process. | | `JUMIO_WORKFLOW_API_UNAUTHORIZED` | NO | NO/YES | The Jumio API rejected the workflow request with Unauthorized (401).
  • The stored credential may no longer be valid or available
  • May need to be updated
| | `JUMIO_WORKFLOW_API_FORBIDDEN` | NO | NO/YES | The Jumio API rejected the workflow request with Forbidden (403).
  • The stored credential may not have the required permissions
  • May need to be updated
| | `INGEST_ERROR` | NO | NO | This is due to some unexpected input validation error other than the ones listed above. Contact [Support](https://www.jumio.com/contact/support/). | | `PROCESS_ERROR` | NO | NO | This is due to some unexpected processing error while reading the raw records and creating workflows. Contact [Support](https://www.jumio.com/contact/support/). | | `NO_AVAILABLE_EXECUTOR` | NO | NO | Contact [Support](https://www.jumio.com/contact/support/). | ### Locating Processed Transactions You can retrieve all processed transactions using the same Request Reference you see on the status page as a "filter" criteria within the "Reporting Criteria" field in [explorer](../../portals/explorer/work_with_transaction_table#filtering-data-in-the-explorer) page on Jumio Portal. ![](images/processedBatchTransactions.png) :::info Remember, batch transactions use the API Channel. ::: --- # End-User Consent https://documentation.jumio.ai/docs/developer-resources/API/end-user-consent # End-User Consent to Collect Personal Data End-user consent is required whenever Jumio collects or processes personal data as part of an Identity Verification workflow. This includes both government-issued **ID documents** and **biometric data**. Collecting consent ensures that the end user understands _what personal data is being captured, why it is required, and how it will be used_. ## When End-User Consent Is Required By default, Jumio retrieves and acts as the data controller for end-user credentials used in Identity Verification services. Transactions that include collecting [ID](/docs/references/credentials/#id) or biometric credentials, such as a [Selfie](/docs/references/credentials/#selfie) or [Facemap](/docs/references/credentials/#facemap), require end-user consent prior to uploading the data. If your integration implements the customer journey using the Web Client or the default SDK UIs, user consent management is built into the UI. If your integration uses the mobile SDK with custom UIs, see the **Consent Handling** section of the integration guides for the [Mobile SDK](/docs/developer-resources/SDKs/mobile-sdk/introduction-mobile): - [Android Controller and Consent Handling](https://github.com/Jumio/mobile-sdk-android/blob/master/docs/integration_guide.md#controller-handling) - [iOS Controller and Consent Handling](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/integration_guide.md#controller-handling) If your integration uses REST APIs to upload credentials, you are responsible for obtaining the end user's consent, as described below. If you require access to the consent details for a transaction, see [Retrieving Consent Details](../API/end-user-consent#retrieving-consent-details). ## Incorporating Consent Language and Linking to Jumio’s Privacy Notice in Your UI If you are using the API channel, you must incorporate explicit consent collection language and a link to Jumio’s Privacy Notice in your application, along with mechanisms for collecting the consent data (for example, checkboxes or buttons) prior to acquiring the end-user's credentials: > “I consent to Jumio collecting, processing, and sharing my personal information, which may include biometric data, as set out in its [Privacy Notice](https://www.jumio.com/legal-information/privacy-notices/online-services-notice/).” :::info The Jumio Privacy Notice is at: [https://www.jumio.com/legal-information/privacy-notices/online-services-notice/](https://www.jumio.com/legal-information/privacy-notices/online-services-notice/). ::: ### Example Screen Showing Consent Language ![Example Screen Showing Consent Language](../../../src/images/StartVerificationConsentExample.png) ## Populating the User Consent JSON The user consent data must be added to the body of the Account creation or update request, as shown in the following example: ```json "userConsent": { "userIp": "226.80.211.232", "userLocation": { "country": "USA", "state": "IL" }, "consent": { "obtained": "yes", "obtainedAt": "2022-07-20T17:20:35.000Z" } } ``` :::tip If the credential is rejected you can add or update the `userConsent` object and re-submit using the Account Update API. ::: See also: - [Creating or Updating Accounts](/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts) - [Account API Reference](/docs/developer-resources/API/account) ## Processor By default Jumio acts as a data controller for the end-user credentials. In some cases Jumio will act as a data processor. For a description of how the European Union defines data controller and data processor for purposes of complying with GDPR rules checkout: [What is a data controller or a data processor?](https://commission.europa.eu/law/law-topic/data-protection/reform/rules-business-and-organisations/obligations/controllerprocessor/what-data-controller-or-data-processor_en) Even if Jumio is acting as a data processor, if the end user is located inside the United States and biometric data is collected on the API channel, consent language must still be presented to the end user, and populating the userConsent object is mandatory. If not provided or not accepted the transaction will be rejected during the credential upload. However, implicit consent is allowed, instead of requiring the user to explicitly check a box. The following is an example of how consent may be presented to the end user, but you may use your own custom language as long as the required elements are present: :::tip By clicking **“Start”** you consent to Jumio collecting, processing, and sharing your personal information, which may include biometric data, pursuant to its Privacy Notice. ::: ## Retrieving Consent Details By default details about if and when the end user consent was obtained are not provided in the Workflow Details. If you require access to the user consent details contact your Jumio Account Manager or Technical Support to enable retrieval for your tenant. Once it is enabled the data will be included in the workflow details response. If enabled, the workflow details response will include: - A consent JSON object for the transaction, including the UTC timestamp for when the consent was obtained: ``` "consent": { "obtained": "yes", "obtainedAt": "2022-11-28T23:50:40.136Z" }, ``` - A consent JSON object for each credential: ``` "consent": { "decisionAccepted": true, "collectedBy": "CUSTOMER" } ``` --- # Direct Consent Requirements https://documentation.jumio.ai/docs/developer-resources/API/direct-consent-requirements # Direct Consent Requirements If you are utilizing the API or Custom UI SDK for data acquisition, Jumio requires you to incorporate specific language, collect consent on behalf of Jumio, and provide Jumio with a record of the consent. This page summarizes the requirements for collecting consent on Jumio’s behalf. ## Consent Requirements
Why does consent need to be collected from the end user? As a data controller, Jumio relies on consent to process personal information for Jumio Services.
---
What type of consent is required? End users must provide direct consent to **Jumio’s collection and sharing of personal information, including biometric data**.
---
What do I need to do? Display the required consent language with a control for explicit, affirmative action — such as a checkbox or radio button that the end user must toggle before they can proceed. **The required language is as follows and must include the link to Jumio’s privacy notice:** > “I consent to Jumio collecting, processing, and sharing my personal information, which may include biometric data, pursuant to its [Privacy Notice](https://www.jumio.com/legal-information/privacy-notices/online-services-notice/).”
---
Will a transaction be rejected if the consent parameters are not populated? An end user should not be allowed to proceed with verification without providing consent. If a transaction is sent to Jumio without the required consent parameters, the transaction will be rejected.
---
Will Jumio review the implementation prior to deployment? Yes, Jumio will ask you to submit a screenshot of the user journey to ensure the applicable language and checkbox (or other control) is included.
---
Will the consent language need to be presented before every transaction an end user initiates per customer? Jumio requires direct consent from users each time they go through the journey in ID Verification or Identity Verification. If you use Jumio Authentication, we require users to give direct consent the first time they authenticate. This consent is good for three years, after which you will need to request new consent from them.
## API Requirements
What type of consent parameters are required for the API? If you are utilizing the Jumio API for data acquisition: - Incorporate the required consent language (including a link to Jumio’s Privacy Notice) and a checkbox or similar active control into the user consent flow. - Populate the IP address and end user's current location for each transaction. - Populate the API consent parameters (i.e., consent, timestamp, IP address) for each transaction to confirm that consent has been granted to Jumio.
---
Where can I find the technical implementation documentation? - See **[End-User Consent to Collect Personal Data](../API/end-user-consent)**. - For older Netverify versions of the API (v2): **[Netverify ID Verification Web Implementation Guide](https://jumio.mcoutput.com/netverify/Content/Netverify/performNetverify%20Implementation.htm#end-user-consent-for-biometric-data-in-api)**. - For older KYX versions of the API (v3): **[Implementation Guide KYX (v3)](https://jumio.mcoutput.com/v3/Content/v3/Introduction.htm#End-User_Consent_for_Biometric_Data)**.
--- ## Custom UI Requirements :::info For customers using a custom UI with manual User Consent submission, the system ensures the consent is not older than three years. If the consent has expired, an error screen will appear. :::
What type of consent parameters are required for the Custom UI SDK? If you are utilizing the Jumio Custom UI SDK for data acquisition: - Incorporate the required consent language (including the link to Jumio’s Privacy Notice) and checkbox or similar active control into the user consent flow. - Initiate the Custom UI SDK as described in the technical documentation to receive applicable consent requirements for the transaction. - Return a response containing the consent text, privacy notice URL, consent type, and consent status, as defined within the technical specifications, for each transaction to confirm that consent has been granted to Jumio.
---
Does it apply to all versions of the Custom UI SDK? This is applicable for SDK versions **4.5 and above**. If you are using an SDK version earlier than 4.5, it will require an update to the latest version.
---
Where can I find the technical implementation documentation? See the Integration Guide for your integration: - **Android**: [Android Controller and Consent Handling](../SDKs/mobile-sdk/mobile-sdk-android-master/docs/integration_guide#consent-handling) - **iOS**: [iOS Controller and Consent Handling](../SDKs/mobile-sdk/mobile-sdk-ios-master/docs/integration_guide#consent-handling)
--- # Best Practices https://documentation.jumio.ai/docs/developer-resources/bestPractices/Overview_bestPractices # Best Practices - **Use the Health Check API** regularly to ensure Jumio services are operational before initiating transactions. - **Provide feedback** on transactions when Jumio’s automated decision differs from your internal evaluation—this helps improve accuracy and flags discrepancies for review. - Feedback enhances system learning and ensures alignment between Jumio outcomes and your business rules. ## 1.1 Environment Setup - Maintain separate Development, Staging, and Production environments. - Use unique API keys for each environment. - Test extensively in staging before deploying to production. ## 1.2 Secure API Key & Credential Management - Store API keys in secure locations (environment variables, secrets managers). - Never expose API keys in client-side code. - Rotate API keys periodically and revoke immediately if compromised. - Restrict API key permissions to least privilege and limit usage to specific IPs/endpoints. ## 1.3 Network Security - Enforce HTTPS for all API calls. - Perform strict SSL/TLS verification. ## 1.4 Handling Network Errors, Timeouts & Retries - Implement retry mechanisms with exponential backoff. - Limit retry attempts and handle failures gracefully. - Define request timeouts and inform users of delays. ## 1.5 Version Management & Updates - Always use the latest stable API version. - Monitor Jumio documentation for updates and deprecations. - Test compatibility before upgrading. --- # Health Check https://documentation.jumio.ai/docs/developer-resources/bestPractices/health-check # Health Check Use this API to check the status of the Jumio services. ## HTTP Request Method **GET** - US: https://status.amer-1.jumio.ai - EU: https://status.emea-1.jumio.ai - SG: https://status.apac-1.jumio.ai Health Status Request Example ``` > curl https://status.apac-1.jumio.ai ``` ## Health Check Response
Response | Field | Type | Note | | --- | --- | --- | | status | string | Possible values:
- UP
- DEGRADED
- DOWN | | details | object | Possible values:
- details.api
- details.callback
- details.mobile
- details.processing
- details.retrieval
- details.web | | details.api | string | Possible values:
- UP
- DEGRADED
- DOWN | | details.callback | string | Possible values:
- UP
- DEGRADED
- DOWN | | details.mobile | string | Possible values:
- UP
- DEGRADED
- DOWN | | details.processing | string | Possible values:
- UP
- DEGRADED
- DOWN | | details.retrieval | string | Possible values:
- UP
- DEGRADED
- DOWN | | details.web | string | Possible values:
- UP
- DEGRADED
- DOWN |
### Response Examples #### Status: UP ``` {"status":"UP","details":{}} ``` #### Status: DEGRADED ``` { "status":"DEGRADED", "details": { "mobile":"DEGRADED", "callback":"DEGRADED" } } ``` #### Status: DOWN ``` { "status":"DEGRADED", "details": { "mobile":"DEGRADED", "callback":"DEGRADED" } } ``` --- # Provide Feedback https://documentation.jumio.ai/docs/developer-resources/bestPractices/provide-feedback # Provide Feedback After Jumio has processed a transaction, you can provide feedback on the decision automatically assigned by the workflow. If you believe a decision requires clarification or correction, you can assign a feedback status to the transaction and a reason for the feedback. When you provide such feedback, you are essentially tagging the transaction to note the discrepancy between the status assigned by Jumio and the status your organization has determined should be applied. For transactions that evaluate an [ID credential](/docs/references/credentials/#id), providing feedback will affect subsequent transactions in your tenant, and all other tenants belonging to the same Jumio customer, that involve the same ID. The same ID is determined by matching criteria including: - issuingCountry - ID type - documentNumber - firstName - lastName - dateOfBirth If the feedback status was: **NOT_FRAUD:** If you mark an ID as **NOT_FRAUD**, any subsequent transaction with matching ID data will be approved by the lookup components such as, - Data Lookup [Data Checks](/docs/references/capabilities/data-checks) - Face Lookup ([Data Checks](/docs/references/capabilities/data-checks) + [Image Checks](/docs/references/capabilities/image-checks)) components. Both lookup mechanisms incorporate customer feedback, so marking an ID as NOT_FRAUD directly influences these two components. However, **this does not override other independent fraud or data-quality checks** within the workflow. A transaction may still be rejected due to: - MISMATCHING_DATAPOINTS - ID_DATA_INVALID - Or any other [Data Checks](/docs/references/capabilities/data-checks) or [Image Checks](/docs/references/capabilities/image-checks) that is **not part of the Lookup mechanisms** This clarifies that NOT_FRAUD only affects Data Lookup and Face Lookup, while all other checks continue to operate independently. **FRAUD:** For any subsequent transactions with a matching ID the transaction will be rejected. The Data Checks capability decision will be REJECTED and the decision details label will be CUSTOMER_FEEDBACK. :::tip The transaction feedback feature is an optional feature that Jumio customers may elect to use at their sole discretion. By using this feature you acknowledge and agree that Jumio relies on the information provided by you for this feature and that Jumio has no knowledge of the accuracy and correctness of such information. Accordingly, you shall not use this feature for illegal, unethical, or discriminatory purposes, and you assume sole responsibility and liability for any consequences of your use of this feature. Jumio disclaims all liability for any harm or damage arising out of or in connection with your use of the Transaction Feedback feature. ::: Jumio provides a Feedback API you can use to submit the feedback for a transaction. Use a PUT request to provide the feedback status and reason values. The request body is a JSON object. ## Feedback via Jumio Portal You can submit feedback through the **Jumio Portal**, checkout [Transaction Feedback](../../portals/explorer/viewing-transaction-details#provide-feedback-on-a-transaction). ## Feedback Request Body Example ``` { "status": "FRAUD", "reason": "FIRST_PARTY_FRAUD" } ``` ## Feedback Request Fields | Field | Type | Required | Notes | | ------ | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | status | string | yes | The allowed status values are:
  • **FRAUD**: Indicates that the ID data should be rejected in future transactions
  • **NOT_FRAUD**: Indicates that the ID data should be accepted in future transactions.
  • **NA**: Use this when you have previously submitted feedback for the same ID data but no longer want the previously set value to apply to future transactions.
| | reason | string | no | The reason for setting the status value. A reason is required if the status value is FRAUD. Refer the table below. | ### Reason Values and Descriptions | Reason | Description | | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Not_Available | No reason provided. Select this option if you have already submitted a feedback reason but wish to remove it. | | Account_Takeover | Unauthorized access to a user's account, often through hacking or stolen credentials. | | Company_Policy | Risks associated with non-compliance or violation of internal company policies and procedures. | | First_Party_Fraud | Deceptive activities where a legitimate account holder intentionally engages in fraud. | | Government_Regulations | Risks arising from failure to comply with laws and regulations set by government authorities. | | Identity_Fraud | Unauthorized use of someone's personal information to commit fraudulent activities. | | Insider_Fraud | Fraudulent activities carried out by individuals within an organization, exploiting internal access. | | Money_Laundering | Concealing the origins of illegally obtained money, often involving complex financial transactions.
If this reason is provided the feedback will not influence subsequent transactions with the same ID. | | Payment_Fraud | Unauthorized or fraudulent transactions involving the use of payment methods.
If this reason is provided the feedback will not influence subsequent transactions with the same ID. | | Phishing | Fraudulent attempts to obtain sensitive information, such as usernames and passwords, by posing as a trustworthy entity. | | Synthetic_ID_Fraud | Creation of fictitious identities using a combination of real and fake information for fraudulent purposes. | | Third_Party_Fraud | Fraudulent activities initiated by external entities not directly associated with the organization. | ## Feedback in Transaction Details API Response If you have provided feedback on a transaction the feedback is available in the [Workflow Details](/docs/developer-resources/retrieval#workflow-details) response. The response body will include a `feedback` key with a JSON object containing fields for the `status`, `reason`, and a `providedAt` timestamp. ``` }, "feedback": { "status": "FRAUD", "reason": "FIRST\_PARTY\_FRAUD", "providedAt": "2024-07-24T17:37:29.349Z" }, ``` --- # Rate Limits https://documentation.jumio.ai/docs/developer-resources/API/CreateUpdateAccounts/rate-limits # Rate Limits Rate limits apply to a tenant. These API requests are governed by rate limits that protect the stability and performance of the system. The following are: ## Authorization Requests The default rate limit for [authorization](../../API/authorization) requests for bearer tokens is 10 per second. If the rate limit is reached a `HTTP 429 Too many requests` status code is returned. ## Account Requests The default rate limit for Account requests that initiate a new transaction is one per second, per tenant. The system builds in some flexibility to accommodate higher bursts for short durations, and you can contact Jumio Support if you require higher burst rates than the defaults allow. If the rate limit is reached a `HTTP 429 Too many requests` status code is returned, as shown in the following example: ``` HTTP/1.1 429 Too Many Requests Content-Type: application/json { "title": "Too Many Requests", "status": 429, "detail": "Request limit exceeded" } ``` :::info Jumio Netverify customers (created after March 2024) are subject to a default rate limit of 5 initiate requests per 5 seconds. Customers (created prior to March 2024) without an existing custom rate limit are subject to a default rate limit of 15 initiate requests per 5 seconds. ::: ## Retrieval Requests The default rate limit for requests to retrieve transaction details is fifteen per second, per tenant. :::info For retrieval requests, customers created after March 2024 have a default rate limit of 75 requests every 5 seconds. Customers created before March 2024 have a higher default limit of 225 requests every 5 seconds. ::: --- # API Endpoints https://documentation.jumio.ai/docs/developer-resources/API/ # API Endpoints in Jumio Jumio provides a set of REST API endpoints that enable seamless integration for account management, credential handling, data retrieval, and real-time status checks. Each endpoint is designed to support secure and efficient workflows for identity verification and related operations. - **[Account API](https://documentation.jumio.ai/developer-resources/api/account)** – Manage account setup, updates, and configuration to control how Jumio services interact with your systems. - **[Credentials API](https://documentation.jumio.ai/developer-resources/api/credentials)** – Handle secure creation, management, and rotation of API credentials for authentication. - **[Retrieval API](https://documentation.jumio.ai/developer-resources/api/retrieval)** – Fetch identity verification results, images, and related data for completed transactions. - **[Status Endpoint API](https://documentation.jumio.ai/developer-resources/api/status-endpoint)** – Get real-time updates on the processing status of identity verification requests. - **[Aggregate API](https://documentation.jumio.ai/developer-resources/api/aggregateAPI)** - Provides a synchronous experience. ## REST APIs for Credential Acquisition In addition to the REST APIs for Creating or Updating Accounts and Viewing or Retrieving Workflow Transactions that are used for all integration channels, Jumio provides REST APIs for: - [Uploading Credentials](#uploading-credentials) - [Workflow Finalization](#workflow-finalization) to execute the transaction workflow once the credentials have been uploaded. :::tip If you use the APIs to upload credentials to Jumio you must first obtain the end-user's consent on Jumio's behalf. See to [Collect Personal Data](/docs/developer-resources/API/end-user-consent) and [Creating or Updating Accounts](/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts). ::: ### Uploading Credentials URLs with the correct path parameters and authorization bearer tokens for these APIs are available from the `workflowExecution:credentials` objects in the response from the account creation or update call, as shown in the following example: ``` { "timestamp": "2022-11-28T23:45:02.536Z", "account": { "id": "" }, "web": { ... }, "sdk": { ... }, "workflowExecution": { "id": "", "credentials": [ { "id": "", "category": "ID", "allowedChannels": [ "WEB", "API", "SDK" ], "api": { "token": "", "parts": { "front": "", "back": "" }, "workflowExecution": "" } }, { "id": "", "category": "FACEMAP", "allowedChannels": [ "WEB", "SDK" ] }, { "id": "", "category": "SELFIE", "allowedChannels": [ "WEB", "API", "SDK" ], "api": { "token": "", "parts": { "face": "" }, "workflowExecution": "" } } ] } } ``` | Credential Type | Minimum Resolution | Maximum Resolution | Additional Requirements | | --------------------------------- | ------------------ | ------------------ | ----------------------------------------------------------------------------------- | | **Document Image** (Front & Back) | 563 × 355 px | 8000 × 8000 px | The document in the image must be at least **512 px wide** and **323 px high**. | | **Selfie Image** | 480 × 640 px | 8000 × 8000 px | The face must be at least **320 px tall** and occupy at least **15%** of the image. | For the complete API specification see: [Credentials and Finalization APIs](/docs/developer-resources/API/credentials). ## Uploading Prepared Data Some workflows accept raw data values that identify the end user. Your integration needs to capture this data and upload it as a credential type called **Prepared Data**. The account response includes an object in the credentials array with a category of DATA and an api object with: - A token value for authorizing the upload. - A parts object with a prepared_data value that is the URL to upload the data. Use a POST request and provide the values as a JSON. See the PREPARED_DATA endpoint [here](/docs/developer-resources/API/credentials#tag/Credentials). ### Example: Prepared Data Credential Object in Account Response ``` "credentials": [ { "id": "e62dc87d-bc8a-4933-8ace-05acc3c8a379", "category": "DATA", "allowedChannels": [ "API" ], "api": { "token": "eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_5XLOQ4CMQxA0bukxpIztmOHDlHRcoM4S8dSIMEIcXfC3ID26_136K_DI-xD1IjEiTQtbGEXSq2nNvuIWYh6g84ygBMqGBICC0fLtXlvG99wwahKlSC5T-LI4KQEKshuTQiXNvFz9H94Pfcx9WU93i73cl1_afuzpGicGhThPn9DMFsQSkZXZS8x1_D5AkAD7yrjAAAA.2qBHxwy43HMorgyrnL2AUOP_igbBNplBg8ZX9U-MeoPPek4mHTf_C4E9Ubbx4qehkyahdskiK1CCkLChrfqNpA", "parts": { "prepared_data": "https://api.amer-1.jumio.ai/api/v1/accounts/f19533ed-e45f-4607-8030-454189cdbed8/workflow-executions/a01773c3-6bb0-4b04-b373-7504b8d5302d/credentials/e62dc87d-bc8a-4933-8ace-05acc3c8a379/parts/PREPARED_DATA" }, "workflowExecution": "https://api.amer-1.jumio.ai/api/v1/accounts/f19533ed-e45f-4607-8030-454189cdbed8/workflow-executions/a01773c3-6bb0-4b04-b373-7504b8d5302d" } } ] ``` See also: [Capabilities Reference](../../references/capabilities/). ### Workflow Finalization Once the required credentials are uploaded, you can call the finalization API to trigger the workflow execution. If you are using the web client or mobile SDKs, the finalization call is made automatically once the required credentials have been received. **Example Finalization Call** ``` curl --location --request PUT 'https://api.amer-1.jumio.ai/api/v1/accounts/3adef3f9-b892-4f9c-9b81-f16e5e87230d/workflow-executions/692701a5-eedc-45ca-adb6-213c2f3c7acc' \ --header 'Authorization: Bearer xxx' ``` For the complete API specification see: [Credentials API Reference](/docs/developer-resources/API/credentials). --- # Account API https://documentation.jumio.ai/developer-resources/api/account Account API reference — create, update, and manage end-user accounts. _OpenAPI specification — see the rendered reference at https://documentation.jumio.ai/developer-resources/api/account for the full schema._ --- # Credentials API https://documentation.jumio.ai/developer-resources/api/credentials Credentials API reference — manage credential references attached to accounts. _OpenAPI specification — see the rendered reference at https://documentation.jumio.ai/developer-resources/api/credentials for the full schema._ --- # Retrieval API https://documentation.jumio.ai/developer-resources/api/retrieval Retrieval API reference — fetch transaction results and supporting data. _OpenAPI specification — see the rendered reference at https://documentation.jumio.ai/developer-resources/api/retrieval for the full schema._ --- # Status Endpoint https://documentation.jumio.ai/developer-resources/api/status-endpoint Status endpoint reference — health and availability checks. _OpenAPI specification — see the rendered reference at https://documentation.jumio.ai/developer-resources/api/status-endpoint for the full schema._ --- # Aggregate API https://documentation.jumio.ai/developer-resources/api/aggregateAPI Aggregate API reference — combined orchestration endpoints. _OpenAPI specification — see the rendered reference at https://documentation.jumio.ai/developer-resources/api/aggregateAPI for the full schema._ --- # SDK Reference https://documentation.jumio.ai/docs/developer-resources/SDKs/Overview_of_SDKs # Jumio SDKs Jumio offers a set of powerful SDKs to help you seamlessly integrate identity verification and biometric workflows into your applications. These SDKs are designed to be flexible, secure, and easy to implement, whether you're working on a web platform or mobile apps. ## Web SDK The [Jumio Web SDK](https://documentation.jumio.ai/docs/developer-resources/SDKs/web-sdk/introduction-web) provides a fully functional default implementation out of the box, making it easy to get started quickly. It also includes robust options for customization and extension, allowing you to tailor the user experience to fit your brand and workflow needs. You can: - Customize the look and feel to match your design system. - Control the flow and steps of the verification journey. - Integrate with your backend services to handle callbacks and token management. ## Mobile SDKs Jumio provides dedicated Mobile SDKs for [iOS](https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-ios-master/README_iOS) and [Android](https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-android-master/README_Android), allowing you to embed the verification experience directly into your native apps. These SDKs offer: - A complete, ready-to-use default implementation of the verification journey. - A responsive and intuitive UI optimized for mobile platforms. - Extensive customization options, including custom themes, localization, and flow control. - Support for offline scenarios and device capability checks. The [mobile SDKs](https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/introduction-mobile) are ideal for delivering a smooth, app-native experience with minimal setup, while still offering the flexibility to deeply customize the process as needed. ## Maintenance and Support For details on SDK versioning, deprecation timelines, and compatibility guarantees, refer to the [SDK Maintenance and Support Policy](https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-ios-master/docs/maintenance_policy). This document outlines how Jumio maintains and supports its SDKs across platforms to ensure stability and security. --- # Mobile SDKs https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/introduction-mobile # Mobile SDKs Jumio provides mobile SDKs to support integrations on mobile devices. The SDKs and documentation are available from GitHub, and include example applications. - [Native iOS SDK](../mobile-sdk/mobile-sdk-ios-master/README_iOS) - [Native Android SDK](../mobile-sdk/mobile-sdk-android-master/README_Android) - [React Native Plugin](../crossplatform/mobile-react-master/README_React) - [Flutter Plugin](../crossplatform/mobile-flutter-master/README_Flutter) - [Apache Cordova Plugin](../crossplatform/mobile-cordova-master/README_Cordova) The authorization token to initialize the SDK is available from the sdk:token value of the response from the account creation or update call, as shown in the following example: Example SDK Token ``` { "timestamp": "2022-11-28T23:45:02.536Z", "account": { "id": "572ac7b5-9f83-409d-ba8e-f0014e411c7e" }, "web": { ... }, "sdk": { "token": "eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAA_5XOMQ7CMAwF0LtkxpKdOk7MxsjKDRInYWkBiUogIe5O2huw_v_09T-uvU-rOzoSUYka0XNSd3DZ7FxHHqLPFksA7WkCRq1QcmrQEYkbE1lsG98xU4-k5IFMCnDzHcrECFWqEVoVLWngV2__cLu0PvTj_lyXfIP1vlzB8jz7rduHvHRGDAmIMQB7GSeFK0zGOan2ZiG57w9fvJLI7AAAAA.0NpDK192_6kMSYfxFuqHPFkhdsKQBqieRvSqt3XAGLWRe7Y8u0aJalMa8TLEY8eA0XEw4TqRapVLDraRHUz4kQ" }, ``` --- # Native Android SDK https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-android-master/README_Android ![Header Graphic](./docs/images/jumio_feature_graphic.jpg) # Overview The Jumio Software Development Kit (SDK) provides you with a set of tools and UIs (default or custom) to develop an Android application perfectly fitted to your specific needs. Onboard new users and easily verify their digital identities by making sure the IDs they provide are valid and authentic. Extract data from ID documents completely automatically and within seconds. Confirm that users really are who they say they are by having them take a quick selfie and match it to their respective documents. Jumio uses cutting-edge biometric technology to make sure there is an actual, real-life person in front of the screen. ![SDK Overview](docs/images/images_overview/overview_android_4.9.0.png) Using the Jumio SDK will allow you to create the best possible solution for your individual needs, providing you with a range of different services to choose from. --- ## Get Started Please note that [basic setup](#basics) is required before continuing with the integration of any of the following services. ### Jumio SDK Integration Jumio KYX platform and related services are a secure and easy solution that allows you to establish the genuine identity of your users in your mobile application, by verifying their passports, government-issued IDs and actual liveness in real-time. Very user-friendly and highly customizable, it makes onboarding new customers quick and simple. :arrow_right:  [SDK INTEGRATION GUIDE](docs/integration_guide.md) :arrow_right:  [Changelog](docs/changelog.md) :arrow_right:  [Transition Guide](docs/transition_guide.md) #### Previous SDK Versions If you need information on older SDK versions, please refer to: - [3.9.2](https://github.com/Jumio/mobile-sdk-android/tree/v3.9.2) - [3.9.1](https://github.com/Jumio/mobile-sdk-android/tree/v3.9.1) - [3.9.0](https://github.com/Jumio/mobile-sdk-android/tree/v3.9.0) ### Code Documentation Full API documentation for the Jumio Android SDK can be found [here](https://jumio.github.io/mobile-sdk-android). ### FAQ Link to Jumio Android SDK FAQ can be found [here](docs/integration_faq.md). ### Known Issues List of known issues can be found [here](docs/known_issues.md). --- ## Quickstart This section provides a quick overview on how to get started with the [Android sample application](https://github.com/Jumio/mobile-sdk-android/tree/master/sample) that can be found here on Github. You will need a **commercial Jumio License** to successfully run any of our examples; for details, contact (sales@jumio.com). You will also need an up-to-date Android Studio version to open and try out the sample project. Start by downloading the [Android sample application](https://github.com/Jumio/mobile-sdk-android/tree/master/sample) from the Jumio Github repo. You can either clone the repository (using SSH or HTTPS) to your local device or simply download everything as a ZIP. Once you’ve got the sample application downloaded and unzipped, open Android Studio. Choose **Import project** and navigate to where you’ve saved your sample application. Select the **JumioMobileSample folder** and open it. Android Studio will now start to import the project. This might take a bit of time. Make sure to wait until the Gradle Build has finished and the application is properly installed! The Android sample application contains the package `com.jumio.sample`, which consists of: - `MainActivity.kt` - `xml/` - `CustomUIActivity.kt` - `adapter/` - `CustomConsentAdapter.kt` - `CustomCountryAdapter.kt` - `CustomDocumentAdapter.kt` To use the Jumio Sample Application you need an SDK Token. If you haven't done so already, please refer to the [Authentication and Encryption section](#authentication-and-encryption) for more details on how to obtain your SDK token. To add your individual SDK token to the application copy/paste it to the token input field once the application is started. **Note:** We strongly recommend not storing any credentials inside your app! We suggest loading them during runtime from your server-side implementation. Once you start up the sample application, you'll be given the option of trying out the Jumio SDK. The sample application needs camera permissions, which will be prompted for automatically once you try to start the SDK via one of the buttons. If you deny camera permissions, you won't be able to use the SDK. --- ## Basics ### General Requirements The minimum requirements for the SDK are: - Android 7.0 "Nougat" (API level 24) or higher - AGP version 8.10.1 or higher - Gradle version 8.11.1 or higher - Internet connection - Jumio KYX :::note - SDK 4.17.0 will be the last SDK version supporting Android 6 (API level 23). All subsequent SDK versions will require at least Android 7.0 "Marshmallow" (API level 24). - SDK 4.14.0 will be the last SDK version supporting Android 5 (API level 21). All subsequent SDK versions will require at least Android 6.0 "Marshmallow" (API level 23). - Starting with SDK 4.9.0 the minimum required compile SDK version is 34. Also Gradle 8 is **required** to build the SDK! ::: The following architectures are supported in the SDK: - ARMv7 processor with Neon - ARM64-v8a :::note Currently, x86 and x86_64 are _not_ supported. You get an _UnsatisfiedLinkError_ if app and CPU architecture do not match or the CPU architecture is not supported. ::: You will need a **commercial Jumio License** to run any of our examples. For details, contact sales@jumio.com. ### Authentication and Encryption :::note **As of version 4.0.0 and onward, the SDK can only be used in combination with Jumio KYX. API v2 as well as using API token and secret to authenticate against the SDK will no longer be compatible.** ::: Before starting a session in our SDK, an SDK token has to be obtained. Please refer to out [API Guide](https://documentation.jumio.ai/docs/developer-resources/API/Integration_Intro) for further details. To authenticate against the API calls, an OAuth2 access token needs to be retrieved from the Jumio Portal. Within the response of the [Account Creation or Account Update](https://documentation.jumio.ai/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts) API, a SDK token is returned, which needs to be applied to initiate the mobile SDK. #### Authentication with OAuth2 Your OAuth2 credentials are constructed using your API token as the Client ID and your API secret as the Client secret. You can view and manage your API token and secret in the Jumio Portal under: - **Settings > API credentials > OAuth2 Clients** Client ID and Client secret are used to generate an OAuth2 access token. OAuth2 has to be activated for your account. Contact your Jumio Account Manager for activation. ##### Access Token URL (OAuth2) - US: `https://auth.amer-1.jumio.ai/oauth2/token` - EU: `https://auth.emea-1.jumio.ai/oauth2/token` - SG: `https://auth.apac-1.jumio.ai/oauth2/token` The [TLS Protocol](https://tools.ietf.org/html/rfc5246) is required to securely transmit your data, and we strongly recommend using the latest version. For information on cipher suites supported by Jumio during the TLS handshake see [supported cipher suites](https://documentation.jumio.ai/docs/developer-resources/API/integration-prerequisites#supported-cipher-suites). :::note Calls with missing, incorrect or suspicious headers or parameter values will result in HTTP status code **400 Bad Request Error** or **403 Forbidden**. ::: ##### Request Access Token (OAuth2) ```bash curl --request POST --location 'https://auth.amer-1.jumio.ai/oauth2/token' \ --header 'Accept: application/json' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-raw 'grant_type=client_credentials' \ --basic --user CLIENT_ID:CLIENT_SECRET ``` ##### Response Access Token (OAuth2) ```json { "access_token": "YOUR_ACCESS_TOKEN", "expires_in": 3600, "token_type": "Bearer" } ``` ##### Access Token Timeout (OAuth2) Your OAuth2 access token is valid for 60 minutes. After the token lifetime is expired, it is necessary to generate a new access token. #### Workflow Transaction Token Timeout The token lifetime is set to 30 minutes per default. It can be configured via the [Jumio Portal](https://documentation.jumio.ai/docs/portals/settings/aboutIDVSettings) and can be overwritten using the API call (`tokenLifetime`). Within this token lifetime the token can be used to initialize the SDK. As soon as the workflow (transaction) starts, a 15 minutes session timeout is triggered. For each action performed (capture image, upload image) the session timeout will reset, and the 15 minutes will start again. After creating/updating a new account you will receive a `sdk.token` (JWT) for initializing the SDK. Use this SDK token with your Android code: ```kotlin sdk = JumioSDK(context: Context).apply { token = "YOUR_SDK_TOKEN" dataCenter = "YOUR_DATACENTER" } ``` ### Permissions The following permission is optional: ```xml ``` :::note On devices running Android Marshmallow (6.0) and above, you need to acquire `android.permissions.CAMERA` dynamically before initializing the SDK. ::: Use `JumioSDK.hasAllRequiredPermissions(context: Context)` to make sure the Jumio SDK has all required permissions. In case this method returns `false`, use the method `JumioSDK.getMissingPermissions(context: Context)`, which will return an array list containing String values of all missing permissions. Request any missing permissions using the `ActivityCompat.requestPermissions()` method. ### Integration Use the SDK in your application by including the Maven repositories with the following `build.gradle` configuration in Android Studio: ```groovy repositories { google() mavenCentral() exclusiveContent { forRepository { maven { url 'https://repo.mobile.jumio.ai' } } filter { includeGroup "com.jumio.android" } } } ``` Check the Android Studio [sample projects](https://github.com/Jumio/mobile-sdk-android/tree/master/sample/JumioMobileSample/) to learn the most common use. ### Proguard The Proguard settings should be applied automatically as they are defined as consumer Proguard rules within the SDK. The current rules can also be found in the [Sample app](https://github.com/Jumio/mobile-sdk-android/tree/master/sample/JumioMobileSample/proguard-rules.pro). #### Mandatory The following Proguard Keep rules have to be added to the application hosting the Jumio Android SDK: ```text # Jumio -keep class com.jumio.** { *; } -keep class jumio.** { *; } ``` #### Optional The following Proguard Keep rules have to be added to the application hosting the Jumio Android SDK if the corresponding dependencies have been added: ```text # Tensorflow -keep class org.tensorflow.** { *; } -keep class org.tensorflow.**$* { *; } -dontwarn org.tensorflow.** # JMRTD -keep class org.jmrtd.** { *; } -keep class net.sf.scuba.** { *; } -keep class org.bouncycastle.** { *; } -keep class org.ejbca.** { *; } -dontwarn java.nio.** -dontwarn org.codehaus.** -dontwarn org.ejbca.** -dontwarn org.bouncycastle.** -dontwarn module-info # Dynamic Delivery Module -keepclassmembers class com.google.android.play.core.splitinstall.SplitInstallHelper { *** loadLibrary(android.content.Context,java.lang.String); } -keep,includedescriptorclasses class com.jumio.ale.swig.** { *** swigDirectorDisconnect(); } ``` #### Dexguard There might be additional rules necessary in case Dexguard is used: ```text # SplitInstallHelper -loadslibrary com.google.android.play.core.splitinstall.SplitInstallHelper cpuinfo -loadslibrary com.google.android.play.core.splitinstall.SplitInstallHelper aleInterface # Keep native resources -keepresourcefiles **/libcpuinfo.so -keepresourcefiles **/libaleInterface.so -keepresourcefiles **/libyuv_android.so -keepresourcefiles **/libtensorflowlite_jni.so ``` #### R8 Full Mode For information regarding R8 `fullMode`, please refer to our FAQ section [here](docs/integration_faq.md#r8-full-mode). ### Language Localization Our SDK supports [default Android localization features](https://developer.android.com/training/basics/supporting-devices/languages.html) for different languages. All label texts and button titles in the SDK can be changed and localized by adding the required Strings you want to change in a `strings.xml` file in a `values` directory for the language and culture preference that you want to support. You can check out strings that are modifiable [within our Sample application](https://github.com/Jumio/mobile-sdk-android/tree/master/sample/JumioMobileSample/src/main/res/values/strings-jumio-sdk.xml). Jumio SDK products support the following languages: _Afrikaans, Arabic, Bulgarian, Burmese, Chinese (Simplified), Chinese (Traditional), Croatian, Czech, Danish, Dutch, Estonian, English, Finnish, French, German, Greek, Hindi, Hungarian, Indonesian, Italian, Japanese, Khmer, Korean, Latvian, Lithuanian, Maltese, Norwegian, Polish, Portuguese, Portuguese (Brazil), Romanian, Russian, Serbian (Cyrillic), Serbian (Latin), Slovak, Slovenian, Spanish, Swedish, Thai, Turkish, Ukrainian, Vietnamese, Zulu_ Our SDK supports accessibility features. Visually impaired users can now enable **TalkBack** or increase the **text size** on their device. The accessibility strings that are used by TalkBack contain _accessibility_ in their key and can be also modified in `strings.xml`. ## ML Models The Jumio SDK utilizes ML Models to enable client-/server-side verification. Required models can be provided by downloading and adding them manually to the bundle or preloading them. The SDK will load them on demand if none of the previous is applied. Loading the models in advance will improve startup time of the SDK. For more details, please refer to our [integration guide](docs/integration_guide.md#ml-models). ## Document Verification As of Android SDK 4.3.0, Document Verification functionality is available. This functionality allows users to submit a number of different document types (e.g. a utility bill or bank statement) in digital form and verify the validity and authenticity of this document. Documents can be submitted using one of two ways: Taking a photo of the document or uploading a PDF file. For more details, please refer to our [integration guide](docs/integration_guide.md#jumio-document-credential). #### Supported Documents: - BC (Birth certificate) - BS (Bank statement) - CAAP (Cash advance application) - CB (Council bill) - CC (Credit card) - CCS (Credit card statement) - CRC (Corporate resolution certificate) - CUSTOM - HCC (Health care card) - IC (Insurance card) - LAG (Lease agreement) - LOAP (Loan application) - MEDC (Medicare card) - MOAP (Mortgage application) - PB (Phone bill) - SEL (School enrollment letter) - SENC (Seniors card) - SS (Superannuation statement) - SSC (Social security card) - STUC (Student card) - TAC (Trade association card) - TR (Tax return) - UB (Utility bill) - VC (Voided check) - VT (Vehicle title) - WWCC (Working with children check) :::note To enable the use of this feature, please contact [Jumio support](https://support.jumio.com). ::: ## Digital Identity As of Jumio Android SDK 4.5.0, users may use their Digital Identity to verify their identity. For now 'ID by Mastercard' is the only Digital Identity provider currently supported by our SDK. If you want to enable Digital Identity verification for your account please [contact us](https://support.jumio.com). In case you are already set up to use Digital Identity verification within your app, check out the integration steps explained [here](docs/integration_guide.md#digital-identity-did). ## Analytics With Datadog Analytic feedback and diagnostics enable us to continually improve our SDK and its performance, as well as investigate potential issues. With the Jumio SDK, we use [Datadog](https://github.com/DataDog/dd-sdk-android) as an optional tool to collect diagnostic information. Data collected includes specific SDK information like version numbers, started and finished SDK instances and scan workflows, thrown exceptions and error information, as well as other mobile events. Please note that gathering analytics data requires user consent due to legal regulations such as GDPR. The consent is granted when our MLA is accepted. To benefit from Datadog, add the following dependency to your `build.gradle` file: ```groovy implementation "com.jumio.android:datadog:${SDK_VERSION}" ``` :::note Datadog has been removed in SDK 4.13.0. ::: --- ## Security All SDK related traffic is sent over HTTPS using TLS and public key pinning. Additionally, the information itself within the transmission is also encrypted utilizing **Application Layer Encryption** (ALE). ALE is a Jumio custom-designed security protocol that utilizes RSA-OAEP and AES-256 to ensure that the data cannot be read or manipulated even if the traffic was captured. --- ## Release Notes See our [Change Log](docs/changelog.md) for more information about our current SDK version and further details. ## Maintenance and Support Please refer to our [SDK maintenance and support policy](docs/maintenance_policy.md) for more information about Mobile SDK maintenance and support. ### Two-factor Authentication If you want to enable two-factor authentication for your Jumio Portal, [contact us](https://support.jumio.com). Once enabled, users will be guided through the setup upon their first login to obtain a security code using the Google Authenticator app. ### Licenses The source code and software available on this website (“Software”) is provided by Jumio Corp. or its affiliated group companies (“Jumio”) "as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall Jumio be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including but not limited to procurement of substitute goods or services, loss of use, data, profits, or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this Software, even if advised of the possibility of such damage. In any case, your use of this Software is subject to the terms and conditions that apply to your contractual relationship with Jumio. As regards Jumio’s privacy practices, please see our privacy notice available here: [Privacy Policy](https://www.jumio.com/privacy-center/privacy-notices/online-services-notice/). The software contains third-party open source software. For more information, see [licenses](licenses). This software is based in part on the work of the Independent JPEG Group. ### Contact If you have any questions regarding our implementation guide please contact Jumio Customer Service at support@jumio.com. The [Jumio online helpdesk](https://support.jumio.com) contains a wealth of information regarding our services including demo videos, product descriptions, FAQs, and other resources that can help to get you started with Jumio. ### Copyright © Jumio Corporation, 100 Mathilda Place Suite 100 Sunnyvale, CA 94086 --- # Integration Guide https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-android-master/docs/integration_guide ![Header Graphic](images/jumio_feature_graphic.jpg) # Integration Guide for Android SDK Jumio’s products allow businesses to establish the genuine identity of their users by verifying government-issued IDs in real-time. ID Verification, Selfie Verification and other services are used by financial service organizations and other leading brands to create trust for safe onboarding, money transfers and user authentication. ## Release Notes Please refer to our [Change Log](changelog.md) for more information. Current SDK version: **4.18.0** For technical changes that should be considered when updating the SDK, please read our [Transition Guide](transition_guide.md). ## Code Documentation Full API documentation for the Jumio Android SDK can be found [here](https://jumio.github.io/mobile-sdk-android/). ## Setup The [basic setup](../README_Android.md#basics) is required before continuing with the following setup for the Jumio SDK. If you are updating your SDK to a newer version, please also refer to: :arrow_right:  [Changelog](changelog.md) :arrow_right:  [Transition Guide](transition_guide.md) ### Dependencies The [SDK Setup Tool](https://jumio.github.io/mobile-configuration-tool/out/) is a web tool that helps determine available product combinations and corresponding dependencies for the Jumio SDK, as well as an export feature to easily import the applied changes straight into your codebase. [![Jumio Setup](images/setup_tool.png)](https://jumio.github.io/mobile-configuration-tool/out/) Below you can find a list of dependencies that can be added to your application to enable different functionality of the Jumio SDK. Some modules are mandatory, others are optional. If an optional module is **not linked**, some functionalities may not be available, but the library size will be reduced. The [Sample app](https://github.com/Jumio/mobile-sdk-android/tree/master/sample/JumioMobileSample/) apk size is currently around **12.21 MB**. ```groovy // [Mandatory] Jumio Core library dependencies { implementation "com.jumio.android:core:4.18.0" ... } // [Optional] Extraction methods dependencies { implementation "com.jumio.android:docfinder:4.18.0" // Autocapture library, includes all previous scanning methods implementation "com.jumio.android:barcode-mlkit:4.18.0" // Barcode scanning library, assists Autocapture implementation "com.jumio.android:nfc:4.18.0" // NFC scanning library, assists Autocapture implementation "com.jumio.android:liveness:4.18.0" // Face Liveness library implementation "com.jumio.android:digital-identity:4.18.0" // Digital Identity verification library ... } // [Optional] Jumio Default UI dependencies { implementation "com.jumio.android:defaultui:4.18.0" ... } // [Optional] Additional functionality dependencies { implementation "com.jumio.android:camerax:4.18.0" // CameraX library ... } ``` In addition to specifying individual dependencies, you can also use a BOM (Bill of Materials) to manage all the dependency versions at once. By using BOM, you ensure that all the dependencies are automatically aligned to the correct versions, reducing the need to manually update version numbers across your dependencies. ```groovy dependencies { implementation platform("com.jumio.android:bom:4.18.0") implementation "com.jumio.android:core" implementation "com.jumio.android:barcode-mlkit" implementation "com.jumio.android:camerax" implementation "com.jumio.android:defaultui" implementation "com.jumio.android:digital-identity" implementation "com.jumio.android:docfinder" implementation "com.jumio.android:liveness" implementation "com.jumio.android:nfc" } ``` #### Autocapture The module `com.jumio.android:docfinder` offers one generic scanning method across all ID documents, providing a more seamless capture experience for the end user. The SDK will automatically detect which type of ID document is presented by the user and guide them through the capturing process with live feedback. The models can be bundled with the app directly to save time on the download during the SDK runtime. Please see section [ML Models](#ml-models) for more information. #### Certified Face Liveness Jumio uses Certified Liveness technology to determine liveness. Link `com.jumio.android:liveness` module in order to use Jumio Liveness. Please note: `com.jumio.android:camerax` will be linked transitively when `com.jumio.android:liveness` is linked. #### Barcode Scanning In order to benefit from barcode scanning functionality included in the `com.jumio.android:docfinder` dependency, please add `com.jumio.android:barcode-mlkit` to your `build-gradle` file. This dependency includes `com.google.android.gms:play-services-mlkit-barcode-scanning` library - if your application includes **other Google ML-kit libraries**, it might be necessary to override meta-data specified in the application tag of the `play-services-mlkit-barcode-scanning` manifest by [merging multiple manifests](https://developer.android.com/studio/build/manage-manifests#merge-manifests): ```xml ``` #### NFC Scanning In order to benefit from NFC scanning functionality included in the `com.jumio.android:docfinder` dependency, please add `com.jumio.android:nfc` to your `build-gradle` file. ### SDK Version Check Use `JumioSDK.sdkVersion` to check which SDK version is being used. ### Root Detection For security reasons, applications implementing the SDK should not run on rooted devices. Use either the below method or a self-devised check to prevent usage of SDK scanning functionality on rooted devices. ```kotlin JumioSDK.isRooted(context: Context) ``` :::note Please be aware that the JumioSDK root check uses various mechanisms for detection, but doesn't guarantee to detect 100% of all rooted devices. ::: ### Device Supported Check Use the method below to check if the current device platform is supported by the SDK. ```kotlin JumioSDK.isSupportedPlatform(context: Context) ``` ### Privacy Notice If you submit your app to the Google Play Store a [Prominent Disclosure](https://support.google.com/googleplay/android-developer/answer/11150561) explaining the collected [User Data](https://support.google.com/googleplay/android-developer/answer/10144311) is required. The collected user data also needs to be declared in your [Data Safety Form](https://play.google.com/console/developers/app/app-content/data-privacy-security) and the [Privacy Policy](https://play.google.com/console/developers/app/app-content/privacy-policy) related to your application. Other stores might require something similar - please check before submitting your app to the store. Please see the [Jumio Privacy Policy for Online Services](https://www.jumio.com/legal-information/privacy-notices/jumio-corp-privacy-policy-for-online-services/) for further information. ### Digital Identity (DID) In case Digital Identity Verification has been enabled for your account you can add the `com.jumio.android:digital-identity` dependency to your application. This will enable you to make use of DID verification within the SDK. Over the course of DID verification the SDK will launch an according third party application representing your Digital Identity. Communication between both applications (your integrating application and the Digital Identity application) is done via a so-called "deep link". For more information on deep link handling on Android please check out their [official guide](https://developer.android.com/training/app-links). #### Deep Link Setup To enable your app specific deep link, our support team has to setup an according scheme of your choice for you. This scheme will be used by the SDK to identify your application while returning from the DID provider's application. For the scheme basically any string can be used, however it is recommended that it is unique to your application in some way. A suggestion would be your company name. Following snippet shows how the deep link needs to be setup in your application's `AndroidManifest.xml` file: ```xml ``` Please note that the properties `android:exported="true"` and `android:launchMode="singleTask"` need to be specified as well. The first parameter basically tells the Android system that your `Activity` can be found by the system and other applications. By specifying `launchMode="singleTask"` any already running task for this `Activity` will be resumed (instead of creating a new instance). Both are requirements so that the SDK can handle the according deep link correctly. In case you are using Jumio's Default UI in your app (see section [Default UI](#default-ui)) you also need to specify `tools:replace="android:exported"` to `JumioActivity`'s `` tag like so: ```xml ... ``` As deep link handling happens on `Activity` level, the according data needs to be forwarded to the SDK via `Activity.onNewIntent()`. The following code snippet shows how this can be achieved. **If you're using Jumio's Default UI you can ignore this step**. ```kotlin override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) intent.data?.let { deepLink -> val activeScanPart = scanPart ?: return JumioDeepLinkHandler.consumeForScanPart(deepLink, activeScanPart) } } ``` ### Risk Signal: Device Risk If you want to include risk signals into your application, please check our [Risk Signal guide](https://documentation.jumio.ai/docs/references/riskSignals/deviceRiskCheck/deviceRisk). #### Iovation setup To integrate the device risk vendor Iovation into your application, please follow the [Iovation integration guide](https://github.com/iovation/deviceprint-SDK-android). #### API call To provide Jumio with the generated Device Risk blackbox, please follow the [Device Risk API guide](https://documentation.jumio.ai/docs/references/riskSignals/deviceRiskCheck/deviceRiskwithRestAPI). ## ML Models By default, required models get downloaded by the SDK if not provided via the assets folder or preloaded. ### Bundling models in the app You can download our encrypted models and add them to your assets folder for the following modules. :::warning Make sure not to alter the downloaded models (name or content) before adding them to your assets folder. ::: #### DocFinder If you are using the `com.jumio.android:docfinder` module, find the required models [here](https://cdn.mobile.jumio.ai/android/model/normalized_ensemble_passports_v2_float16_quant.enc) and [here](https://cdn.mobile.jumio.ai/android/model/mobile-classifier-model-1.0.0.enc). #### Liveness If you are using the `com.jumio.android:liveness` module, find the required model [here](https://cdn.mobile.jumio.ai/android/model/liveness_sdk_assets_v_1_1_5.enc). ### Preloading models In version `4.9.0` we introduced the [`JumioPreloader`][jumiopreloader]. It provides functionality to preload models without the JumioSDK being initialized. To do so call: ```kotlin with(JumioPreloader) { init(``) // init with Context preloadIfNeeded() } ``` The [`JumioPreloader`][jumiopreloader] will identify which models are required based on your configuration. Preloaded models are cached so they will not be downloaded again. To clean the models call: ```kotlin with(JumioPreloader) { init(``) // init with Context clean() } ``` :::warning `clean` should never be called while the SDK is running! ::: To get notified that preloading has finished, you can implement [`JumioPreloadCallback`][jumiopreloadcallback] methods and set the callback as follows: ```kotlin with(JumioPreloader) { init(``) // init with Context setCallback(``) ... // followed by preloadIfNeeded() for example } ``` ## Initialization ### Requesting a Token (via OAuth2) Your OAuth2 credentials are constructed using your API token as the Client ID and your API secret as the Client secret. You can view and manage your Client ID and secret in the Jumio Portal under: - **Settings < API credentials < OAuth2 Clients** Client ID and Client secret are used to generate an OAuth2 access token. Send a workflow request using the acquired OAuth2 access token to receive the SDK token necessary to initialize the Jumio SDK. OAuth2 has to be activated for your account. Contact your Jumio Account Manager for activation. For more details, please refer to [Authentication and Encryption](../README_Android.md#authentication-and-encryption). ### Initializing the Jumio SDK Use your acquired SDK token and your according datacenter to initialize the `JumioSDK`: ```kotlin const val YOUR_SDK_TOKEN = "" const val YOUR_DATACENTER = "" val context: Context = ... sdk = JumioSDK(context).apply { token = "YOUR_SDK_TOKEN" datacenter = "YOUR_DATACENTER" } ``` Data center is set to `"US"` by default. If your customer account is in the EU data center, use `"EU"` instead. Alternatively, use `"SG"` for Singapore. :::tip We strongly recommend storing all credentials outside of your app! We suggest loading them during runtime from your server-side implementation. ::: ## Configuration Every Jumio SDK instance is initialized using a specific [`sdk.token`][token]. This token contains information about the workflow, credentials, transaction identifiers and other parameters. Configuration of this token allows you to provide your own internal tracking information for the user and their transaction, specify what user information is captured and by which method, as well as preset options to enhance the user journey. Values configured within the [`sdk.token`][token] during your API request will override any corresponding settings configured in the Jumio Portal. ### Workflow Selection Use ID verification callback to receive a verification status and verified data positions (see [Callback section](https://documentation.jumio.ai/docs/developer-resources/callback)). Make sure that your customer account is enabled to use this feature. A callback URL can be specified for individual transactions (for URL constraints see chapter **Jumio Callback IP Addresses**). This setting overrides any callback URL you have set in the Jumio Portal. Your callback URL must not contain sensitive data like PII (Personally Identifiable Information) or account login. Set your callback URL using the `callbackUrl` parameter. Use the correct [workflow definition key](https://documentation.jumio.ai/docs/references/servicesAndworkflow/standardService/standardServices) in order to request a specific workflow. Set your key using the `workflowDefinition.key` parameter. ```json { "customerInternalReference": "CUSTOMER_REFERENCE", "workflowDefinition": { "key": "X" }, "callbackUrl": "YOUR_CALLBACK_URL" } ``` For more details, please refer to our [Workflow Description Guide](https://support.jumio.com/hc/en-us/articles/4408958923803-KYX-Workflows-User-Guide). :::note Selfie Verification requires portrait orientation in your app. ::: ### Transaction Identifiers There are several options in order to uniquely identify specific transactions. `customerInternalReference` allows you to specify your own unique identifier for a certain scan (max. 100 characters). Use `reportingCriteria`, to identify the scan in your reports (max. 100 characters). You can also set a unique identifier for each user using `userReference` (max. 100 characters). For more details, please refer to the **Account Request** section in our [KYX Guide](https://documentation.jumio.ai/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts). ```json { "customerInternalReference": "CUSTOMER_REFERENCE", "workflowDefinition": { "key": "X" }, "reportingCriteria": "YOUR_REPORTING_CRITERIA", "userReference": "YOUR_USER_REFERENCE" } ``` :::note Transaction identifiers must not contain sensitive data like PII (Personally Identifiable Information) or account login. ::: ### Preselection You can specify issuing country using [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) country codes, as well as ID types to skip selection during the scanning process. In the example down below, Austria ("AUT") and the USA ("USA") have been preselected. PASSPORT and DRIVER_LICENSE have been chosen as preselected document types. If all parameters are preselected and valid and there is only one given combination (one country and one document type), the document selection screen in the SDK can be skipped entirely. For more details, please refer to the **Account Request** section in our [KYX Guide](https://documentation.jumio.ai/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts). ```json { "customerInternalReference": "CUSTOMER_REFERENCE", "workflowDefinition": { "key": X, "credentials": [ { "category": "ID", "type": { "values": [ "DRIVING_LICENSE", "PASSPORT" ] }, "country": { "values": [ "AUT", "USA" ] } } ] } } ``` Digital Identity documents can also be preselected by specifying `"DIGITAL_IDENTITY"` as the type. To narrow down to a specific digital identity subtype, use the optional `"subType"` field with a single value. Supported subtypes are: `EIDAS`, `DIGITAL_DRIVING_LICENSE_PDF`. If only one digital identity type is available for the preselected country (and no physical documents), the document selection screen in the SDK can be skipped entirely. ```json { "customerInternalReference": "CUSTOMER_REFERENCE", "workflowDefinition": { "key": X, "credentials": [ { "category": "ID", "type": { "values": [ "DIGITAL_IDENTITY" ] }, "subType": { "values": [ "EIDAS" ] }, "country": { "values": [ "AUT" ] } } ] } } ``` ### Miscellaneous Use [`cameraFacing`][camerafacing] attribute of [`JumioScanView`][jumioscanview] to configure the default camera and set it to `FRONT` or `BACK`. ```kotlin scanView.cameraFacing = JumioCameraFacing.FRONT ``` ## SDK Workflow ### Retrieving Information The SDK returns a [`JumioResult`][jumioresult] object which contains the result of the finished workflow. Extracted ID data will not be returned by default - please contact **Jumio Customer Service** at [support@jumio.com](mailto:support@jumio.com) in case this is needed. The following tables give information on the specification of all data parameters and errors: - [`JumioIDResult`][jumioidresult] - [`JumioFaceResult`][jumiofaceresult] - [`JumioRejectReason`][jumiorejectreason] - [`JumioError`][jumioerror] #### Class **_JumioIDResult_** | Parameter | Type | Max. length | Description | | :--------------- | :--------------------------- | :---------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | issuingCountry | String | 3 | Country of issue as [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) country code | | idType | String | | PASSPORT, DRIVER_LICENSE, IDENTITY_CARD or VISA as provided or selected | | idSubType | String | | Sub type of the scanned ID | | firstName | String | 100 | First name of the customer | | lastName | String | 100 | Last name of the customer | | dateOfBirth | String | | Date of birth | | issuingDate | String | | Date of issue | | expiryDate | String | | Date of expiry | | documentNumber | String | 100 | Identification number of the document | | personalNumber | String | | Personal number of the document | | gender | String | | Gender M, F or X | | nationality | String | | Nationality of the customer | | placeOfBirth | String | 255 | Place of birth | | country | String | | Country of residence | | address | String | 64 | Street name of residence | | city | String | 64 | City of residence | | subdivision | String | 3 | Last three characters of [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US) or [ISO 3166-2:CA](https://en.wikipedia.org/wiki/ISO_3166-2:CA) subdivision code | | postalCode | String | 15 | Postal code of residence | | mrzLine1 | String | 50 | MRZ line 1 | | mrzLine2 | String | 50 | MRZ line 2 | | mrzLine3 | String | 50 | MRZ line 3 | | curp | String | | The Clave Única de Registro de Población (CURP) identity code for Mexican documents. | | extractionMethod | [JumioScanMode][jumioscanmode] | | Extraction method used during scanning | | imageData | JumioImageData | | Wrapper class for accessing image data of all credential parts from an ID verification session. This feature has to be enabled by your account manager. | #### Class **_JumioFaceResult_** | Parameter | Type | Max. length | Description | | :--------------- | :--------------------------- | :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------ | | passed | Boolean | | | extractionMethod | [JumioScanMode][jumioscanmode] | | Extraction method used during scanning (FACE_MANUAL, JUMIO_LIVENESS) | | imageData | JumioImageData | | Wrapper class for accessing image data of all credential parts from an ID verification session. This feature has to be enabled by your account manager. | #### Class **_JumioRejectReason_** List of all possible **_reject reasons_** the SDK could return if Instant Feedback is used: :::info Please be aware that the list of reject reasons that get returned depends on server-side configuration for every individual merchant. ::: | Code | Message | Description | | :--- | :------------------- | :------------------------------------------------- | | 104 | DIGITAL_COPY | Document appears to be a digital copy | | 200 | NOT_READABLE | Document is not readable | | 201 | NO_DOC | No document could be detected | | 206 | MISSING_BACK | Backside of the document is missing | | 214 | MISSING_FRONT | Frontside of the document is missing | | 401 | UNSUPPORTED_DOCUMENT | Document is not supported | | 501 | INVALID_CERTIFICATE | Document certificate could not be validated | | 2001 | BLURRY | Document image is unusable because it is blurry | | 2003 | MISSING_PART_DOC | Part of the document is missing | | 2004 | HIDDEN_PART_DOC | Part of the document is hidden | | 2005 | DAMAGED_DOCUMENT | Document appears to be damaged | | 2006 | GLARE | Document image is unusable because of glare | #### Error Codes List of all **_error codes_** that are available via the `code` and `message` properties of the [`JumioError`][jumioerror] object. The first letter (A-J) represents the error case. The remaining characters are represented by numbers that contain information helping us understand the problem situation (format: [xx][yyyy]). | Code | Message | Description | | :---------: | :----------------------------------------------------------------- | :------------------------------------------------------------ | | A[xx][yyyy] | We have encountered a network communication problem | Retry possible, user decided to cancel | | B[xx][yyyy] | Authentication failed | Secure connection could not be established, retry impossible | | C[xx]0401 | Authentication failed | API credentials invalid, retry impossible | | E[xx]0000 | Connection error | Retry possible, user decided to cancel | | F[xx]0000 | Scanning not available at this time, please contact the app vendor | Resources cannot be loaded, retry impossible | | G[xx]0000 | Cancelled by end-user | No error occurred | | H[xx]0000 | The camera is currently not available | Camera cannot be initialized, retry impossible | | I[xx]0000 | Certificate not valid anymore. Please update your application | End-to-end encryption key not valid anymore, retry impossible | | J[xx]0000 | Transaction already finished | User did not complete SDK journey within session lifetime | | N[xx]0000 | Scanning not available at this time, please contact the app vendor | Required images are missing to finalize the acquisition | :::tip Please always include error code and message when filing an error related issue to our support team. ::: ### Session Initialization Best Practices - Generate SDK tokens just-in-time before SDK launch. - Implement backend-controlled retry logic. - Use reportingCriteria and Customer Internal Reference for tracking. - Ensure runtime permissions are granted before launch. ## Default UI In case you're using Jumio's Default UI module (see [Dependencies](#dependencies)) you may declare the `JumioActivity` in your `AndroidManifest.xml`. With this you can use Jumio's default theme or specify a custom theme (see [Customization](#customization) for details). Also you can set the orientation to be sensor based or locked by using the attribute `android:screenOrientation`. Please note though that some screens in Jumio SDK launch in portrait mode only. ```xml ``` ## Custom UI ID Verification can also be implemented as a **custom scan view.** This means that only the scan view (including the scan overlays) are provided by the SDK. The handling of the lifecycle, document selection, readability confirmation, intermediate callbacks, and all other steps necessary to complete a scan have to be handled by the client application that implements the SDK. The following sequence diagram outlines components, callbacks and methods for a basic ID Verification workflow: ![Custom UI Happy Path Diagram](images/happy_paths/custom_ui_happy_path_diagram.png) :::note The new 3D face liveness capturing technology is not optimized for tablets. When using Selfie Verification, the face scanner will fallback to a simple face capturing functionality instead. Portrait orientation support is required in your app. ::: CustomUI enables you to use a custom scan view with a plain scanning user interface. Initialize the Jumio SDK and set [`token`][token] and [`datacenter`][datacenter]. ```kotlin val context: Context = ... sdk = JumioSDK(context).apply { token = "YOUR_SDK_TOKEN" datacenter = JumioDataCenter.YOUR_DATACENTER } ``` - [`JumioDataCenter`][datacenter] values: `US`, `EU`, `SG` ### UI/UX Best Practices - Launch SDK only after explicit user consent. - Show pre-permission screens explaining camera use. - Prompt better lighting for retries. - Avoid flashlight use by default. - Use SDK localization. ### Controller Handling Start the SDK by passing `context` and an instance of your class that implements [`JumioControllerInterface`][jumiocontrollerinterface]. You will receive a [`JumioController`][jumiocontroller] object in return: ```kotlin val jumioController: JumioController = sdk.start(context, jumioControllerInterface) ``` When the `jumioController` is initialized, the following callback will be triggered: ```kotlin onInitialized(credentials: List, consentItems: List?, termsOfUse: JumioTermsOfUse?) ``` #### Consent Handling To support compliance with various data protection laws, if a user’s consent is required the parameter `consentItems` will provide a list of [`JumioConsentItems`][jumioconsentitem]. Each consent item contains a text, a consent type and an URL that will redirect the user to Jumio’s consent details. Each [`JumioConsentItem`][jumioconsentitem] also provides a method `spannedTextWithLinkColor(color: Int)` that will return a spanned string containing the consent text and the link holder. If no color is specified, the link portion of the spanned string will only be underlined. If no consent is required, the parameter `consentItems` will be `null`. Each consent item can be one of two types: - [`JumioConsentType.ACTIVE`][jumioconsenttype] - [`JumioConsentType.PASSIVE`][jumioconsenttype] For `ACTIVE` types, the user needs to accept the consent items explicitly, e.g. by enabling a UI switch or checking a checkbox for each consent item. For `PASSIVE` types, it is enough to present the consent text and URL to the user. The user implicitly accepts the passive consent items by continuing with the journey. For details please check out consent handling [(1)](https://github.com/Jumio/mobile-sdk-android/blob/master/sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/CustomUiActivity.kt#L218-L234) [(2)](https://github.com/Jumio/mobile-sdk-android/blob/master/sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/CustomUiActivity.kt#L252-L260) and [consent adapter](https://github.com/Jumio/mobile-sdk-android/blob/master/sample/JumioMobileSample/src/main/java/com/jumio/sample/customui/adapter/CustomConsentAdapter.kt) in our sample app. The user can open and continue to the provided consent link if they choose to do so. If the user consents to Jumio's policy, [`jumioController.userConsented(consentItem: JumioConsentItem, userConsent: Boolean)`][userconsented] is required to be called internally before any credential can be initialized and the user journey can continue. If no consent is required, the list of [`JumioConsentItems`][jumioconsentitem] will be `null`. If the user does not consent or if [`jumioController.userConsented(consentItem: JumioConsentItem, userConsent: Boolean)`][userconsented] is not called for all the items inside the `consentItems` list, the user will not be able to continue the user journey. :::warning Please be aware that in cases where the list of `consentItems` is not `null`, the user **must consent** to Jumio's processing of personal information, including biometric data, and be provided a link to Jumio's Privacy Notice. Do not accept automatically without showing the user any terms. ::: #### Terms of Use Handling The `termsOfUse` parameter provides a [`JumioTermsOfUse`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.termsofuse/-jumio-terms-of-use/index.html) which contains: - `text`: The localized string containing the terms of use text. - `url`: The URL to redirect the user to Jumio’s terms of use details. If the `termsOfUse` parameter is `null`, then it should be ignored. ### Credential Handling Obtain an instance of [`JumioCredential`][jumiocredential] which will contain all necessary information about the verification process by calling `start` on the `JumioController`. For ID verification you will receive a [`JumioIDCredential`][jumioidcredential], for Selfie Verification a [`JumioFaceCredential`][jumiofacecredential], and so on. Call [`isConfigured`][isconfigured] to check if the credential is already pre-configured. If so, it can be started right away. ```kotlin val currentCredentialInfo = ... val currentCredential = jumioController.start(currentCredentialInfo) if (currentCredential?.isConfigured == true) { // credential can be started } ``` If the credential is not configured yet, it needs some more configuration before scan parts can be initialized. Details on how to configure each credential and retrieve the first [scan part][jumioscanpart] can be found below. - [`JumioCredentialCategory`][jumiocredentialcategory] values: `ID`, `FACE`, `DOCUMENT`, `DATA` Credentials should be processed in ascending order based on the `order` property specified in [`JumioCredentialInfo`][jumiocredentialinfo]. Credentials with the same order value can be processed in any sequence. ⚠️  **Note:** Processing credentials according to order is necessary to continue the user journey. #### Jumio ID Credential The `lookupResult` property of type [`JumioLookupResult`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-lookup-result/index.html) is returned when a document is found during a Selfie.DONE workflow. If the `lookupResult` contains [`JumioDocumentType`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-document-type/index.html) and [`JumioLegalStatement`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-legal-statement/index.html), then you must call [`userConsented(JumioLookupResult.JumioLegalStatement, Boolean)`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-id-credential/user-consented.html) using the `legalStatement` from the `lookupResult` to record the user's decision: - Calling `userConsented(JumioLookupResult.JumioLegalStatement, true)` indicates that consent has been given to use the data from the `lookupResult`. In this scenario, the [`JumioIDCredential`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-i-d-credential/index.html) is considered complete, allowing you to immediately call `finish()` on the credential without requiring a new scan. - Calling `userConsented(JumioLookupResult.JumioLegalStatement, false)` indicates that consent has not been given to use the `lookupResult` data, and the workflow will proceed to scan a new document. In case of [`JumioIDCredential`][jumioidcredential], you can retrieve all available countries from [`supportedCountries`][supportedcountries]. After selecting a specific country from that list, you can query available documents for that country by either calling [`getPhysicalDocumentsForCountry`][getphysicaldocuments] or [`getDigitalDocumentsForCountry`][getdigitaldocuments]. To configure the [`JumioIDCredential`][jumioidcredential], pass your desired document as well as the country to [`setConfiguration()`][setidconfiguration]. Retrieve the supported countries: ```kotlin idCredential = ... // Credential received via jumioController.start val countries: List = idCredential.countries val country = countries.first { ... } // Select your desired country ``` Query available physical documents (e.g. passports or driving licenses): ```kotlin val jumioDocuments = idCredential.getPhysicalDocumentsForCountry(country) val document = jumioDocuments.first { it.type == JumioDocumentType.PASSPORT } ``` Query available digital documents ("Digital Identities"): ```kotlin val jumioDocuments = idCredential.getDigitalDocumentsForCountry(country) val document = jumioDocuments.first() ``` Set a valid country / document configuration: ```kotlin idCredential.setConfiguration(country, document) ``` - [`JumioPhysicalDocument`][jumiophysicaldocument] represents a single `JumioDocumentType` and `JumioDocumentVariant` combination - [`JumioDocumentType`][jumiodocumenttype] values: `PASSPORT`, `VISA`, `DRIVING_LICENSE`, `ID_CARD` - [`JumioDocumentVariant`][jumiodocumentvariant] values: `PAPER`, `PLASTIC` - [`JumioDigitalDocument`][jumiodigitaldocument] represents a digital document ("Digital Identity") - [`JumioDigitalDocumentType`][jumiodigitaldocumenttype] values: `TRUST_CHECK`, `EIDAS`, `MASTERCARD`, `DIGITAL_DRIVING_LICENSE_PDF` Once the credential is configured, it is ready to initialize it's first scan part and start the verification process: ```kotlin val credentialPart = idCredential.credentialParts.first() idCredential.initScanPart(credentialPart, yourScanPartInterface) ``` #### Jumio Face Credential In case of [`JumioFaceCredential`][jumiofacecredential], Jumio uses Certified Liveness technology to determine liveness. The mode can be detected by checking the [`JumioScanMode`][jumioscanmode] of the [`JumioScanPart`][jumioscanpart]. Make sure to also implement `FACE_MANUAL` as a fallback, in case `JUMIO_LIVENESS` is not available. Retrieve the credential part of the credential to start the scanning process by calling: ```kotlin val credentialPart = currentCredential?.credentialParts?.first() val scanPart = currentCredential?.initScanPart(credentialPart, yourScanPartInterface) ``` or use the convenience method ```kotlin val scanPart = currentCredential?.initScanPart(yourScanPartInterface) ``` #### Jumio Document Credential In case of [`JumioDocumentCredential`][jumiodocumentcredential], there is the option to either acquire the image using the camera or selecting a PDF file from the device. Call `setConfiguration` with a [`JumioAcquireMode`][acquiremode] to select the preferred mode as described in the code documentation. - [`JumioAcquireMode`][acquiremode] values: `CAMERA`, `FILE` ```kotlin val acquireModes: List = (credential as JumioDocumentCredential).availableAcquireModes (currentCredential as JumioDocumentCredential).setConfiguration(acquireModes[0]) ``` Retrieve the credential part of the credential to start the scanning process by calling: ```kotlin val credentialPart = currentCredential?.credentialParts?.first() val scanPart = currentCredential?.initScanPart(credentialPart, yourScanPartInterface) ``` or use the convenience method ```kotlin val scanPart = currentCredential?.initScanPart(yourScanPartInterface) ``` If [`JumioAcquireMode`][acquiremode] `FILE` is used, the [`JumioFileAttacher`][jumiofileattacher] needs to be utilized to add a File or FileDescriptor for the selected [`JumioScanPart`][jumioscanpart]. ```kotlin val fileAttacher = JumioFileAttacher() fileAttacher.attach(scanPart) val file = File("/path/to/your/file.pdf") fileAttacher.setFile(file) ``` #### Jumio Data Credential :::note `JumioDataCredential` is only available from SDK version `4.2.0` to `4.8.1` (inclusively). ::: [`JumioDataCredential`][jumiodatacredential] is used for the device fingerprinting. There are some optional configurations you can do to enhance it's behavior. 1. Add the following Android permissions to your `AndroidManifest.xml`, if not already added: ```xml ``` :::note - The reason for the requirement of the given permission is added as inline comment. - Some of them are `dangerous` permissions, and you have to ask for the permission from the user. More information about permissions can be found in the official [Android documentation](https://developer.android.com/guide/topics/permissions/overview) - The above permissions imply to add some features to your manifest file: ::: ```xml ``` 2. If you use proguard for obfuscation, you have to add some rules to your [`proguard-rules.pro`][proguardrules] configuration file: ```text -keep com.google.android.gms.* -keep com.google.android.gms.tasks.* -keep com.google.android.gms.ads.identifier.AdvertisingIdClient ``` ### ScanPart Handling The following sequence diagram outlines an overview of ScanPart handling details: ![ScanPart Happy Path Diagram](images/happy_paths/scanpart_happy_path_diagram.png) Start the scanning process by initializing the [`JumioScanPart`][jumioscanpart]. A list of mandatory [`JumioCredentialPart`][jumiocredentialpart]s is retrievable over [`currentCredential?.credentialParts`](credentialPartsList) as soon as the credential is configured. Possible values are: `currentScanPart = currentCredential?.initScanPart(credentialPart, yourJumioScanPartInterface)` - [`JumioCredentialPart`][jumiocredentialpart] values: `FRONT`, `BACK`, `MULTIPART`, `FACE`, `DOCUMENT`, `NFC`, `DIGITAL` Each [`jumioScanPart`][jumioscanpart] has an associated `scanMode`. Depending on the scan mode, you need to provide a different user guidance. The following scan modes are available for the different `JumioCredentialPart`s: - [`JumioScanMode`][jumioScanMode] values: - `FRONT`, `BACK`, `MULTIPART`: `MANUAL`, `BARCODE`, `DOCFINDER` - `DIGITAL`: `WEB`, `FILE` - `NFC`: `NFC` - `FACE`: `FACE_MANUAL`, `JUMIO_LIVENESS`, `JUMIO_PREMIUM` - `DOCUMENT`: `MANUAL`, `FILE` During the scanning process, use the `onUpdate` function of the `JumioScanPartInterface` to check on the scanning progress and update your user guidance accordingly. `MULTIPART` handles the scanning of multiple sides in one seamless capture experience. When a [`MULTIPART`][jumiomultipart] scan part is started, an additional [`NEXT_PART`][nextpart] step is sent after [`IMAGE_TAKEN`][imagetaken]. This signals that another side of the document should be scanned now. The step returns the [`JumioCredentialPart`][jumiocredentialpart] that should be scanned next. We suggest to actively guide the user to move to the next part, e.g. by showing an animation and by disabling the extraction during the animation. Please also check the new [`NEXT_PART`][nextpart] scan step for this [`JumioCredentialPart`][jumiocredentialpart] Start the execution of the acquired [`JumioScanPart`][jumioscanpart] by calling [`currentScanPart?.start()`][startscanpart]. When the scanning is done, the parameter [`JumioScanStep.CAN_FINISH`][canfinish] will be received and the scan part can be finished by calling [`currentScanPart?.finish()`][finishscanpart]. Check if the credential is complete by calling [`currentCredential?.isComplete`][iscompletecredential] and finish the current credential by calling [`currentCredential?.finish()`][finishcredential]. Continue that procedure until all needed credentials (e.g. `ID`, `FACE`, `DOCUMENT`) are finished. Check if all credentials are finished with [`jumioController.isComplete`][iscompletecontroller], then call [`jumioController?.finish()`][finishcontroller] to finish the user journey. The callback [`onFinished()`][onfinished] will be received after the controller has finished: ```kotlin override fun onFinished(result: JumioResult) { log("onFinished") sdkResult.value = result } ``` #### Scan Steps During the scanning process [`onScanStep()`][onscanstep] will be called as soon as the [`JumioScanPart`][jumioscanpart] needs additional input to continue the scanning journey. The provided [`JumioScanStep`][jumioscanstep] indicates what needs to be done next. [`JumioScanStep`][jumioscanstep]s cover lifecycle events which require action from the customer to continue the process. [`JumioScanStep`][jumioscanstep] values: `PREPARE`, `STARTED`, `ATTACH_ACTIVITY`, `ATTACH_FILE`, `SCAN_VIEW`, `NEXT_PART`, `IMAGE_TAKEN`, `PROCESSING`, `CONFIRMATION_VIEW`, `REJECT_VIEW`, `RETRY`, `CAN_FINISH`, `ADDON_SCAN_PART`, `DIGITAL_IDENTITY_VIEW`, `THIRD_PARTY_VERIFICATION` [`PREPARE`][prepare] is only sent if a scan part requires upfront preparation and the customer should be notified (e.g. by displaying a loading screen): ```kotlin JumioScanStep.PREPARE -> { showLoadingView() } ``` [`STARTED`][started] is always sent when a scan part is started. If a loading spinner was triggered before, it can now be dismissed: ```kotlin JumioScanStep.STARTED -> { hideLoadingView() } ``` [`DIGITAL_IDENTITY_VIEW`][digitalidentityview] points out that the current [`JumioScanPart`][jumioscanpart] needs to be attached to a [`JumioDigitalIdentityView`][jumiodiview]. The [`JumioDigitalIdentityView`][jumiodiview] is a custom view that can be placed in your layout. ```kotlin JumioScanStep.DIGITAL_IDENTITY_VIEW -> { currentScanPart?.let { jumioDigitalIdentityView.attach(it) } } ``` [`THIRD_PARTY_VERIFICATION`][thirdpartyverification] is triggered in case the current [`JumioScanPart`][jumioscanpart] will switch to a third party's application to continue the verification process (e.g. for Digital Identity verification). As this might take some time, showing a loading indicator is recommended. ```kotlin JumioScanStep.THIRD_PARTY_VERIFICATION -> { showLoadingView() } ``` [`ATTACH_ACTIVITY`][attachactivity] indicates that an Activity Context is needed. Please see [`JumioActivityAttacher`][jumioactivityattacher] for more information. ```kotlin JumioScanStep.ATTACH_ACTIVITY -> { currentScanPart?.let { JumioActivityAttacher(this).attach(it) } } ``` [`ATTACH_FILE`][attachfile] is sent when the user needs to select and upload a file. For this, you should create a [`JumioFileAttacher`][jumiofileattacher], add it to your [`JumioScanPart`][jumioscanpart] and provide the document. This step is only sent, when the scan method is `FILE`. ```kotlin JumioScanStep.ATTACH_FILE -> { currentScanPart?.let { val jumioFileAttacher = JumioFileAttacher() jumioFileAttacher.attach(it) // Choose how the file should be attached // jumioFileAttacher.setFileDescriptor() // jumioFileAttacher.setFile() } } ``` [`SCAN_VIEW`][scanview] is sent, when the scan view should be displayed. On this view, the user will capture a photo or a sequence of photos of a document or of a face with the camera. [`JumioScanView`][jumioscanview] needs to be attached to the [`JumioScanPart`][jumioscanpart]. The [`JumioScanView`][jumioscanview] is a custom view that can be placed in your layout. During runtime it just needs to be attached to the [`JumioScanPart`][jumioscanpart]. Make sure to re-attach the scanview from scan steps [`STARTED`][started] or [`NEXT_PART`][nextpart] in case the activity gets recreated and the scanview was attached before. ```kotlin JumioScanStep.SCAN_VIEW -> { currentScanPart?.let { jumioScanView.attach(it) } } ``` [`IMAGE_TAKEN`][imagetaken] is triggered as soon as all required images for the current part are captured and uploaded to the Jumio server. This event might be followed by a [`NEXT_PART`][nextpart] event with additional information on which part has to be scanned next (if any). The data parameter of [`onScanStep()`][onscanstep] contains a `Map` with the `scanPart` (a [`JumioCredentialPart`][jumiocredentialpart] value) and `scanMode` (a [`JumioScanMode`][jumioscanmode] value) of the captured image. When all parts are done and background processing is executed, [`JumioScanStep.PROCESSING`][processing] is triggered. The camera preview might be stopped during that step. If images for confirmation or rejection need to be displayed then [`JumioScanStep.CONFIRMATION_VIEW`][confirmationview] or [`JumioScanStep.REJECT_VIEW`][rejectview] is triggered. Attach the [`JumioConfirmationHandler`][jumioconfirmationhandler] or [`JumioRejectHandler`][jumiorejecthandler] once the steps are triggered and render the available [`JumioCredentialParts`][jumiocredentialpart] in [`JumioConfirmationView`][jumioconfirmationview] or [`JumioRejectView`][jumiorejectview] objects: ```kotlin JumioScanStep.CONFIRMATION_VIEW -> { val confirmationHandler = JumioConfirmationHandler() confirmationHandler.attach(scanPart) confirmationHandler.parts.forEach { val confirmationView = JumioConfirmationView(context) confirmationHandler.renderPart(it, confirmationView) ... } } JumioScanStep.REJECT_VIEW -> { val rejectHandler = JumioRejectHandler() rejectHandler.attach(scanPart) rejectHandler.parts.forEach { val rejectView = JumioRejectView(context) rejectHandler.renderPart(it, rejectView) ... } } ``` The scan part can be confirmed by calling [`confirmationView.confirm()`][confirm] or retaken by calling [`confirmationView.retake()`][retakeconfirmation] or [`rejectView.retake()`][retakereject]. The retry scan step returns a data object of type [`JumioRetryReason`][jumioretryreason]. On [`RETRY`][retry], a retry should be triggered on the scan part. ```kotlin JumioScanStep.RETRY -> { val reason = data as? JumioRetryReason ?: return val retryCode = reason.code val retryMessage = reason.message ... currentScanPart?.retry(reason) } ``` For possible retry codes please checkout [`JumioRetryReasonGeneric`][jumioretrygeneric], [`JumioRetryReasonDocumentVerification`][jumioretrydv], [`JumioRetryReasonNfc`][jumioretrynfc], and [`JumioRetryReasonDigitalIdentity`][jumioretrydi]. As soon as the scan part has been confirmed and all processing has been completed [`CAN_FINISH`][canfinish] is triggered. [`scanPart.finish()`][finishscanpart] can now be called. During the finish routine the SDK checks if there is an add-on functionality for this part available, e.g. possible NFC scanning after an MRZ scan part. In this case [`ADDON_SCAN_PART`][addonscanpart] will be called. When an add-on to the current scan part is available, [`JumioScanStep.ADDON_SCAN_PART`][addonscanpart] is sent. The add-on scan part can be retrieved using the method `addonScanPart = currentCredential?.getAddonPart()`. To see if the finished credential part was the last one of the credential, check `currentCredentialPart == currentCredential?.credentialPart?.last()`. Check if the credential is complete by calling [`currentCredential?.isComplete`][isComplete] and finish the current credential by calling [`currentCredential?.finish()`][credentialFinish]. Continue that procedure until all necessary credentials (e.g. `ID`, `FACE`, `DOCUMENT`, `DATA`) are finished. Check if the last credential is finished, then call [`controller?.finish()`][controllerFinish] to end the user journey. #### Scan Updates [`JumioScanUpdates`][jumioscanupdate]s are distributed via the `JumioScanPartInterface` method [`onUpdate()`][onupdate] and cover scan information that is relevant and might need to be displayed during scanning process. An optional value `data` of type `Any` can contain additional information for each scan update as described. [`JumioScanUpdate`][jumioscanupdate] values: `CAMERA_AVAILABLE`, `FALLBACK`, `NFC_EXTRACTION_STARTED`, `NFC_EXTRACTION_PROGRESS`, `NFC_EXTRACTION_FINISHED`, `CENTER_ID`, `HOLD_STRAIGHT`, `MOVE_CLOSER`, `TOO_CLOSE`, `HOLD_STILL`, `MOVE_FACE_CLOSER`, `FACE_TOO_CLOSE`, `NEXT_POSITION`, `FLASH`, `TILT`, `IMAGE_ANALYSIS` In case of `FALLBACK`, the `scanMode` has changed and you should adapt the user interface to reflect the new scan mode. Check the `JumioScanView`[jumioscanview] method `isShutterEnabled`[isshutterenabled] and see if it returns `true`. If this is the case, a manual shutter button needs to be displayed for the end user to capture an image. All possible [`JumioFallbackReason`][fallbackreason] values are sent in the optional `data` value to indicate the reason of the fallback. `NFC_EXTRACTION_STARTED`, `NFC_EXTRACTION_PROGRESS`, and `NFC_EXTRACTION_FINISHED` make it possible to track the progress of an NFC scan. `NFC_EXTRACTION_PROGRESS` additionally delivers an integer in the data parameter in the range of 0-100 to signal the progress in the current data group. `NEXT_POSITION` signals that the user needs to take a second image, e.g., needs to move the face in a liveness scan. For the scanMode `DOCFINDER`, the following scan updates are sent: `CENTER_ID`, `TOO_CLOSE`, `MOVE_CLOSER`, `HOLD_STRAIGHT`, `TILT`, `FLASH` FOR `ID` scans, a Long representing the time for which the user needs to hold still is sent in the data parameter of `JumioScanPartInterface.onUpdate`, when the extraction state `HOLD_STILL` is returned. `TILT` signals that during an `ID` scan, the document in front of the camera needs to be tilted. The current angle as well as the target angle are transmitted as [`JumioTiltState`][jumiotiltstate] via the `data` parameter. A negative current angle indicates that the document needs to be tilted in the other direction. When a tilt update is sent, advise the user to tilt the identity document by e.g. showing an animation or an overlay. `FLASH` signals the enabling or disabling of the camera flash. `IMAGE_ANALYSIS` signals that the image is being analyzed. We suggest to disable orientation changes during the states `FLASH` and `IMAGE_ANALYSIS`. Please note - fallback and camera switch will also not be available during these stages. We send the following extraction states for the scan modes `JUMIO_LIVENESS` and `JUMIO_PREMIUM`: `CENTER_FACE`, `FACE_TOO_CLOSE`, `MOVE_FACE_CLOSER`, `MOVE_FACE_INTO_FRAME`, `LEVEL_EYES_AND_DEVICE`, `HOLD_STILL`, `TILT_FACE_UP`, `TILT_FACE_DOWN`, `TILT_FACE_LEFT`, `TILT_FACE_RIGHT` ```kotlin override fun onUpdate(jumioScanUpdate: JumioScanUpdate, data: Any?) { when(jumioScanUpdate) { JumioScanUpdate.FALLBACK -> handleFallback(data as JumioFallbackReason) JumioScanUpdate.FLASH -> handleFlash(data as JumioFlashState) JumioScanUpdate.TILT -> handleTilt(data as JumioTiltState) ... // handle other scan updates } } ``` ### Result and Error Handling Instead of using the standard method `onActivityResult()`, implement the following methods within your [`jumioControllerInterface`][jumiocontrollerinterface] for successful scans and error notifications: The method `onFinished(result: JumioResult)` has to be implemented to handle data after a successful scan, which will return [`JumioResult`][jumioresult]. ```kotlin override fun onFinished(result: JumioResult) { val data = result // handle success case finish() } ``` The method `onError(error: JumioError)` has to be implemented to handle data after an unsuccessful scan, which will return [`JumioError`][jumioerror]. Check the parameter [`error.isRetryable`][isretryable] to see if the failed scan attempt can be retried. ```kotlin override fun onError(error: JumioError) { if (error.isRetryable) { // retry scan attempt } else { // handle error case } log(String.format("onError: %s, %s, %s", error.code, error.message, if (error.isRetryable) "true" else "false")) } ``` If an error is retryable, [`jumioController.retry()`][retrycontroller] should be called to execute a retry. ## Error Handling & Retry Strategy - Categorize errors: soft (retry allowed) vs hard (exit flow). - On failure: create new account ID or reuse existing account ID with new session. - Redirect to retry/support screen instead of immediate SDK relaunch. - Log errors without storing PII. ### Instant Feedback The use of Instant Feedback provides immediate end user feedback by performing a usability check on any image the user took and prompting them to provide a new image immediately if this image is not usable, for example because it is too blurry. Please refer to the [JumioRejectReason table](#retrieving-information) for a list of all reject possibilities. ## Customization The Jumio SDK provides various options to customize its UI. If you are using [Default UI](#default-ui) you can change each screen to fulfil your needs. In case you decide to implement the verification workflow on your own (see [Custom UI](#custom-ui)) you also have the possibility to influence the look and feel of some views provided by the SDK, e.g. [`JumioScanView`][jumioscanview]. ### Customization Tool [Jumio Surface](https://jumio.github.io/surface-tool/) is a web tool that offers the possibility to apply and visualize all available customization options for the Jumio SDK, as well as an export feature that generates all data needed to import the desired changes straight into your codebase. [![Jumio Surface](images/surface_tool.png)](https://jumio.github.io/surface-tool/) ### Default UI customization The surface tool utilizes each screen of Jumio's [Default UI](#default-ui) to visualize all items and colors that can be customized. If you are planning to use the [Default UI](#default-ui) implementation, you can specify the `Theme.Jumio` as a parent style in your application and override according attributes within this theme to match your application's look and feel. After customizing the SDK via the surface tool, you can click the **Android-Xml** button in the **Output** menu on the bottom right to copy the code from the theme `AppThemeCustomJumio` to your Android app's `styles.xml` file. Apply your custom theme that you defined before by replacing `Theme.Jumio` in the `AndroidManifest.xml:` ```xml ... ``` #### Dark Mode `Theme.Jumio` attributes can also be customized for dark mode. If you haven't done so already, create a `values-night` folder in your resources directory and add a new `styles.xml` file. Adapt your custom Jumio theme for dark mode. The SDK will switch automatically to match the system settings of the user device. ### Custom UI customization If you implement your own UI, you can still customize how some views provided by the SDK look. In particular this means you can customize Jumio's **scan overlay** and **NFC scanning** views at the moment. By following the steps explained in [Default UI customization](#default-ui-customization) you can see potential attributes to override in the generated XML file. ## Testing & Validation - Use Jumio official sample apps to validate flows. - Test on varied device tiers and OS versions. - Test multiple ID types and lighting conditions. # Security All SDK related traffic is sent over HTTPS using TLS and public key pinning. Additionally, the information itself within the transmission is also encrypted utilizing **Application Layer Encryption** (ALE). ALE is a Jumio custom-designed security protocol that utilizes RSA-OAEP and AES-256 to ensure that the data cannot be read or manipulated even if the traffic was captured. ## Token Management & Session Security - Always create SDK tokens server-side. - Auth Tokens are valid for 60 minutes. Reuse the same token within that window rather than generating a new one per launch. - Pass Auth tokens securely using HTTPS only and store in-memory only. - Never hard-code or store tokens creation mechanism on devices. - Always log Account ID and workflowExecutionId. # Support ## Licenses The software contains third-party open source software. For more information, see [licenses](../licenses). This software is based in part on the work of the Independent JPEG Group. ## Contact If you have any questions regarding our implementation guide please contact **Jumio Customer Service** at [support@jumio.com](mailto:support@jumio.com). The [Jumio online helpdesk](https://support.jumio.com) contains a wealth of information regarding our services including demo videos, product descriptions, FAQs, and other resources that can help to get you started with Jumio. ## Copyright © Jumio Corporation, 100 Mathilda Place Suite 100 Sunnyvale, CA 94086 The source code and software available on this website (“Software”) is provided by Jumio Corp. or its affiliated group companies (“Jumio”) "as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall Jumio be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including but not limited to procurement of substitute goods or services, loss of use, data, profits, or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this Software, even if advised of the possibility of such damage. In any case, your use of this Software is subject to the terms and conditions that apply to your contractual relationship with Jumio. As regards Jumio’s privacy practices, please see our privacy notice available here: [Privacy Policy](https://www.jumio.com/privacy-center/privacy-notices/online-services-notice/). [token]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk/-jumio-s-d-k/token.html [datacenter]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk/-jumio-s-d-k/data-center.html [sdkversion]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk/-jumio-s-d-k/-companion/version.html [isrooted]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk/-jumio-s-d-k/-companion/is-rooted.html [camerafacing]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-camera-facing/index.html [acquiremode]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-acquire-mode/index.html [fallbackreason]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-fallback-reason/index.html [userconsented]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.controller/-jumio-controller/user-consented.html [isconfigured]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-credential/is-configured.html [setidconfiguration]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-i-d-credential/set-configuration.html [supportedcountries]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-i-d-credential/supported-countries.html [getphysicaldocuments]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-i-d-credential/get-physical-documents-for-country.html [getdigitaldocuments]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-i-d-credential/get-digital-documents-for-country.html [iscompletecredential]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-credential/is-complete.html [iscompletecontroller]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.controller/-jumio-controller/is-complete.html [startscanpart]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.scanpart/-jumio-scan-part/start.html [finishscanpart]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.scanpart/-jumio-scan-part/finish.html [finishcredential]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-credential/finish.html [finishcontroller]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.controller/-jumio-controller/finish.html [isshutterenabled]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-scan-view/is-shutter-enabled.html [isretryable]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.error/-jumio-error/is-retryable.html [confirm]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-confirmation-view/confirm.html [retakeconfirmation]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-confirmation-view/retake.html [retakereject]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-reject-view/retake.html [retrycontroller]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.controller/-jumio-controller/retry.html [onfinished]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.interfaces/-jumio-controller-interface/on-finished.html [onscanstep]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.interfaces/-jumio-scan-part-interface/on-scan-step.html [onupdate]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.interfaces/-jumio-scan-part-interface/on-update.html [canfinish]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-c-a-n_-f-i-n-i-s-h/index.html [prepare]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-p-r-e-p-a-r-e/index.html [started]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-s-t-a-r-t-e-d/index.html [attachactivity]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-a-t-t-a-c-h_-a-c-t-i-v-i-t-y/index.html [attachfile]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-a-t-t-a-c-h_-f-i-l-e/index.html [scanview]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-s-c-a-n_-v-i-e-w/index.html [digitalidentityview]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-d-i-g-i-t-a-l_-i-d-e-n-t-i-t-y_-v-i-e-w/index.html [imagetaken]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-i-m-a-g-e_-t-a-k-e-n/index.html [nextpart]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-n-e-x-t_-p-a-r-t/index.html [processing]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-p-r-o-c-e-s-s-i-n-g/index.html [confirmationview]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-c-o-n-f-i-r-m-a-t-i-o-n_-v-i-e-w/index.html [rejectview]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-r-e-j-e-c-t_-v-i-e-w/index.html [retry]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-r-e-t-r-y/index.html [addonscanpart]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-a-d-d-o-n_-s-c-a-n_-p-a-r-t/index.html [thirdpartyverification]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-t-h-i-r-d_-p-a-r-t-y_-v-e-r-i-f-i-c-a-t-i-o-n/index.html [jumioactivityattacher]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-activity-attacher/index.html [jumiofileattacher]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-file-attacher/index.html [jumioscanview]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-scan-view/index.html [jumiocontroller]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.controller/-jumio-controller/index.html [jumiocontrollerinterface]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.interfaces/-jumio-controller-interface/index.html [jumioresult]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.result/-jumio-result/index.html [jumioidresult]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.result/-jumio-i-d-result/index.html [jumiofaceresult]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.result/-jumio-face-result/index.html [jumiorejectreason]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.reject/-jumio-reject-reason/index.html [jumioerror]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.error/-jumio-error/index.html [jumiocredential]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-credential/index.html [jumiocredentialinfo]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-credential-info/index.html [jumioidcredential]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-i-d-credential/index.html [jumiodocumentcredential]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-document-credential/index.html [jumiofacecredential]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-face-credential/index.html [jumiodatacredential]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-data-credential/index.html [jumiocredentialcategory]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-credential-category/index.html [jumiophysicaldocument]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-physical-document/index.html [jumiodigitaldocument]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-digital-document/index.html [jumiodocumenttype]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-document-type/index.html [jumiodocumentvariant]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-document-variant/index.html [jumiocredentialpart]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-credential-part/index.html [jumioscanstep]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/index.html [jumioretryreason]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.retry/-jumio-retry-reason/index.html [jumioretrygeneric]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.retry/-jumio-retry-reason-generic/index.html [jumioretrydv]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.retry/-jumio-retry-reason-document-verification/index.html [jumioretrynfc]: https://jumio.github.io/mobile-sdk-android/jumio-nfc/com.jumio.sdk.retry/-jumio-retry-reason-nfc/index.html [jumioretrydi]: https://jumio.github.io/mobile-sdk-android/jumio-digital-identity/com.jumio.sdk.retry/-jumio-retry-reason-digital-identity/index.html [jumioconfirmationview]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-confirmation-view/index.html [jumiorejectview]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-reject-view/index.html [jumioconfirmationhandler]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.handler/-jumio-confirmation-handler/index.html [jumiorejecthandler]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.handler/-jumio-reject-handler/index.html [jumioscanupdate]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-update/index.html [jumiofileattacher]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-file-attacher/index.html [jumioscanpart]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.scanpart/-jumio-scan-part/index.html [jumiomultipart]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-credential-part/-m-u-l-t-i-p-a-r-t/index.html [jumioscanmode]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-mode/index.html [jumioconsenttype]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-consent-type/index.html [jumioconsentitem]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.consent/-jumio-consent-item/index.html [credentialpartslist]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-credential/credential-parts.html [proguardrules]: https://github.com/Jumio/mobile-sdk-android/blob/master/sample/JumioMobileSample/proguard-rules.pro [jumiodiview]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-digital-identity-view/index.html [jumiopreloader]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.preload/-jumio-preloader/index.html [jumiopreloadcallback]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.preload/-jumio-preload-callback/index.html [jumioflashstate]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-flash-state/index.html [jumiotiltstate]: https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.data/-jumio-tilt-state/index.html --- # Transition Guide https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-android-master/docs/transition_guide ![Header Graphic](images/jumio_feature_graphic.jpg) # Transition Guide for Android SDK This section covers all technical changes that should be considered when updating from previous versions, including, but not exclusively: API breaking changes or new functionality in the public API, major dependency changes, attribute changes, deprecation notices. :::important - When updating your SDK version, **all** changes/updates made in in the meantime have to be taken into account and applied if necessary. - **Example:** If you're updating from SDK version **3.7.2** to **3.9.2**, the changes outlined in **3.8.0, 3.9.0** and **3.9.1** are **still relevant**. ::: ## 4.18.0 #### Minimum Android SDK Version increase ⚠️  SDK 4.17.0 was the last SDK version supporting Android 6 (API level 23). Starting with this release the minimum Android SDK version is raised to Android 7.0 "Nougat" (API level 24). #### Public API Changes - [`JumioDigitalDocumentType`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-digital-document-type/index.html) enum has been added with the following supported values: `TRUST_CHECK`, `EIDAS`, `MASTERCARD`, `DIGITAL_DRIVING_LICENSE_PDF` - [`JumioDigitalDocument`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-digital-document/index.html) property `type` has changed from `String` to [`JumioDigitalDocumentType`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-digital-document-type/index.html). - Digital Identity documents can now be preselected via the account request. See the [Preselection](integration_guide.md#preselection) section in the integration guide for details. - The data parameter of [`JumioScanStep.IMAGE_TAKEN`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-i-m-a-g-e_-t-a-k-e-n/index.html) now contains a `Map` with the `scanPart` (a [`JumioCredentialPart`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-credential-part/index.html) value) and `scanMode` (a [`JumioScanMode`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-mode/index.html) value) of the captured image. #### Model updates If you are using the `com.jumio.android:docfinder` module and you bundle the required models in your app then please note that the classifierOnDeviceV2.enc model has been replaced by [mobile-classifier-model-1.0.0.enc](https://cdn.mobile.jumio.ai/android/model/mobile-classifier-model-1.0.0.enc). #### Localization Keys The following keys have been added - `jumio_di_continue_with_provider` - `jumio_di_doctype_digital_id_subheader` - `jumio_di_external_instructions_one` - `jumio_di_external_instructions_two` - `jumio_di_external_instructions_three` - `jumio_di_external_sub_header` - `jumio_physical_id` - `jumio_di_select_from_list_below` - `jumio_di_unexpected_error_description` - `jumio_di_unexpected_error_title` - `jumio_di_use_another_id` - `jumio_di_what_happens_next` - `jumio_accessibility_button_close` The following keys have been renamed: - `jumio_idtype_subtitle_id` to `jumio_select_id_type` - `jumio_di_vendor_selection_title` to `jumio_di_choose_digital_id` - `jumio_di_back_to_document_selection` to `jumio_di_back_to_previous_step` The following keys have been removed: - `jumio_uploading_title` #### Dependency Updates | Name | Jumio Module | Dependency | old version | new version | |---------------------------|---------------------|-------------------------------------------------------|-------------|-------------| | Android Gradle Plugin | all | `"com.android.library"` | 8.9.3 | 8.10.1 | | CameraX Core | camerax | `"androidx.camera:camera-core"` | 1.4.2 | 1.5.3 | | CameraX Lifecycle | camerax | `"androidx.camera:camera-lifecycle"` | 1.4.2 | 1.5.3 | | CameraX View | camerax | `"androidx.camera:camera-view"` | 1.4.2 | 1.5.3 | | Lifecycle Viewmodel | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-ktx"` | 2.9.3 | 2.10.0 | | Lifecycle Savedstate | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-savedstate"` | 2.9.3 | 2.10.0 | | Lifecycle Livedata | defaultui | `"androidx.lifecycle:lifecycle-livedata-ktx"` | 2.9.3 | 2.10.0 | | Lifecycle Runtime Android | defaultui | `"androidx.lifecycle:lifecycle-runtime-android"` | 2.9.3 | 2.10.0 | | Lifecycle Runtime Ktx | defaultui | `"androidx.lifecycle:lifecycle-runtime-Ktx"` | 2.9.3 | 2.10.0 | | Navigation UI | defaultui | `"androidx.navigation:navigation-ui-ktx"` | 2.9.3 | 2.9.7 | | Navigation Fragment | defaultui | `"androidx.navigation:navigation-fragment-ktx"` | 2.9.3 | 2.9.7 | | LiteRT | docfinder, liveness | `"com.google.ai.edge.litert:litert"` | 1.0.1 | 1.4.2 | | LiteRT Metadata | docfinder | `"com.google.ai.edge.litert:litert-metadata"` | 1.0.1 | 1.4.2 | | JMRTD | nfc | `"org.jmrtd:jmrtd"` | 0.8.2 | 0.8.5 | | BouncyCastle | nfc | `"org.bouncycastle:bcprov-jdk18on"` | 1.81 | 1.83 | #### Jetifier and BouncyCastle 1.83 (NFC module) ⚠️  If you still have Jetifier enabled (`android.enableJetifier=true` in your `gradle.properties`) and use the `com.jumio.android:nfc` module, your build will fail. BouncyCastle `bcprov-jdk18on:1.83` is a multi-release jar containing Java 25 (class major version 69) bytecode, which Jetifier cannot scan: ``` Jetifier failed to transform … bcprov-jdk18on-1.83.jar java.lang.IllegalArgumentException - Unsupported class file major version 69 ``` Add BouncyCastle to the Jetifier ignorelist in your `gradle.properties`: ``` android.jetifier.ignorelist=bcprov-jdk18on ``` This excludes the jar from Jetifier's transform step only - it stays on the classpath and ships in the APK unchanged, so NFC keeps working. The transform is a no-op anyway, since BouncyCastle does not reference any `android.support.*` APIs. See the [Jetifier Fails on BouncyCastle 1.83 (NFC module)](known_issues.md#jetifier-fails-on-bouncycastle-183-nfc-module) section in the known issues for details. ## 4.17.0 #### Public API Changes - [`JumioTermsOfUse`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.termsofuse/-jumio-terms-of-use/index.html), [`JumioLookupResult`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-lookup-result/index.html), [`JumioLegalStatement`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-legal-statement/index.html) classes have been added - Optional property `order` has been added to [`JumioCredentialInfo`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-credential-info/index.html) - Property `lookupResult` of type [`JumioLookupResult`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-lookup-result/index.html) has been added to [`JumioIDCredential`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-i-d-credential/index.html) - Method [`userConsented(JumioLookupResult.JumioLegalStatement, Boolean)`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-id-credential/user-consented.html) has been added to [`JumioIDCredential`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-i-d-credential/index.html) - [`onInitialized()`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.interfaces/-jumio-controller-interface/on-initialized.html) callback has been changed from ~~`onInitialized(credentials: List, consentItems: List?)`~~ to [`onInitialized(credentials: List, consentItems: List?, termsOfUse: JumioTermsOfUse?)`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.interfaces/-jumio-controller-interface/on-initialized.html) #### Instant Feedback Reject Reasons The following reject reasons have been removed: - BLACK_WHITE_COPY - COLOR_PHOTOCOPY #### Localizations Changes The following keys have been added: - `jumio_selfiedone_ID_Found` - `jumio_loaders_almost_there` - `jumio_selfiedone_continue` - `jumio_loaders_finishing_up` - `jumio_selfiedone_scan_ID_manually` - `jumio_loaders_success` - `jumio_loaders_this_will_take_a_moment` - `jumio_selfiedone_we_found_your_ID` - `jumio_loaders_working_on_it` The following keys have been removed: - `jumio_liveness_scanning_completed` - `jumio_uploading_success` ## 4.16.0 #### Localizations Changes The following keys have been removed: - `iproov__accessibility_prompt_align_face` - `iproov__accessibility_prompt_scanning` - `iproov__error_camera` - `iproov__error_camera_permission_denied` - `iproov__error_capture_already_active` - `iproov__error_device_not_supported` - `iproov__error_face_detector` - `iproov__error_multi_window_mode_unsupported` - `iproov__error_network` - `iproov__error_server` - `iproov__error_unexpected_error` - `iproov__failure_eyes_closed` - `iproov__failure_face_too_close` - `iproov__failure_face_too_far` - `iproov__failure_misaligned_face` - `iproov__failure_not_supported` - `iproov__failure_obscured_face` - `iproov__failure_sunglasses` - `iproov__failure_too_bright` - `iproov__failure_too_dark` - `iproov__failure_too_much_movement` - `iproov__failure_unknown` - `iproov__failure_user_timeout` - `iproov__progress_assessing_genuine_presence` - `iproov__progress_assessing_liveness` - `iproov__progress_confirming_identity` - `iproov__progress_creating_identity` - `iproov__progress_finding_face` - `iproov__progress_identifying_face` - `iproov__progress_loading` - `iproov__progress_streaming` - `iproov__prompt_align_face` - `iproov__prompt_get_ready` - `iproov__prompt_liveness_scan_completed` - `iproov__prompt_too_bright` - `iproov__prompt_too_close` - `iproov__prompt_too_far` The following keys have been added: - `jumio_dv_clear_or_unedited` - `jumio_dv_jpg_png_or_webp_format` - `jumio_dv_no_transparency_or_watermarks` - `jumio_dv_selected_the_right_file` - `jumio_dv_take_a_photo_or_upload_a_file` - `jumio_dv_upload_an_image` - `jumio_dv_upload_from_photo_library` - `jumio_choose_file_location` - `jumio_dv_retry_selected_file_cannot_be_processed` - `jumio_id_scan_guide_initial` The following keys have been renamed - `jumio_dv_retry_size_limit` to `jumio_dv_retry_maximum_size_limit_exceeded` - `jumio_dv_confirm_file_info` to `jumio_dv_selected_the_right_file` #### Customization Changes The following customization color attributes have been removed: - `` - `` - `` - `` - `` - `` - `` - `` - `` - `` - `` - `` The following customization color attributes have been added: - `` - `` The following customization color attributes have been renamed: - `` to `` #### Dependency Updates | Name | Jumio Module | Dependency | old version | new version | | ----------------------- | --------------- | ---------------------------- | ----------- | ----------- | | IProov | iproov | `"com.iproov.sdk:iproov"` | 9.1.2 | REMOVED | | IProov | iproov | `"com.jumio.android:iproov"` | 4.15.0 | REMOVED | ## 4.15.0 #### Deprecation Notice ⚠️  The iProov dependency `com.jumio.android:iproov` is deprecated and will be removed in SDK v4.16.0. #### Minimum SDK Version Changes - minSdkVersion has been increased to 23. The SDK can still be integrated in Apps that support lower minSdkVersions - check if the [platform is supported](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk/-jumio-s-d-k/-companion/is-supported-platform.html) before initializing the JumioSDK, otherwise it will throw a [PlatformNotSupportedException](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.exceptions/-platform-not-supported-exception/index.html). The minSdkVersion change also internally changes how the apk is compressed which results in bigger apk files. Please see the [FAQ](integration_faq.md#minsdkversion-23-increases-apk-size) for that. #### New SDK Localizations Added The following keys have been added: - `jumio_nfc_error_description_id` - `jumio_nfc_error_description_other` - `jumio_nfc_error_description_us` #### Customization Changes - The following customization color attributes have been added: - `` - `` - `` - `` - `` - `` - `jumio_nfc_id_foreground` customization color attribute has been removed. #### Dependency Updates ⚠️   Please note that the Android Gradle Plugin update is [officially recommended to fully support Android 16](https://developer.android.com/build/releases/gradle-plugin#api-level-support). | Name | Jumio Module | Dependency | old version | new version | | ------------------------- | ---------------- | ----------------------------------------------------- | ----------- | ----------- | | Gradle Wrapper | all | | 8.9 | 8.11.1 | | Android Gradle Plugin | all | `"com.android.library"` | 8.7.3 | 8.9.3 | | Appcompat | all | `"androidx.appcompat:appcompat"` | 1.7.0 | 1.7.1 | | Coroutines | core | `"org.jetbrains.kotlinx:kotlinx-coroutines-android"` | 1.8.1 | 1.10.2 | | Concurrent | core | `"androidx.concurrent:concurrent-futures"` | 1.2.0 | 1.3.0 | | Material | core | `"com.google.android.material:material"` | 1.12.0 | 1.13.0 | | LibYUV | core | `"io.github.crow-misia.libyuv:libyuv-android"` | 0.36.0 | 0.43.2 | | Constraint Layout | core, defaultui | `"androidx.constraintlayout:constraintlayout"` | 2.2.0 | 2.2.1 | | Lifecycle Viewmodel | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-ktx"` | 2.8.7 | 2.9.3 | | Lifecycle Savedstate | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-savedstate"` | 2.8.7 | 2.9.3 | | Lifecycle Livedata | defaultui | `"androidx.lifecycle:lifecycle-livedata-ktx"` | 2.8.7 | 2.9.3 | | Lifecycle Runtime Android | defaultui | `"androidx.lifecycle:lifecycle-runtime-android"` | ADDED | 2.9.3 | | Lifecycle Runtime Ktx | defaultui | `"androidx.lifecycle:lifecycle-runtime-Ktx"` | ADDED | 2.9.3 | | Navigation UI | defaultui | `"androidx.navigation:navigation-ui-ktx"` | 2.8.5 | 2.9.3 | | Navigation Fragment | defaultui | `"androidx.navigation:navigation-fragment-ktx"` | 2.8.5 | 2.9.3 | | Browser | digital-identity | `"androidx.browser:browser"` | 1.8.0 | 1.9.0 | | AndroidX Core KTX | docfinder | `"androidx.core:core-ktx"` | 1.15.0 | 1.17.0 | | JMRTD | nfc | `"org.jmrtd:jmrtd"` | 0.7.42 | 0.8.2 | | BouncyCastle | nfc | `"org.bouncycastle:bcprov-jdk18on"` | 1.78.1 | 1.81 | ## 4.14.0 #### Deprecation Notice ⚠️  SDK 4.14.0 will be the last SDK version supporting Android 5 (API level 21). All subsequent SDK versions will require at least Android 6.0 "Marshmallow" (API level 23). #### General - Added support for Android 16. #### LiteRT Notice JumioSDK bundles LiteRT Version 1.0.1 which supports 16kb page size for ARM64-v8 but not x86_64. This is fine for the JumioSDK as only ARM cpus are supported. An update to 1.4.0 is currently not possible because the min API level of LiteRT 1.4.0 (25) exceeds the min API level of the Jumio SDK (21). If you don't use LiteRT elsewhere in the code you can remove the x86 and x86_64 libraries by excluding them in the packagingOptions: ```gradle android { ... packagingOptions { ... it.excludes.add("lib/x86_64/libtensorflowlite_jni.so") it.excludes.add("lib/x86/libtensorflowlite_jni.so") } } ``` If your apps min API level is at least 25 then the LiteRT dependency can be overridden: ```gradle implementation ("com.jumio.android:docfinder:4.14.0") { exclude group: 'com.google.ai.edge.litert', module: 'litert' exclude group: 'com.google.ai.edge.litert', module: 'litert-metadata' } implementation ("com.jumio.android:liveness:4.14.0") { exclude group: 'com.google.ai.edge.litert', module: 'litert' } implementation 'com.google.ai.edge.litert:litert:1.4.0' implementation 'com.google.ai.edge.litert:litert-support:1.4.0' ``` #### Public API Changes - Unused [`JumioFallbackReason.NO_DETECTION`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-fallback-reason/index.html) has been removed. - `IMAGE_ANALYSIS` has been added to [`JumioScanUpdate`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-update/index.html) - Property `SCANNING_ERROR` has been added to [`JumioFallbackReason`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-fallback-reason/index.html). - The data parameter of [`JumioScanStep.ADDON_SCAN_PART`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-a-d-d-o-n_-s-c-a-n_-p-a-r-t/index.html) now contains [`JumioDocumentInfo`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-document-info/index.html). - [`JumioDocumentInfo`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-document-info/index.html) contains the issuing country and the [`JumioDocumentType`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-document-type/index.html) of the initially scanned document . - Function `getHelpAnimation()` has been deprecated in [`JumioScanPart`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.scanpart/-jumio-scan-part/index.html). #### Android Manifest Changes The following optional permission can be declared in the `AndroidManifest.xml` file, in order to improve fraud prevention: `` #### New SDK Localizations Added The following keys have been added: - `jumio_id_scan_hint_error_fallback` - `jumio_eidas_description` - `jumio_eidas_login_header` - `jumio_button_continue` - `jumio_switched_to_back_camera` - `jumio_switched_to_front_camera` - `jumio_search_completed_for_country` - `jumio_search_bar` - `jumio_no_results_found` - `jumio_clear_search` - `jumio_current_issuing_country` - `jumio_button` - `jumio_accessibility_camera_switch_to_back` - `jumio_accessibility_camera_switch_to_front` - `jumio_select` - `jumio_change_issuing_country` - `jumio_current_issuing_country` - `jumio_accessibility_scan_back` The following keys have been removed: - `jumio_nfc_retry_error_general` - `iproov__prompt_pitch_too_high` - `iproov__prompt_pitch_too_low` - `iproov__prompt_roll_too_high` - `iproov__prompt_roll_too_low` - `iproov__prompt_yaw_too_high` - `iproov__prompt_yaw_too_low` #### Dependency Updates | Name | Jumio Module | Dependency | old version | new version | | ----------------- | ------------ | ------------------------------------------ | ----------- | ----------- | | Concurrent | core | `"androidx.concurrent:concurrent-futures"` | ADDED | 1.2.0 | | CameraX Core | camerax | `"androidx.camera:camera-core"` | 1.4.1 | 1.4.2 | | CameraX Lifecycle | camerax | `"androidx.camera:camera-lifecycle"` | 1.4.1 | 1.4.2 | | CameraX View | camerax | `"androidx.camera:camera-view"` | 1.4.1 | 1.4.2 | ## 4.13.0 #### Public API Changes - The data parameter of [`JumioScanStep.ADDON_SCAN_PART`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/-a-d-d-o-n_-s-c-a-n_-p-a-r-t/index.html) now contains [`JumioDocumentInfo`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-document-info/index.html) - [`JumioDocumentInfo`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-document-info/index.html) contains the issuing country and the [`JumioDocumentType`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-document-type/index.html) of the initially scanned document - Function `getHelpAnimation()` has been deprecated in [`JumioScanPart`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.scanpart/-jumio-scan-part/index.html) #### New SDK Localizations Added The following keys have been added: - `jumio_nfc_id_retry_tag_lost` - `jumio_nfc_id_description` - `jumio_nfc_id_header_start` #### Dependency Updates | Name | Jumio Module | Dependency | old version | new version | | --------------------- | --------------- | ----------------------------------------------------- | ----------- | ----------- | | Gradle Wrapper | all | | 8.7 | 8.9 | | Android Gradle Plugin | all | `"com.android.library"` | 8.6.1 | 8.7.3 | | Kotlin Plugin | all | `"org.jetbrains.kotlin.android"` | 2.0.0 | 2.1.0 | | Kotlin Stdlib | all | `"org.jetbrains.kotlin:kotlin-stdlib-jdk8"` | 2.0.0 | 2.1.0 | | Annotation | core | `"androidx.annotation:annotation-jvm"` | 1.8.2 | 1.9.1 | | Navigation UI | core | `"androidx.navigation:navigation-ui-ktx"` | 2.8.1 | 2.8.5 | | Navigation Fragment | core | `"androidx.navigation:navigation-fragment-ktx"` | 2.8.1 | 2.8.5 | | Constraint Layout | core, defaultui | `"androidx.constraintlayout:constraintlayout"` | 2.1.4 | 2.2.0 | | CameraX Core | camerax | `"androidx.camera:camera-core"` | 1.3.4 | 1.4.1 | | CameraX Lifecycle | camerax | `"androidx.camera:camera-lifecycle"` | 1.3.4 | 1.4.1 | | CameraX View | camerax | `"androidx.camera:camera-view"` | 1.3.4 | 1.4.1 | | AndroidX Core KTX | docfinder | `"androidx.core:core-ktx"` | 1.13.1 | 1.15.0 | | CameraX Camera2 | camerax | `"androidx.camera:camera-camera2"` | 1.3.4 | 1.4.1 | | Lifecycle Viewmodel | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-ktx"` | 2.8.6 | 2.8.7 | | Lifecycle Savedstate | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-savedstate"` | 2.8.6 | 2.8.7 | | Lifecycle Livedata | defaultui | `"androidx.lifecycle:lifecycle-livedata-ktx"` | 2.8.6 | 2.8.7 | | Datadog | datadog | `"com.jumio.android:datadog"` | 4.12.1 | REMOVED | #### Dependency Management - Bill of Material (BOM) support for simplified dependency management and versioning has been added. ```groovy dependencies { implementation platform("com.jumio.android:bom:4.13.0") implementation "com.jumio.android:core" implementation "com.jumio.android:barcode-mlkit" implementation "com.jumio.android:camerax" implementation "com.jumio.android:defaultui" implementation "com.jumio.android:digital-identity" implementation "com.jumio.android:docfinder" implementation "com.jumio.android:iproov" implementation "com.jumio.android:liveness" implementation "com.jumio.android:nfc" } ``` #### Customization Changes - Custom NFC parent theme has been renamed from ~~`Nfc.Customization`~~ to `Jumio.Nfc.Customization` - The following customization color attributes have been renamed: - ~~``~~ to `` - ~~``~~ to `` - ~~``~~ to `` - ~~``~~ to `` - ~~``~~ to `` ## 4.12.1 No backward incompatible changes ## 4.12.0 This version adds support for Android 15 and 16KB page size for native libraries. #### Public API Changes - Property `LINEFINDER` was unused and has been removed from [`JumioScanMode`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-mode/index.html) - Property `JUMIO_PREMIUM` has been added to [`JumioScanMode`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-mode/index.html) - Optional parameter `url` has been added to [`JumioDigitalDocument`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-digital-document/index.html) - `INVALID_CERTIFICATE` has been added to [`JumioRejectReason`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.reject/-jumio-reject-reason/index.html) - Function `detach()` has been added to [`JumioScanView`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-scan-view/index.html) #### Dependency Updates - Tensorflow Lite dependencies have been updated to LiteRT - see https://developers.googleblog.com/en/tensorflow-lite-is-now-litert/ for more infos. | Name | Jumio Module | Dependency | old version | new version | | ------------------------ | ------------------- | --------------------------------------------------------------- | ----------- | ----------- | | Android Gradle Plugin | all | `"com.android.library"` | 8.2.2 | 8.6.1 | | Kotlin Plugin | all | `"org.jetbrains.kotlin.android"` | 1.9.24 | 2.0.0 | | Kotlin Stdlib | all | `"org.jetbrains.kotlin:kotlin-stdlib-jdk8"` | 1.9.24 | 2.0.0 | | Annotation | core | `"androidx.annotation:annotation-jvm"` | 1.8.0 | 1.8.2 | | Navigation UI | core | `"androidx.navigation:navigation-ui-ktx"` | 2.7.7 | 2.8.1 | | Navigation Fragment | core | `"androidx.navigation:navigation-fragment-ktx"` | 2.7.7 | 2.8.1 | | LibYUV | core | `"io.github.crow-misia.libyuv:libyuv-android"` | 0.34.0 | 0.36.0 | | CameraX Core | camerax | `"androidx.camera:camera-core"` | 1.3.3 | 1.3.4 | | CameraX Lifecycle | camerax | `"androidx.camera:camera-lifecycle"` | 1.3.3 | 1.3.4 | | CameraX View | camerax | `"androidx.camera:camera-view"` | 1.3.3 | 1.3.4 | | CameraX Camera2 | camerax | `"androidx.camera:camera-camera2"` | 1.3.3 | 1.3.4 | | Lifecycle Viewmodel | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-ktx"` | 2.8.1 | 2.8.6 | | Lifecycle Savedstate | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-savedstate"` | 2.8.1 | 2.8.6 | | Lifecycle Livedata | defaultui | `"androidx.lifecycle:lifecycle-livedata-ktx"` | 2.8.1 | 2.8.6 | | Tensorflow Lite | docfinder, liveness | `"org.tensorflow:tensorflow-lite"` | 2.16.1 | REMOVED | | LiteRT | docfinder, liveness | `"com.google.ai.edge.litert:litert"` | ADDED | 1.0.1 | | Tensorflow Lite Metadata | docfinder | `"org.tensorflow:tensorflow-lite-metadata"` | 0.4.4 | REMOVED | | LiteRT Metadata | docfinder | `"com.google.ai.edge.litert:litert-metadata"` | ADDED | 1.0.1 | | IProov | iproov | `"com.iproov.sdk:iproov"` | 9.1.1 | 9.1.2 | | JMRTD | nfc | `"org.jmrtd:jmrtd"` | 0.7.41 | 0.7.42 | | Scube | nfc | `"net.sf.scuba:scuba-sc-android"` | 0.0.25 | 0.0.26 | | BouncyCastle | nfc | `"org.bouncycastle:bcprov-jdk18on"` | 1.77 | 1.78.1 | | MLKit Barcode | barcode-mlkit | `"com.google.android.gms:play-services-mlkit-barcode-scanning"` | 18.3.0 | 18.3.1 | #### Packaging Options Multiple third party android libraries include the same meta files which will result in duplicates files during the build. Please see the [FAQ](integration_faq.md#packaging-options) section for that. #### SDK Localizations Changes ##### New strings | new | | ------------------------------------- | | `jumio_liveness_prompt_keep_centered` | | `jumio_liveness_prompt_keep_still` | | `jumio_liveness_prompt_keep_upright` | | `jumio_liveness_prompt_tilt_down` | | `jumio_liveness_prompt_tilt_left` | | `jumio_liveness_prompt_tilt_right` | | `jumio_liveness_prompt_tilt_up` | | `jumio_liveness_scanning_completed` | ##### Renamed strings | old | new | | -------------------------------------------- | -------------------------------------------- | | `jumio_liveness_prompt_success_another_shot` | `jumio_liveness_prompt_success_another_scan` | | `jumio_liveness_prompt_too_close` | `jumio_liveness_prompt_move_away` | | `jumio_error_case_ocr_failed` | `jumio_error_case_scanning_not_possible` | ## 4.11.0 #### Public API Changes - `TILT` has been added to [`JumioScanUpdate`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-update/index.html) alongside with [`JumioTiltState`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.core/-jumio-tilt-state/index.html) - `NEXT_POSITION` has been added to [`JumioScanUpdate`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-update/index.html) - `IMAGE_TAKEN` [`JumioScanStep`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/index.html) is again sent only when the side/part is completed. If you have logic based on `NEXT_PART` or `PROCESSING`, it is not affected by this change. - 'UNSUPPORTED_DOCUMENT' has been added to [`JumioRejectReason`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.reject/-jumio-reject-reason/index.html) #### Dependency Updates | Name | Jumio Module | Dependency | old version | new version | | -------------------- | ------------ | ----------------------------------------------------- | ----------- | ----------- | | Annotation | core | `"androidx.annotation:annotation-jvm"` | 1.7.1 | 1.8.0 | | Appcompat | core | `"androidx.appcompat:appcompat"` | 1.6.1 | 1.7.0 | | Material | core | `"com.google.android.material:material"` | 1.11.0 | 1.12.0 | | Coroutines | core | `"org.jetbrains.kotlinx:kotlinx-coroutines-android"` | 1.8.0 | 1.8.1 | | LibYUV | core | `"io.github.crow-misia.libyuv:libyuv-android"` | 0.33.0 | 0.34.0 | | CameraX Core | camerax | `"androidx.camera:camera-core"` | 1.3.1 | 1.3.3 | | CameraX Lifecycle | camerax | `"androidx.camera:camera-lifecycle"` | 1.3.1 | 1.3.3 | | CameraX View | camerax | `"androidx.camera:camera-view"` | 1.3.1 | 1.3.3 | | CameraX Camera2 | camerax | `"androidx.camera:camera-camera2"` | 1.3.1 | 1.3.3 | | Lifecycle Viewmodel | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-ktx"` | 2.7.0 | 2.8.1 | | Lifecycle Savedstate | defaultui | `"androidx.lifecycle:lifecycle-viewmodel-savedstate"` | 2.7.0 | 2.8.1 | | Lifecycle Livedata | defaultui | `"androidx.lifecycle:lifecycle-livedata-ktx"` | 2.7.0 | 2.8.1 | | IProov | iproov | `"com.iproov.sdk:iproov"` | 9.0.4 | 9.1.1 | #### Customization Changes - `jumio_divider_color` has been added to customize the color of list dividers - See also: [Jumio sample `styles.xml`](https://github.com/Jumio/mobile-sdk-android/tree/master/sample/JumioMobileSample/src/main/res/values/styles.xml) #### New SDK Localizations Added The following keys have been added: - `jumio_id_scan_guide_photo_side_tilt` - `jumio_id_scan_prompt_tilt_less` - `jumio_id_scan_prompt_tilt_more` ## 4.10.0 #### Public API Changes - `IMAGE_TAKEN` [`JumioScanStep`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/index.html) is now sent for each image required for a specified side. This is different to previous behavior where `IMAGE_TAKEN` was sent only when the side/part was completed. Please make sure to align any logic based on `IMAGE_TAKEN` to the new behavior. `NEXT_PART` or `PROCESSING` might be used to identify when a side/part has been finished. - `FLASH` has been added to [`JumioScanUpdate`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-update/index.html) #### New SDK Localizations Added SDK Translations for the languages Serbian (Cyrillic) and Serbian (Latin) have been added. #### Dependency Updates - Tensorflow lite update: ~~`"org.tensorflow:tensorflow-lite:2.10.0"`~~ is replaced by `"org.tensorflow:tensorflow-lite:2.16.1"`. - `"com.jumio.android:camerax"` is added as a transitive dependency to `"com.jumio.android:liveness"` ## 4.9.1 No backward incompatible changes ## 4.9.0 #### Compile SDK Version Changes - **⚠️  The minimum required compile SDK version for SDK `4.9.0` is `34`.** - With these changes also Gradle 8 is **required** to build your application successfully. The [Android Gradle plugin Upgrade Assistant](https://developer.android.com/build/agp-upgrade-assistant) can be helpful conducting the upgrade. - Troubleshooting: - In case you are experiencing some errors when trying to build your release application, make sure to replace all occurrences of `tasks.whenTaskAdded` with `tasks.configureEach` #### Public API Changes - Function `getHelpAnimation()` has been deprecated for all face help animation instances in [`JumioScanPart`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.scanpart/-jumio-scan-part/index.html) - Property `parts` has been added to [`JumioPhysicalDocument`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-physical-document/index.html) - Property `idSubType` has been added to [`JumioIDResult`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.result/-jumio-i-d-result/index.html) - Removed retry code `USER_BACK` from `JumioRetryReasonGeneric`. - Added `JumioRetryReasonFace` to represent new retry codes for face scanning: - GENERIC = 3001 - TOO_MUCH_MOVEMENT = 3002 - LIGHTING_TOO_BRIGHT = 3003 - LIGHTING_TOO_DARK = 3004 - EYES_CLOSED = 3005 - OBSCURED_FACE = 3006 - MULTIPLE_FACES = 3007 - SUNGLASSES = 3008 - Class `JumioDataCredential` has been removed - Property `DEVICE_RISK` has been removed from [`JumioScanMode`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-mode/index.html) - Property `DEVICE_RISK` has been removed from [`JumioCredentialPart`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-credential-part/index.html) #### Dependency Updates - Removed Devicerisk dependency: ~~`implementation "com.jumio.android:devicerisk:4.8.1"`~~ - IProov update: ~~`"com.iproov.sdk:iproov:8.3.1"`~~ is replaced by `"com.iproov.sdk:iproov:9.0.3"`. Please note that this update also includes a major UI/UX upgrade. #### Customization Changes - The following customization color attributes have been added: - `` - `` - `` - `` - `` - `` - Customization attribute ~~``~~ has been removed ## 4.8.2 #### Dependency Updates - IProov update: ~~`"com.iproov.sdk:iproov:8.3.1"`~~ is replaced by `"com.iproov.sdk:iproov:8.5.2"` ## 4.8.1 No backward incompatible changes ## 4.8.0 No backward incompatible changes ## 4.7.2 #### Dependency Updates - IProov update: ~~`"com.iproov.sdk:iproov:8.3.1"`~~ is replaced by `"com.iproov.sdk:iproov:8.5.2"` ## 4.7.1 No backward incompatible changes ## 4.7.0 #### Public API Changes - `rawBarcodeData` has been removed from [`JumioIDResult`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.result/-jumio-i-d-result/index.html) - `LEGAL_HINT` has been removed from [`JumioScanUpdate`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-update/index.html) - `giveDataDogConsent` has been removed from [`JumioSDK`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk/-jumio-s-d-k/-companion/index.html) #### Dependency Updates - Removed MRZ dependency: ~~`implementation "com.jumio.android:mrz:4.6.0"`~~ - Removed Linefinder dependency: ~~`implementation "com.jumio.android:linefinder:4.6.0"`~~ - Removed Barcode dependency: ~~`implementation "com.jumio.android:barcode:4.6.0"`~~ - Datadog update: ~~`"com.datadoghq:dd-sdk-android:1.19.3"`~~ is replaced by `"com.datadoghq:dd-sdk-android-rum:2.0.0"` - If Datadog is used in a dynamic feature module please have a look at [this known issue](known_issues.md#datadog-in-dynamic-feature-modules). #### Custom UI Changes - The platform check has been moved from the [`JumioSDK`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk/-jumio-s-d-k/-companion/index.html) constructor to the [`JumioController`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.controller/-jumio-controller/index.html) constructor. In case the platform is not supported there will be a non-retryable F000001 [`JumioError`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.error/-jumio-error/index.html) delivered in [`JumioControllerInterface$onError`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.interfaces/-jumio-controller-interface/on-error.html) instead of a [`PlatformNotSupportedException`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.exceptions/-platform-not-supported-exception/index.html) being thrown. Please also make sure to check [`isSupportedPlatform`](https://github.com/Jumio/mobile-sdk-android/blob/master/docs/integration_guide.md#device-supported-check) before using the SDK. #### Localization Changes - SDK string translations for Brazilian Portuguese (pt-rBR) have been added #### Customization Changes - Customization attribute ~~``~~ has been removed #### Documentation Changes - Functions `persist` and `stop` in [`JumioController`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.controller/-jumio-controller/index.html) need to be called independently from `isComplete` as long as the workflow is not yet finished or canceled. ## 4.6.2 #### Dependency Updates - IProov update: ~~`"com.iproov.sdk:iproov:8.3.1"`~~ is replaced by `"com.iproov.sdk:iproov:8.5.2"` ## 4.6.1 No backward incompatible changes ## 4.6.0 #### Public API Changes - `JUMIO_LIVENESS` has been added to [`JumioScanMode`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-mode/index.html) - `MOVE_FACE_CLOSER` has been added to [`JumioScanUpdate`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-update/index.html) - `FACE_TOO_CLOSE` has been added to [`JumioScanUpdate`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-update/index.html) #### Customization Changes - A new customization theme `@style/CustomFaceHelp` has been added to help customize the newly added Jumio Liveness solution. This style includes the following attributes: - `` - `` - The following customization attributes have been added to `@style/CustomOverlay` theme: - `` - `` - ``~~ - ~~``~~ - See also: [Jumio sample `styles.xml`](https://github.com/Jumio/mobile-sdk-android/tree/master/sample/JumioMobileSample/src/main/res/values/styles.xml) #### Dependency Updates - NEW Liveness dependency: `implementation "com.jumio.android:liveness:4.6.0"` ## 4.5.2 #### Dependency Updates - IProov update: ~~`"com.iproov.sdk:iproov:8.3.1"`~~ is replaced by `"com.iproov.sdk:iproov:8.5.2"` ## 4.5.1 No backward incompatible changes ## 4.5.0 #### Public API Changes - ~~`onPause`~~ has been removed from [JumioScanPart](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.scanpart/-jumio-scan-part/index.html) - [`JumioError.code`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.error/-jumio-error/index.html) format updated from `[A][x][yyyy]` to `[A][xx][yyyy]` - Property [`countries`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-i-d-credential/countries.html) of `JumioIDCredential` has been deprecated. Instead the following new property and functions have been added: - [`JumioIDCredential.supportedCountries`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-i-d-credential/supported-countries.html) - [`JumioIDCredential.getPhysicalDocumentsForCountry(countryCode:)`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-i-d-credential/get-physical-documents-for-country.html) - [`JumioIDCredential.getDigitalDocumentsForCountry(countryCode:)`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-i-d-credential/get-digital-documents-for-country.html) - [`JumioDeepLinkHandler`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.util/-jumio-deep-link-handler/index.html) has been added - [`JumioPhysicalDocument`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-physical-document/index.html) and [`JumioDigitalDocument`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-digital-document/index.html) have been added - [`JumioDocument`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.document/-jumio-document/index.html) type has changed to interface. (Original `JumioDocument` class has been replaced by `JumioPhysicalDocument`) - `DIGITAL` has been added in [`JumioCredentialPart`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-credential-part/index.html) - `DIGITAL_IDENTITY_VIEW` and `THIRD_PARTY_VERIFICATION` have been added in [`JumioScanStep`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/index.html) - [`JumioRetryReasonDigitalIdentity`](https://jumio.github.io/mobile-sdk-android/jumio-digital-identity/com.jumio.sdk.retry/-jumio-retry-reason-digital-identity/index.html) has been added - [`JumioConsentItem`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.consent/-jumio-consent-item/index.html) class and [`JumioConsentType`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-consent-type/index.html) enum have been added - [`onInitialized()`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.interfaces/-jumio-controller-interface/on-initialized.html) callback has been changed from ~~`onInitialized(credentials: List, policyUrl: String?)`~~ to [`onInitialized(credentials: List, consentItems: List?)`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.interfaces/-jumio-controller-interface/on-initialized.html) - Please refer to the [Consent Handling section](https://github.com/Jumio/mobile-sdk-android/blob/master/docs/integration_guide.md#consent-handling) in our integration guide for more details. #### Localization Keys The following keys have been added to `strings.xml`: - jumio_idtype_di - jumio_di_vendor_selection_title - jumio_di_retry_unknown - jumio_di_retry_third_party_verification_error - jumio_di_retry_service_error - jumio_di_retry_expired - jumio_di_back_to_document_selection #### Dependency Updates - IProov update: ~~`"com.iproov.sdk:iproov:8.0.3"`~~ is replaced by `"com.iproov.sdk:iproov:8.3.1"` ## 4.4.2 No backward incompatible changes ## 4.4.1 No backward incompatible changes ## 4.4.0 #### Public API Changes - `credentialParts` property of [`JumioCredential` class](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.credentials/-jumio-credential/credential-parts.html) has been changed from `ArrayList` to `List` - [`JumioConfirmationHandler`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.handler/-jumio-confirmation-handler/index.html) has been added. Attach a [JumioScanPart](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.scanpart/-jumio-scan-part/index.html) to this class to retrieve all accepted images and render them to [`JumioConfirmationView`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-confirmation-view/index.html) objects for confirmation. - [`JumioRejectHandler`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.handler/-jumio-reject-handler/index.html) has been added. Attach a [JumioScanPart](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.scanpart/-jumio-scan-part/index.html) to this class to retrieve all rejected images and render them to [`JumioRejectView`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-reject-view/index.html) objects for retaking. - Functions in [`JumioConfirmationView`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-confirmation-view/index.html) have been moved to [`JumioConfirmationHandler`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.handler/-jumio-confirmation-handler/index.html). - Functions in [`JumioRejectView`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.views/-jumio-reject-view/index.html) have been moved to [`JumioRejectHandler`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.handler/-jumio-reject-handler/index.html) - `MULTIPART` has been added in [`JumioCredentialPart`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-credential-part/index.html) as a new Autocapture scan part: Instead of having a single scan part for all parts of a document (front, back), there is now a single `MULTIPART` scan part that combines the two. Within this scan part all needed parts of a document are captured at once. - `NEXT_PART` has been added in [`JumioScanStep`](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-scan-step/index.html): This scan step shows that the previous part has been captured and the next one can be started (e.g. frontside has been captured, now switch to the backside of the document) #### Customization Updates - Attributes changed and added to [`Iproov.Customization` theme](https://github.com/Jumio/mobile-sdk-android/blob/master/sample/JumioMobileSample/src/main/res/values/styles.xml#L95) #### Dependency Updates - IProov update: ~~`"com.iproov.sdk:iproov:7.5.0"`~~ is replaced by `"com.iproov.sdk:iproov:8.0.3"` ## 4.3.1 No backward incompatible changes ## 4.3.0 #### Minimum SDK Version Changes - minSdkVersion has been increased to 21. The SDK can still be integrated in Apps that support lower minSdkVersions - check if the [platform is supported](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk/-jumio-s-d-k/-companion/is-supported-platform.html) before initializing the JumioSDK, otherwise it will throw a [PlatformNotSupportedException](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.exceptions/-platform-not-supported-exception/index.html). #### Dependency Updates - IProov update: ~~`"com.iproov.sdk:iproov:7.2.0"`~~ is replaced by `"com.iproov.sdk:iproov:7.5.0"` #### Public API Changes - Document Verification is now supported. Please check the [Integration Guide](https://github.com/Jumio/mobile-sdk-android/blob/master/docs/integration_guide.md#jumio-document-credential) for more information. - ~~`JumioCameraPosition`~~ from package `com.jumio.sdk.enums` in `com.jumio.sdk:core` is replaced by `JumioCameraFacing` - `JumioAcquireMode` has been added to package `com.jumio.sdk.enums` in `com.jumio.sdk:core`, containing fields `FILE` and `CAMERA` - [`JumioDataCredential` class](integration_guide.md/#jumio-data-credential) has been added for handling of Device Fingerprinting - [`JumioDocumentCredential` class](integration_guide.md/#jumio-document-credential) has been added for Document Verification handling ## 4.2.1 No backward incompatible changes ## 4.2.0 #### Public API Changes - In [JumioControllerInterface](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.interfaces/-jumio-controller-interface/index.html) the signature of function `onInitialized` has been changed. Parameter `credentials` has been changed from `ArrayList` to `List` - In [JumioResult](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.result/-jumio-result/index.html) field `credentialInfos` has been changed from `ArrayList?` to `List?` - `JumioScanSide` from package `com.jumio.sdk.enums` in `com.jumio.sdk:core` has been renamed to [JumioCredentialPart](https://jumio.github.io/mobile-sdk-android/jumio-core/com.jumio.sdk.enums/-jumio-credential-part/index.html) #### Dependency Updates - NEW Autocapture dependency (Beta): `implementation "com.jumio.android:docfinder:4.2.0"` #### Customization Updates - Boolean `iproov_floating_prompt_enabled` has been added to [`Iproov.Customization` theme](https://github.com/Jumio/mobile-sdk-android/blob/master/sample/JumioMobileSample/src/main/res/values/styles.xml#L84) - Color attribute ~`iproov_footerTextColor` has been replaced with `iproov_promptTextColor` in [`Iproov.Customization` theme](https://github.com/Jumio/mobile-sdk-android/blob/master/sample/JumioMobileSample/src/main/res/values/styles.xml#L84) #### Deprecation Notice ⚠️  SDK 4.2.0 will be the last SDK version supporting Android 4.4 (API level 19). All subsequent SDK versions will require at least Android 5.0 "Lollipop" (API level 21). ## 4.1.1 No backward incompatible changes ## 4.1.0 #### Dependency Updates - NEW Datadog dependency (optional): `implementation "com.jumio.android:datadog:4.1.0"` - IProov update: ~~`"com.iproov.sdk:iproov:7.0.3"`~~ is replace by `"com.iproov.sdk:iproov:7.2.0"` #### Customization Updates - Dark mode is now available. DefaultUI will switch automatically if system settings of the user device change. - Dark mode can also be customized by creating a custom theme, utilizing `values-night` in the resources directory. #### Instant Feedback Reject Reasons Added Instant Feedback functionality to give more granular user feedback with new reject reasons: - BLACK_WHITE_COPY - COLOR_PHOTOCOPY - DIGITAL_COPY - NOT_READABLE - NO_DOC - MISSING_BACK - MISSING_FRONT - BLURRY - MISSING_PART_DOC - DAMAGED_DOCUMENT - HIDDEN_PART_DOC - GLARE ## 4.0.0 #### Authentication ℹ️  **As of version 4.0.0 and onward, the SDK can only be used in combination with Jumio KYX or Jumio API v3. API v2 as well as using API token and secret to authenticate against the SDK will no longer be compatible.** #### Dependency Updates - The repository declaration for ~~`jcenter()`~~ is replaced with `mavenCentral()` as [JFrog will be shutting down JCenter](https://blog.gradle.org/jcenter-shutdown) - Additionally to that, the repository declaration `gradlePluginPortal()` was added to mitigate the gradle build plugin dependency not being migrated to `mavenCentral()` yet. - All AndroidX dependencies are now declared in the `.pom` files and resolved transitively by Gradle. The following AndroidX dependencies are used in the SDK, but **do not** have to be declared manually in the `build.gradle` anymore: - `"androidx.appcompat:appcompat:1.3.0"` - `"com.google.android.material:material:1.4.0"` - `"androidx.constraintlayout:constraintlayout:2.1.1"` - `"androidx.lifecycle:lifecycle-livedata-ktx:2.3.1"` - `"androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1"` - `"androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.1"` - `"androidx.lifecycle:lifecycle-extensions:2.2.0"` - `"androidx.recyclerview:recyclerview:1.2.1"` - `"androidx.fragment:fragment-ktx:1.3.6"` - `"androidx.navigation:navigation-ui-ktx:2.3.5"` - The Jumio liveness dependency `"com.iproov.sdk:iproov:7.0.3"` is referenced as a transitive dependency within the iProov module and does not have to be added manually to the `build.gradle` anymore. - `kotlin-parcelize` and `kotlinx-serialization` plugins, as well as the following dependencies have been removed: - `org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.0` - `org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.0` #### Initialization Updates - ~~`apiToken`~~ and ~~`apiSecret`~~ are replaced by one-time `sdk.token` #### Default UI Updates As of SDK version 4.0.0, a lot of SDK parameters that previously could be set in the actual code are now contained within and provided by the `sdk.token`. These parameters have to be configured beforehand, during the API call that requests the token. Please refer to the [Configuration section](integration_guide.md#configuration) of our integration guides for a detailed description of all Default UI changes and updates. Information about which user journey (ID Verification, Selfie Verification, Authentication, ...) the SDK is going to provide now also has to be specified during the API call that request the `sdk.token`. For more details on individual Jumio workflows, please refer to [Workflow Descriptions](https://github.com/Jumio/implementation-guides/blob/master/api-guide/workflow_descriptions.md) in our guides. #### Custom UI Updates As of SDK version 4.0.0, Custom UI workflow has been completely restructured. Please refer to the [Custom UI section](integration_guide.md#custom-ui) of our integration guides for a detailed description of all Custom UI changes and updates. ## 3.9.5 No backward incompatible changes ## 3.9.4 - IProov update: ~~`"com.iproov.sdk:iproov:6.4.1"`~~ is replaced by `"com.iproov.sdk:iproov:6.4.3"`. ## 3.9.3 No backward incompatible changes ## 3.9.2 #### Dependency Changes - IProov update: ~~`"com.iproov.sdk:iproov:6.3.1"`~~ is replaced by `"com.iproov.sdk:iproov:6.4.1"`. This version improves conversion and offers additional customization options. #### Customization Updates - Added additional customization attributes to the IProov theme `Iproov.Customization`: - `iproov_headerTextColor` - `iproov_headerBackgroundColor` - `iproov_footerTextColor` - `iproov_footerBackgroundColor` - `iproov_livenessScanningTintColor` - `iproov_progressBarColor` ## 3.9.1 #### Dependency Changes - IProov update: ~~`"com.iproov.sdk:iproov:6.3.0"`~~ is replaced by `"com.iproov.sdk:iproov:6.3.1"`. This version fixes cross-dependency problems with okhttp 4.x #### Customization Updates - Added attribute `iproov_backgroundColor` to the IProov theme `Iproov.Customization` to allow customization of the IProov background color during scanning. ## 3.9.0 #### Dependency Changes - IProov update: ~~`"com.iproov.sdk:iproov:6.1.0"`~~ is replaced by "com.iproov.sdk:iproov:6.3.0" - Room update: ~~`"androidx.room:room-runtime:2.2.5"`~~ is replaced by "androidx.room:room-runtime:2.2.6" - AndroidX Kotlin Extension update: ~~`"androidx.core:core-ktx:1.3.1"`~~ is replaced by `"androidx.core:core-ktx:1.3.2"` - JMRTD update: ~~`"org.jmrtd:jmrtd:0.7.19"`~~ is replaced by `"org.jmrtd:jmrtd:0.7.24"` - Bouncycastle update: ~~`"org.bouncycastle:bcprov-jdk15on:1.65"`~~ is replaced by `"org.bouncycastle:bcprov-jdk15on:1.67"` - REMOVE LocalBroadcastManager ~~`"androidx.localbroadcastmanager:localbroadcastmanager:1.0.0"`~~ - REPLACE ~~`apply plugin: 'kotlin-android-extensions`~~ with `apply plugin: kotlin-parcelize`. The extensions plugin has been [deprecated by Google](https://goo.gle/kotlin-android-extensions-deprecation). The parcelize functionality has been extracted to a separate plugin. #### Public API Changes - `setEnableEMRTD(boolean enable)` has been removed from [NetverifySDK](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/NetverifySDK.html) - `recreate(Activity rootActivity)` has been added to [NetverifySDK](https://jumio.github.io/mobile-sdk-android/com/jumio/MobileSDK.html#recreate-android.app.Activity-) - this needs to be called in case the hosting activity that was passed in [`create`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/NetverifySDK.html#create-android.app.Activity-java.lang.String-java.lang.String-com.jumio.core.enums.JumioDataCenter-) is recreated. #### Custom UI Changes - [`NetverifyCustomSDKInterface$onNetverifyFinished`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/custom/NetverifyCustomSDKInterface.html#onNetverifyFinished-android.os.Bundle-) all parameters were replaced with a Bundle. The keys are defined as constants in the [`NetverifySDK.EXTRA_SCAN_REFERENCE`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/NetverifySDK.html): - [`EXTRA_SCAN_REFERENCE`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/NetverifySDK.html#EXTRA_SCAN_REFERENCE) - [`EXTRA_ACCOUNT_ID`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/NetverifySDK.html#EXTRA_ACCOUNT_ID) - [`EXTRA_SCAN_DATA`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/NetverifySDK.html#EXTRA_SCAN_DATA) - [`NetverifyCustomSDKInterface$onNetverifyError`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/custom/NetverifyCustomSDKInterface.html#onNetverifyError-java.lang.String-java.lang.String-boolean-java.lang.String-java.lang.String-) added an optional parameter `accountId` - New methods for handling host activity lifecycle changes have been added: - `recreate(Activity activity, NetverifyCustomSDKInterface netverifyCustomSDKInterface)` has been added to [NetverifyCustomSDKController](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/custom/NetverifyCustomSDKController.html#recreate-android.app.Activity-com.jumio.nv.custom.NetverifyCustomSDKInterface-) - this needs to be called in case the hosting activity is recreated. - `recreate(NetverifyCustomScanView scanView, NetverifyCustomConfirmationView confirmationView, NetverifyCustomScanInterface netverifyCustomScanInterface)` has been added to [NetverifyCustomScanPresenter](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/custom/NetverifyCustomScanPresenter.html#recreate-com.jumio.nv.custom.NetverifyCustomScanView-com.jumio.nv.custom.NetverifyCustomConfirmationView-com.jumio.nv.custom.NetverifyCustomScanInterface-) - this needs to be called in case the hosting activity is recreated. - The initialization and start of scan presenters has been split. This allows displaying a help view with the help animation prior to starting the scan presenter: - `startScanForPart(ScanSide scanSide, NetverifyCustomScanView scanView, NetverifyCustomConfirmationView confirmationView, NetverifyCustomScanInterface scanViewInterface` has been replaced with `initScanForPart(ScanSide scanSide, NetverifyCustomScanView scanView, NetverifyCustomConfirmationView confirmationView, NetverifyCustomScanInterface scanViewInterface)` - The following method was added to `NetverifyCustomScanPresenter` to trigger scanning start after the initialization. This method needs to be called on the `NetverifyCustomScanPresenter` after it was initialized with `initScanForPart(..)`. ``` /** * Starts a scan after a scan presenter has been initialized */ void startScan(); ``` - Make sure to display the `NetverifyCustomScanView` only AFTER calling `startScan()` as done in our [Sample](https://github.com/Jumio/mobile-sdk-android/blob/master/sample/JumioMobileSample/src/main/java/com/jumio/sample/kotlin/netverify/customui/NetverifyCustomScanFragment.kt), to ensure that the scan presenter is fully initialized and the camera callback `onNetverifyCameraAvailable()` will be fired. - ~~[`NetverifyScanMode.FACE`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/custom/NetverifyScanMode.html#FACE)~~ is replaced with - [`NetverifyScanMode.FACE_MANUAL`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/custom/NetverifyScanMode.html#FACE_MANUAL) for manual face scanning - [`NetverifyScanMode.FACE_IPROOV`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/custom/NetverifyScanMode.html#FACE_IPROOV) for face scanning with IProov - [`NetverifyScanMode.FACE_ZOOM`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/custom/NetverifyScanMode.html#FACE_ZOOM) for face scanning with Facetec ZoOm #### Jetifier adaptions Due to a bug in the Jetifier, the Bouncycastle library needs to be added to the Jetifiers ignorelist in the [`gradle.properties`](https://github.com/Jumio/mobile-sdk-android/blob/master/sample/JumioMobileSample/gradle.properties) ``` android.jetifier.blacklist=bcprov-jdk15on ``` Please note that the naming of this will change with the Android Gradle Plugin 4 release and will become `android.jetifier.ignorelist` ## 3.8.0 #### Dependency Changes - NEW AndroidX Kotlin Extension: `"androidx.core:core-ktx:1.3.1"` - NEW Kotlin dependency: `"org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.0"` - NEW Kotlin dependency: `"org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.0"` - NEW Kotlin plugin: `"apply plugin: 'kotlinx-serialization"` - NEW classpath definition: `"classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version"` - REPLACE Jumio Face: ~~`"com.jumio.android:face"`~~ with either: - `"com.jumio.android:iproov:3.8.0@aar"` and `implementation ("com.iproov.sdk:iproov:6.1.0"){ exclude group: 'org.json', module:'json' }` **or** - `"com.jumio.android:zoom:3.8.0@aar"` and `"com.facetec:zoom-authentication:8.12.1@aar"` - AndroidX ConstraintLayout update: ~~`"androidx.constraintlayout:constraintlayout:2.0.1"`~~ is replaced by `"androidx.constraintlayout:constraintlayout:2.0.4"` - AndroidX Appcompat update: ~~`"androidx.appcompat:appcompat:1.1.0"`~~ is replaced by `"androidx.appcompat:appcompat:1.2.0"` - Google Play Services update: ~~`"com.google.android.gms:play-services-vision:19.0.0"`~~ is replaced by `"com.google.android.gms:play-services-vision:20.1.2"` - Google Material Library update: ~~`"com.google.android.material:material:1.1.0"`~~ is replaced by `"com.google.android.material:material:1.2.1"` #### Custom UI Changes - [`NetverifyCustomSDKController$setDocumentConfiguration`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/custom/NetverifyCustomSDKController.html#setDocumentConfiguration-com.jumio.nv.custom.NetverifyCountry-com.jumio.nv.data.document.NVDocumentType-com.jumio.nv.data.document.NVDocumentVariant-) does not return a List with all required ScanSides anymore - they are now available as a parameter of [`NetverifyCustomSDKInterface$onNetverifyResourcesLoaded`](https://jumio.github.io/mobile-sdk-android/com/jumio/nv/custom/NetverifyCustomSDKInterface.html#onNetverifyResourcesLoaded-java.util.List-) - Method `onNetverifyPrepareScanning()` added to `NetverifyCustomScanInterface` - indicates that the SDK is now loading information #### Proguard Changes Added the line ` -keep public class com.iproov.sdk.IProov {public *; }` to consumer Proguard rules. #### Strings and Style Changes Several additions and changes, mostly in regards to the new liveness flow. - Button style: ~~` @style/Custom.Netverify.Confirmation.MaterialButton `~~ is replaced by `@style/Custom.Netverify.Confirmation.MaterialButton` - Button style: ~~` @style/Custom.Netverify.Confirmation.MaterialButton.Outlined`~~ is replaced by `@style/Custom.Netverify.Confirmation.MaterialButton.Outlined` - NEW IProov attribute: `@style/CustomIproov` - NEW IProov theme: ` ``` The actual name of the customized theme is arbitrary and can be chosen at will. Any customized theme needs to be added to the `AndroidManifest.xml` file by replacing the initial `Theme.Jumio`. ``` ``` ### Scan Overlay Is Not Displayed Make sure all necessary style attributes have been added to your custom theme specified in the `style.xml` file. In case of issues with scan overlay, all relevant attributes start with `jumio_scanOverlay` and `face_scanOverlay`. An overview of all style attributes [can be found here](https://github.com/Jumio/mobile-sdk-android/blob/master/sample/JumioMobileSample/src/main/res/values/styles.xml) ## Language Localization [`Jumio Android Localization`](../README_Android.md#language-localization) supports the [default Android localization features](https://developer.android.com/training/basics/supporting-devices/languages.html) for a number of different languages and cultures. Any language changes within the SDK or separate language support during runtime (meaning the SDK language differs from the overall device languages) are not possible. All label texts and button titles in the SDK can be changed and localized by adding the required Strings you want to change in a `strings.xml` file in a `values` directory for the language and culture preference that you want to support. All modifiable strings can be modified can be found [within our Sample application](https://github.com/Jumio/mobile-sdk-android/tree/master/sample/JumioMobileSample/src/main/res/values/strings-jumio-sdk.xml). Currently, the following languages are automatically supported for your convenience: [Supported languages](../README_Android.md#language-localization) Runtime language changes _within_ the SDK or separate language support (meaning the SDK language differs from the overall device languages) is not possible. All of the used string values can be found in the [sample project resource folder](https://github.com/Jumio/mobile-sdk-android/tree/master/sample/JumioMobileSample/src/main/res). If you want to [manage certain strings individually](https://developer.android.com/guide/topics/resources/localization#managing-strings), please access them in the **values-xx** folder that corresponds to the language. :::info The last two letters of the values folder (marked "xx" above) refer to the [ISO alpha-2 country code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2), which has to be used for the localization to work automatically. Please refer to the country list if you have trouble determining which string file contains to which language. ::: ### Accessibility Our SDK supports accessibility features. Visually impaired users can now enable **TalkBack** or increase the **text size** on their device. The accessibility-strings that are used by TalkBack contain _accessibility_ in their key and can be also modified in the `strings.xml`. ### String Updates For an overview of all updates and changes of SDK string keys please refer to [the revision history](https://github.com/Jumio/mobile-sdk-android/blame/master/sample/JumioMobileSample/src/main/res/values/strings.xml) on Github. ## Java 8 Compatibility Jumio SDK uses [Java 8 language.](https://developer.android.com/studio/write/java8-support.html) It is necessary to enable Java 8 source and target compatibility for in the `build.gradle` file using `compileOptions`: ``` android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } ``` ## Overview of Scanning Methods #### Autocapture Combines all previously existing scanning methods into one automatic, seamless experience.
Autocapture Start Autocapture Center Document Autocapture Hold Still Autocapture Checking Image
#### Manual Capture Manual scanning (taking a picture) using the shutterbutton, fallback option in case user is having trouble.
Manual Capture Empty Manual Capture Document
#### Enhanced Injection Detection You may see additional detection screens during the ID Scan process. This is expected behavior and is part of Jumio’s enhanced fraud protection measures.
enhanced_injection_detection_white_balance enhanced_injection_detection_focus
#### NFC Data extraction from eMRTD documents, for example passports.
NFC Help NFC Scanning
#### Linefinder (deprecated) **_As of SDK version 4.7.0 this module has been deprecated. Please use [Autocapture](https://github.com/Jumio/mobile-sdk-android/blob/master/docs/integration_faq.md#autocapture) instead._** Scanning using edge detection.
Linefinder Empty Linefinder Document Linefinder Processing
#### MRZ (deprecated) **_As of SDK version 4.7.0 this module has been deprecated. Please use [Autocapture](https://github.com/Jumio/mobile-sdk-android/blob/master/docs/integration_faq.md#autocapture) instead._** Data extraction from passports, some identity cards and some visas.
MRZ Empty MRZ Document
#### Barcode (deprecated) **_As of SDK version 4.7.0 this module has been deprecated. Please use [Autocapture](https://github.com/Jumio/mobile-sdk-android/blob/master/docs/integration_faq.md#autocapture) instead._** PDF417 barcode data extraction, for example from US and Canadian driver licenses.
Barcode Empty Barcode Document
## Glossary A [quick guide to commonly used abbreviations](integration_glossary.md) throughout the documentation which may not be all that familiar. ## Google Play Store Prominent Disclosure Some parts of the SDK might require prominent disclosure - please see the [Privacy Notice](integration_guide.md#privacy-notice) section in the Integration Guide for further details ## Packaging Options Multiple third party android libraries include the same meta files which will result in duplicates files during the build. To get rid of them the following packagingOptions can be added to the build.gradle file: ``` android { ... packagingOptions { ... resources.pickFirsts.add("META-INF/versions/9/OSGI-INF/MANIFEST.MF") resources.pickFirsts.add("META-INF/kotlin-project-structure-metadata.json") resources.pickFirsts.add("META-INF/kotlinx_coroutines_core.version") resources.excludes.add("META-INF/androidx/**/LICENSE.txt") resources.excludes.add("META-INF/LICENSE.md") resources.excludes.add("META-INF/LICENSE-notice.md") resources.excludes.add("commonMain/**/*") resources.excludes.add("linuxMain/**/*") resources.excludes.add("nativeMain/**/*") resources.excludes.add("nonJvmMain/**/*") ... } } ``` ## minSdkVersion 23 increases APK Size Starting with API level 23, the Android platform can read native libraries directly from the APK without extracting them to save storage space. Therefore native libraries are uncompressed when the minSdkVersion is 23 or up resulting in a much bigger apk size. To get the same behaviour as with minSdkVersion 21 builds you can add the following packagingOptions ``` android { ... packagingOptions { ... jniLibs.useLegacyPackaging true ... } } ``` ## Jumio Support The Jumio development team is constantly striving to optimize the size of our frameworks while increasing functionality, to improve your KYC and to fight fraud. If you have any further questions, please reach out to our [support team](mailto:support@jumio.com). --- # Changelog https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-android-master/docs/changelog ![Header Graphic](images/jumio_feature_graphic.jpg) [Improvement]: https://img.shields.io/badge/Improvement-green 'Improvement shield' [Change]: https://img.shields.io/badge/Change-blue 'Change shield' [Fix]: https://img.shields.io/badge/Fix-success 'Fix shield' # Change Log All notable changes, such as SDK releases, updates and fixes, are documented in this file. For detailed technical changes please refer to our [Transition Guide](transition_guide.md). ## Support Period Current SDK version: 4.18.0 Please refer to our [SDK maintenance and support policy](maintenance_policy.md) for more information about Mobile SDK maintenance and support. ## SDK Version: 4.18.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for Global Digital ID Acceptance. ![Improvement](https://img.shields.io/badge/Improvement-green) Added controls for limiting and preventing Manual Capture (ID and Selfie). ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for localized default consent links. ![Change](https://img.shields.io/badge/Change-blue) The SDK's minSdkVersion has been increased to 24 (Nougat). Please check the [Transition Guide](transition_guide.md) for details. ## SDK Version: 4.17.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for the [Selfie.Done](https://www.jumio.com/products/selfie-done/) workflow. ![Improvement](https://img.shields.io/badge/Improvement-green) Redesigned loading screens. ## SDK Version: 4.16.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Redesign of the ID Autocapture user experience. ![Improvement](https://img.shields.io/badge/Improvement-green) Support for image upload for DocProof workflows. ![Improvement](https://img.shields.io/badge/Improvement-green) Support for Liveness capture using back camera. ## SDK Version: 4.15.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for NFC read-only scanning. ![Improvement](https://img.shields.io/badge/Improvement-green) Introduced a configurable max retry count for NFC scanning. ![Improvement](https://img.shields.io/badge/Improvement-green) Included NFC scanning result status in transaction details via the Retrieval API. ![Improvement](https://img.shields.io/badge/Improvement-green) Enhanced user experience for NFC scanning with automatic NFC chip location detection. ## SDK Version: 4.14.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added enhanced virtual camera injection detection [ID Verification, Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for Digital Identity using eIDAS for selected countries [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Accessibility updates for compliance with WCAG 2.2 AA and EAA. ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for Digital Identity using eIDAS for selected countries [ID Verification] ![Fix](https://img.shields.io/badge/Fix-success) Added `kotlin.Pair` to `consumer-rules.pro` for SDK Wrapper ## SDK Version: 4.13.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for NFC Extraction of IDs ![Fix](https://img.shields.io/badge/Fix-success) Various bug fixes and improvements ## SDK Version: 4.12.1 ![Fix](https://img.shields.io/badge/Fix-success) Rare crashes in Jumio Liveness ![Fix](https://img.shields.io/badge/Fix-success) Liveness Images not available ![Fix](https://img.shields.io/badge/Fix-success) Issues with CameraX not selecting a Camera ## SDK Version: 4.12.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for Jumio Liveness Premium with enhanced deepfake detection [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for Brazilian Digital Driver's License [ID Verification] ![Fix](https://img.shields.io/badge/Fix-success) Multiple bug fixes and improvements ![Change](https://img.shields.io/badge/Change-blue) Updated Android sample application UI, transitioning from XML-based layouts to using Jetpack Compose ## SDK Version: 4.11.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added tilted image capture for frontside of ID documents. Enhanced checks of certain document security features [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added unsupported documents check to improve quality of extracted data and improve user experience [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added an updated Authentication Service [Selfie Verification] ![Fix](https://img.shields.io/badge/Fix-success) Fixed issues with code obfuscation ## SDK Version: 4.10.0 Added `kotlin.Pair` to `co ![Improvement](https://img.shields.io/badge/Improvement-green) Support for 4k Image capture. Improved ML model input, enhanced image and fraud checks [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added flash capture for frontside of ID documents. Enhanced checks of certain document security features [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Support for Serbian language, for both Cyrillic and Latin [ID Verification, Selfie Verification, Document Verification] ## SDK Version: 4.9.1 ![Fix](https://img.shields.io/badge/Fix-success) Fixed a rare issue that could lead to a crash when the SDK is recreated ## SDK Version: 4.9.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Automated document and country selection, powered by classifer ML model [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added possibility to pre-load required ML models. For more information checkout the according section in the [README](../README_Android.md#ml-models) [ID Verification, Identity Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Major UI Redesign [ID Verification, Selfie Verification, Document Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Improved Liveness retry logic. Prepared for granular instant feedback, if configured accordingly [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 9.0.3 [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for R8's `fullMode` for code shrinking and obfuscation ![Change](https://img.shields.io/badge/Change-blue) Removed Device Risk module from SDK [Selfie Verification] ## SDK Version: 4.8.2 ![Improvement](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 8.5.2 [Selfie Verification] ## SDK Version: 4.8.1 ![Fix](https://img.shields.io/badge/Fix-success) Removed Location handling to fix potential Google Play Store rejections ## SDK Version: 4.8.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Managing Liveness dependencies to help better conversion [Selfie Verification] ## SDK Version: 4.7.2 ![Improvement](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 8.5.2 [Selfie Verification] ## SDK Version: 4.7.1 ![Fix](https://img.shields.io/badge/Fix-success) Removed Location handling to fix potential Google Play Store rejections ## SDK Version: 4.7.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for [CameraX](https://developer.android.com/training/camerax) ![Improvement](https://img.shields.io/badge/Improvement-green) Datadog SDK version update to 2.0: Added possibility to have a dedicated Jumio Datadog instance ![Improvement](https://img.shields.io/badge/Improvement-green) Improved Jumio Liveness capturing experience [Selfie Verification] ![Change](https://img.shields.io/badge/Change-blue) Updated Jumio Liveness module [Selfie Verification] ![Change](https://img.shields.io/badge/Change-blue) Removed previous scanning functionalities, now all included in Autocapture functionality [ID Verification] ![Change](https://img.shields.io/badge/Change-blue) Removed Microblink barcode scanning, switched to MLkit [ID Verification] ![Fix](https://img.shields.io/badge/Fix-success) Fixed Liveness customization bug [Selfie Verification] ## SDK Version: 4.6.2 ![Improvement](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 8.5.2 [Selfie Verification] ## SDK Version: 4.6.1 ![Fix](https://img.shields.io/badge/Fix-success) Removed Location handling to fix potential Google Play Store rejections ## SDK Version: 4.6.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added Jumio Liveness module to enhance the Liveness user experience and interface (Selfie Verification) ![Improvement](https://img.shields.io/badge/Improvement-green) Improved Liveness customization options (Selfie Verification) ## SDK Version: 4.5.2 ![Improvement](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 8.5.2 [Selfie Verification] ## SDK Version: 4.5.1 ![Fix](https://img.shields.io/badge/Fix-success) Removed Location handling to fix potential Google Play Store rejections ## SDK Version: 4.5.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added possibility for users to verify their identity using [Digital Identity](../README_Android.md#digital-identity) [ID Verification, Identity Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 8.3.1 [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Improved user consent handling [ID Verification, Selfie Verification]
More details ### User consent User consent is now acquired for all users to ensure the accordance with biometric data protection laws. Please also refer to the [User Consent section](integration_faq.md#user-consent) in our FAQ.
![Fix](https://img.shields.io/badge/Fix-success) Bug fixes: UI bugs, passport scanning issue for certain countries [ID Verification] ## SDK Version: 4.4.2 ![Fix](https://img.shields.io/badge/Fix-success) Removed Location handling to fix potential Google Play Store rejections ## SDK Version: 4.4.1 ![Fix](https://img.shields.io/badge/Fix-success) Bug fix: Internal crashes for certain edge cases ## SDK Version: 4.4.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Fully redesigned ID Autocapture experience - seamless capturing, precise guidance and faster user journey [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Major iProov SDK version update to 8.0.3 - no more face scanning filter, improved UI and more customization options [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Mandatory NFC scanning option [ID Verification] ![Fix](https://img.shields.io/badge/Fix-success) Bug fixes: UI bugs, internal crashes ## SDK Version: 4.3.1 ![Fix](https://img.shields.io/badge/Fix-success) Removed Location handling to fix potential Google Play Store rejections ## SDK Version: 4.3.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Autocapture functionality (introduced in SDK 4.2.0) is no longer in beta stage [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) [Document Verification](../README_Android.md#document-verification) functionality added. ![Improvement](https://img.shields.io/badge/Improvement-green) Improved user guidance: Clear distinction between scanning frontside or backside of ID document [ID Verification] ![Change](https://img.shields.io/badge/Change-blue) iProov SDK version update to 7.5.0 [Selfie Verification] ![Change](https://img.shields.io/badge/Change-blue) The SDK's minSdkVersion has been increased to 21 (Lollipop). Please check the [Transition Guide](transition_guide.md) for details. ![Fix](https://img.shields.io/badge/Fix-success) UI bugs, internal crashes [Selfie Verification] ## SDK Version: 4.2.1 ![Fix](https://img.shields.io/badge/Fix-success) Removed Location handling to fix potential Google Play Store rejections ## SDK Version: 4.2.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Alignment of previously existing scanning method and improved user experience through addition of Autocapture module (Beta) [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Support for device fingerprint capability [ID Verification, Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Addition of NFC image extraction for similarity check [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Improved liveness customization: Centered Floating prompt for better user guidance during face scanning [Selfie Verification] ![Fix](https://img.shields.io/badge/Fix-success) Bug fixes: UI bugs, internal crashes ## SDK Version: 4.1.1 ![Fix](https://img.shields.io/badge/Fix-success) Removed Location handling to fix potential Google Play Store rejections ## SDK Version: 4.1.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Improved, granular user feedback for improved user experience and workflow through addition of Instant Feedback [ID Verification, Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Support for Dark Mode for DefaultUI and CustomUI [ID Verification, Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Addition of optional Datadog diagnostics module for monitoring SDK behavior and performance, as well as more efficient troubleshooting ![Change](https://img.shields.io/badge/Change-blue) iProov SDK version update to 7.2.0 [Selfie Verification] ![Fix](https://img.shields.io/badge/Fix-success) Bug fixes: UI bugs, security improvements, internal crashes ## SDK Version: 4.0.0 This is a complete rewrite of our SDK. The SDK was built with CustomUI as a basis and restructured to align Android and iOS to reduce overall complexity and integration effort. ![Improvement](https://img.shields.io/badge/Improvement-green) Improved security by switching to one-time authorization tokens for SDK initialization instead of relying on API token and secret ![Improvement](https://img.shields.io/badge/Improvement-green) Redesigned Default UI flow ![Improvement](https://img.shields.io/badge/Improvement-green) Slimline SDK configuration of only 1.8 MB size ![Improvement](https://img.shields.io/badge/Improvement-green) Improved data extraction via enhancing the SDK capabilities with server-side extraction capabilities ![Improvement](https://img.shields.io/badge/Improvement-green) Manual capture is now available as a fallback option for all other capture methods ## SDK Version: 3.9.5 ![Fix](https://img.shields.io/badge/Fix-success) Removed Location handling to fix potential Google Play Store rejections ## SDK Version: 3.9.4 ![Changes](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 6.4.3 [Selfie Verification] ## SDK Version: 3.9.3 ![Changes](https://img.shields.io/badge/Improvement-green) Internal dependency update [Selfie Verification] ## SDK Version: 3.9.2 ![Change](https://img.shields.io/badge/Change-blue) iProov SDK version update to 6.4.1, which improves performance and offers additional customization options [Selfie Verification] ## SDK Version: 3.9.1 ![Change](https://img.shields.io/badge/Change-blue) iProov SDK version update to 6.3.1, which fixes cross-dependency problems with OkHttp 4.x versions [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Improved customization options [Selfie Verification] ## SDK Version: 3.9.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Improved SDK lifecycle and state handling to reduce specific scenarios in which SDK crashes could have happened [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Improved retry guidance for Selfie Verification [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Improved customization options [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added more granular differentiations for `ScanMode` in CustomUI [Selfie Verification] ![Fix](https://img.shields.io/badge/Fix-success) Fixed rare issue that caused "Blur Hint" toast being displayed multiple times on certain devices [Selfie Verification] ![Fix](https://img.shields.io/badge/Fix-success) Fixed possible Camera Exception using CustomUI [ID Verification/Fastfill, Selfie Verification, Authentication] ![Fix](https://img.shields.io/badge/Fix-success) Fixed possible app crash when calling `NetverifyCustomSDKController.retry()` [ID Verification/Fastfill, Selfie Verification] ![Fix](https://img.shields.io/badge/Fix-success) Fixed Zoom Authentication 412 error handling, preventing user from getting stuck in certain scenarios [Selfie Verification] ![Change](https://img.shields.io/badge/Change-blue) Removed deprecated Android Kotlin plugins [ID Verification/Fastfill, Selfie Verification, Authentication, Document Verification] ![Change](https://img.shields.io/badge/Change-blue) iProov SDK version update to 6.3.0, which includes accuracy improvements using Liveness Assurance [Selfie Verification] ## SDK Version: 3.8.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added better guidance for devices with a fixed focal distance [ID Verification/Fastfill, Document Verification] ![Fix](https://img.shields.io/badge/Fix-success) Fixed crashes that could occur in edge cases [ID-Verification, Identity-Verification] ![Change](https://img.shields.io/badge/Change-blue) Added iProov as an additional liveness vendor to the [Jumio KYX platform](https://www.jumio.com/kyx/) [Selfie Verification] ## SDK Version: 3.7.3 ![Improvement](https://img.shields.io/badge/Improvement-green) New error code is returned in case an ad blocker or a firewall is detected [ID Verification/Fastfill, Authentication, Document Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added additional 3D Liveness customization options [ID Verification, Authentication] ![Fix](https://img.shields.io/badge/Fix-success) Fixed stroke color customization on negative action button [ID Verification/Fastfill, Authentication, Document Verification] ![Fix](https://img.shields.io/badge/Fix-success) Fixed compatibility issues caused by Firebase Performance Plugin. ## SDK Version: 3.7.2 ![Fix](https://img.shields.io/badge/Fix-success) Fixed a problem that face could not be captured anymore in certain cases [ID Verification Custom UI] ## SDK Version: 3.7.1 ![Fix](https://img.shields.io/badge/Fix-success) Fixed problem in handling the user consent [ID Verification, Authentication] ## SDK Version: 3.7.0 ![Change](https://img.shields.io/badge/Change-blue) Full redesign of NFC passport workflow [ID Verification] ![Change](https://img.shields.io/badge/Change-blue) Update to newest 3D Liveness technology [ID Verification, Authentication] ![Change](https://img.shields.io/badge/Change-blue) Adjusted Jumio logo and default color to reflect new Jumio appearance [ID Verification/Fastfill, Authentication, Document Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Support of 24 new languages [ID Verification/Fastfill, Authentication, Document Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Possibility to retrieve the captured images directly in the SDK [ID Verification/Fastfill] ## SDK Version: 3.6.2 ![Improvement](https://img.shields.io/badge/Improvement-green) Security enhancements [Netverify/Fastfill, Authentication, Document Verification, BAM Checkout] ## SDK Version: 3.6.1 ![Fix](https://img.shields.io/badge/Fix-success) Fixed wrong date parsing on magstripe encoded barcodes [Netverify/Fastfill] ## SDK Version: 3.6.0 ![Change](https://img.shields.io/badge/Change-blue) Added support for right-to-left languages [Netverify/Fastfill, Authentication, Document Verification] ![Change](https://img.shields.io/badge/Change-blue) Provide access to document guidance animation [Netverify Custom UI] ![Change](https://img.shields.io/badge/Change-blue) Advanced custom UI sample implementation [Netverify Custom UI Sample] ![Change](https://img.shields.io/badge/Change-blue) Adjusted handling of document types which don’t support plastic documents [Netverify] ![Improvement](https://img.shields.io/badge/Improvement-green) Support for 5 new languages (Czech, Greek, Hungarian, Polish, Romanian) [Netverify/Fastfill, Authentication, Document Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Improved accessibility handling [Netverify/Fastfill, Authentication, Document Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Reduced SDK size by ~1.5 MB [Netverify/Fastfill, Authentication, Document Verification, BAM Checkout] ![Fix](https://img.shields.io/badge/Fix-success) Various smaller bug fixes/improvements [Netverify/Fastfill, Authentication, Document Verification] ## Contact If you have any questions regarding our implementation guide please contact Jumio Customer Service at support@jumio.com. The Jumio online helpdesk contains a wealth of information regarding our service including demo videos, product descriptions, FAQs and other things that may help to get you started with Jumio. [Check it out at here.](https://support.jumio.com.) --- # Maintenance Policy https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-android-master/docs/maintenance_policy ![Header Graphic](images/jumio_feature_graphic.jpg) # Maintenance and Support Policy ## Overview This document outlines the maintenance policy for Jumio’s Software Development Kits (“SDKs”), including Mobile and Web SDK and their dependencies. Our SDK releases are published publicly as indicated in our documentation as well as to package managers. Documentation and sample implementations are available as source code on GitHub ([Android](https://github.com/Jumio/mobile-sdk-android) and [iOS](https://github.com/Jumio/mobile-sdk-ios)). We are consistently updating the Jumio SDKs in order to provide the best possible experience for you. Upgrading to the latest SDK version will not only ensure you benefit from various performance enhancements and bug fixes, but will also allow you to take advantage of new capabilities. All releases undergo comprehensive testing by our teams before being deployed. If you are using a Mobile SDK, please ensure your apps have been released and your end-users have updated before the End-of-Support date. Jumio does not provide support after the End-of-Support date. Customers should review the [Jumio Terms and Conditions](https://www.jumio.com/legal-information/privacy-notices/) for requirements related to the implementation of updates. ## Versioning Jumio SDK release versions are in the form of X.Y.Z: - X major version - very rarely updated - Y minor version - normally updated once in a quarter - Z patch version - updated on demand Major versions of Jumio’s SDKs are released rarely, and only in case of substantial changes to support new features and patterns. Breaking changes can happen in Major and Minor versions. Applications need to be updated in order for them to work with the newest SDK version. Breaking changes are highlighted in our [Android](https://github.com/Jumio/mobile-sdk-android) and [iOS](https://github.com/Jumio/mobile-sdk-ios) implementation guides for each release. Jumio will only provide patches or additional updates on the latest version regardless if it’s Major, Minor or Patch. ## SDK Version Lifecycle The life-cycle for SDK versions consists of these phases, which are outlined below: - **Developer Preview** (Phase 0) - During this phase, SDKs are not supported, must not be used in production environments, and are meant for early access and feedback purposes only. It is possible for future releases to introduce breaking changes. It can be alpha, beta, or release candidate. - **General availability / Full support** (Phase 1) - During this phase, SDKs are fully supported. Jumio will provide active support on this version and will provide required bug fixes or security fixes within new / upcoming versions (major, minor, patch). - **End-of-Support** (Phase 2) - Each SDK version reaches end of support 9 months after the release date. Issues that appear after the End-of-Support date will only be addressed in the upcoming SDK releases. Previously published releases will continue to be available via public package managers and the code will remain on GitHub. Use of an SDK that has reached End-of-Support is done at the business customers’ discretion. We recommend upgrading to the latest version. - **End-of-Life** (Phase 3) - By default, our SDK will reach the end of life 24 months after the release date. The SDK may continue to work but Jumio will no longer provide support or updates. Customers will be notified at least 3 months prior to the end of life of a product should it be less than 24 months. The following table is a visual representation of the SDK 4.x.x version life-cycle. ⚠️  SDK 3.x.x has reached its End-of-Life on December 31, 2023. | Version | Release | End of Support | End of Life | |:-------:|:-----------------:|:-----------------:|:-----------------:| | 4.18.0 | 10 July 2026 | 10 April 2027 | 10 July 2028 | | 4.17.0 | 16 March 2026 | 16 December 2026 | 16 March 2028 | | 4.16.0 | 11 February 2026 | 11 November 2026 | 11 February 2028 | | 4.15.0 | 10 October 2025 | 10 July 2026 | 10 October 2027 | | 4.14.0 | 3 September 2025 | 3 June 2026 | 3 September 2027 | | 4.13.0 | 3 April 2025 | 3 January 2026 | 3 April 2027 | | 4.12.1 | 14 January 2025 | 6 September 2025 | 6 December 2026 | | 4.12.0 | 6 December 2024 | 6 September 2025 | 6 December 2026 | | 4.11.0 | 20 August 2024 | 20 May 2025 | 20 August 2026 | | 4.10.0 | 5 June 2024 | 5 March 2025 | 5 June 2026 | | 4.9.1 | 3 April 2024 | 21 November 2024 | 21 February 2026 | | 4.9.0 | 21 February 2024 | 21 November 2024 | 21 February 2026 | | 4.8.2 | 7 March 2024 | 7 December 2024 | 7 March 2026 | | 4.8.1 | 23 October 2023 | 17 July 2024 | 17 October 2025 | | 4.8.0 | 17 October 2023 | 17 July 2024 | 17 October 2025 | | 4.7.2 | 7 March 2024 | 7 December 2024 | 7 March 2026 | | 4.7.1 | 23 October 2023 | 27 June 2024 | 27 September 2025 | | 4.7.0 | 27 September 2023 | 27 June 2024 | 27 September 2025 | | 4.6.2 | 7 March 2024 | 7 December 2024 | 7 March 2026 | | 4.6.1 | 23 October 2023 | 5 March 2024 | 5 June 2025 | | 4.6.0 | 5 June 2023 | 5 March 2024 | 5 June 2025 | | 4.5.2 | 7 March 2024 | 7 December 2024 | 7 March 2026 | | 4.5.1 | 23 October 2023 | 14 January 2024 | 14 April 2025 | | 4.5.0 | 14 April 2023 | 14 January 2024 | 14 April 2025 | | 4.4.2 | 23 October 2023 | 18 October 2023 | 18 January 2025 | | 4.4.1 | 18 January 2023 | 18 October 2023 | 18 January 2025 | | 4.4.0 | 20 December 2022 | 20 September 2023 | 20 December 2024 | | 4.3.1 | 23 October 2023 | 25 February 2023 | 25 May 2024 | | 4.3.0 | 30 August 2022 | 30 May 2023 | 30 August 2024 | | 4.2.1 | 23 October 2023 | 25 February 2023 | 25 May 2024 | | 4.2.0 | 25 May 2022 | 25 February 2023 | 25 May 2024 | | 4.1.1 | 23 October 2023 | 28 November 2022 | 28 February 2024 | | 4.1.0 | 28 February 2022 | 28 November 2022 | 28 February 2024 | | 4.0.0 | 16 November 2021 | 16 August 2022 | 16 November 2023 | ## Upgrade & Maintenance Practices - Follow Semantic Versioning and test updates in staging. - Monitor documentation (https://github.com/Jumio/{Platform}/releases) for changes and depreciation notices. - Perform regression testing after upgrades. ## Troubleshooting - Share workflowExecutionId, app version, OS, device, timestamp, and screenshots with support. --- # Native iOS SDK https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-ios-master/README_iOS ![Jumio](docs/images/jumio_feature_graphic.jpg)
Version API Doc License Platform Pod Version Carthage SPM Carthage
## Overview The Jumio Software Development Kit (SDK) provides you with a set of tools and UIs (default or custom) to develop an iOS application perfectly fitted to your specific needs. Onboard new users and easily verify their digital identities, by making sure the IDs provided by them are valid and authentic. Extract data from ID documents completely automatically and within seconds. Confirm users really are who they say they are by having them take a quick selfie and match it to their respective documents. Jumio uses cutting-edge biometric technology to make sure there is an actual, real-life person in front of the screen. ![SDK Overview](docs/images/images_overview/images_overview.png) Using the Jumio SDK will allow you to create the best possible solution for your individual needs, providing you with a range of different services to choose from. --- # Get Started Please note that [basic setup](#basics) is required before continuing with the integration of any of the following services. ## Jumio SDK Integration Jumio KYX platform and related services are a secure and easy solution that allows you to establish the genuine identity of your users in your mobile application, by verifying their passports, government-issued IDs and actual liveness in real-time. Very user-friendly and highly customizable, it makes onboarding new customers quick and simple. :arrow_right:  [SDK INTEGRATION GUIDE](docs/integration_guide.md) :arrow_right:  [Changelog](docs/changelog.md) :arrow_right:  [Transition Guide](docs/transition_guide.md) #### Previous SDK Versions If you need information on older SDK versions, please refer to: - [3.9.4](https://github.com/Jumio/mobile-sdk-ios/tree/v3.9.4) - [3.9.3](https://github.com/Jumio/mobile-sdk-ios/tree/v3.9.3) - [3.9.2](https://github.com/Jumio/mobile-sdk-ios/tree/v3.9.2) - [3.9.1](https://github.com/Jumio/mobile-sdk-ios/tree/v3.9.1) - [3.9.0](https://github.com/Jumio/mobile-sdk-ios/tree/v3.9.0) ## Code Documentation Full API documentation for the Jumio iOS SDK can be found [here](https://jumio.github.io/mobile-sdk-ios/Jumio). ## FAQ Link to Jumio iOS SDK FAQ can be found [here](docs/integration_faq.md). ## Known Issues List of known issues can be found [here](docs/known_issues.md). --- # Quickstart This section provides a quick overview on how to get started with the [iOS sample application](https://github.com/Jumio/mobile-sdk-ios/tree/master/sample) that can be found here on Github. You will require a **commercial Jumio License** to successfully run any of our examples; for details, contact sales@jumio.com. You will also need a current Xcode version to open and try out the sample project. Start by downloading the iOS sample application from the Jumio Github repo. You can do this either by cloning the repo (using SHH oder HTTPS) to your local device or simply downloading everything as a ZIP. Once you’ve got the sample application downloaded and unzipped if necessary, open Xcode. You’ll be faced with a couple of options. Choose **Open another project** in the bottom right corner and navigate to where you’ve saved your sample application. Select the **SampleApp.xcodeproj** and open it. You also have the option of simply starting Xcode and choosing the option **Clone an existing project** in the left-hand menu. In this case, you’ll need to add the URL of the [entire repository on Github](https://github.com/Jumio/mobile-sdk-ios). If prompted, choose **master** and start cloning to your local device. When the cloning is done, once again just choose the **SampleApp.xcodeproj** and open it. **Note:** Our sample project on GitHub contains the sample implementation without our frameworks. The project contains a pre-action run script `jumio-sdk-checkout.sh`, which downloads our frameworks automatically during build time. The iOS sample application contains two packages `CustomUI` and `DefaultUI`, as well as Delegates and the classes `ViewController.swift` and `ResultViewController.swift`. Use the ViewController class to either start CustomUI or DefaultUI by using a valid SDK token and data center. If you haven't done so already, please refer to the [Authentication and Encryption section](#authentication-and-encryption) for more details on how to obtain your SDK token. Add your individual SDK token instead of the placeholder `""`. The default setting for the data center is `JumioDataCenter.US`. ⚠️  **Note:** We strongly recommend not storing any credentials inside your app! We suggest loading them during runtime from your server-side implementation. In the `DefaultUI` package, you will find the class `DefaultUI.swift`. In the `CustomUI` package you will find: - `ViewController` containing several ViewController classes - `Handling` containing `ControllerHandling.swift`, `CredentialHandling.swift` and `ScanPartHandling.swift` - `CustomUINavigationController.swift` In each class, the most important methods for this service is shown and quickly outlined. Once you start up the sample application, you'll be given the option of trying out the Jumio SDK. Select a service from the action bar at the bottom to try out different services. Your application will also need camera permission, which will be prompted for automatically once you try to start any of services. ⚠️  **Note:** We only support the Jumio SDK on physical devices. The app will compile on simulator, but you won't be able to run the SDK. --- # Basics ## General Requirements The minimum requirements for the SDK are: - iOS 13.0 and higher - Internet connection - Jumio KYX or Jumio API v3 The following architectures are supported in the SDK: - device: arm64 - simulator: arm64 x86_64 ## Authentication and Encryption ℹ️  **As of version 4.0.0 and onward, the SDK can only be used in combination with Jumio KYX or Jumio API v3. API v2 as well as using API token and secret to authenticate against the SDK will no longer be compatible.** Before starting a session in our SDK, an SDK token has to be obtained. Refer to out [API Guide](https://documentation.jumio.ai/docs/developer-resources/API/Integration_Intro) for further details. To authenticate against the API calls, an OAuth2 access token needs to be retrieved from the Jumio Portal. Within the response of the [Account Creation or Account Update](https://documentation.jumio.ai/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts) API, an SDK token is returned, which needs to be applied to initiate the mobile SDK. ### Authentication with OAuth2 Your OAuth2 credentials are constructed using your API token as the Client ID and your API secret as the Client secret. You can view and manage your API token and secret in the Jumio Portal under: - **Settings > API credentials > OAuth2 Clients** Client ID and Client secret are used to generate an OAuth2 access token. OAuth2 has to be activated for your account. Contact your Jumio Account Manager for activation. #### Access Token URL (OAuth2) - US: `https://auth.amer-1.jumio.ai/oauth2/token` - EU: `https://auth.emea-1.jumio.ai/oauth2/token` - SG: `https://auth.apac-1.jumio.ai/oauth2/token` The [TLS Protocol](https://tools.ietf.org/html/rfc5246) is required to securely transmit your data, and we strongly recommend using the latest version. For information on cipher suites supported by Jumio during the TLS handshake see [supported cipher suites](https://documentation.jumio.ai/docs/developer-resources/API/integration-prerequisites#supported-cipher-suites). ℹ️   Calls with missing, incorrect or suspicious headers or parameter values will result in HTTP status code **400 Bad Request Error** or **403 Forbidden** #### Request Access Token (OAuth2) ``` curl --request POST --location 'https://auth.amer-1.jumio.ai/oauth2/token' \ --header 'Accept: application/json' \ --header 'Content-Type: application/x-www-form-urlencoded' \ --data-raw 'grant_type=client_credentials' \ --basic --user CLIENT_ID:CLIENT_SECRET ``` #### Response Access Token (OAuth2) ``` { "access_token": "YOUR_ACCESS_TOKEN", "expires_in": 3600, "token_type": "Bearer" } ``` #### Access Token Timeout (OAuth2) Your OAuth2 access token is valid for 60 minutes. After the token lifetime is expired, it is necessary to generate a new access token. ### Workflow Transaction Token Timeout The token lifetime is set to 30 minutes per default. It can be configured via the [Jumio Portal](https://documentation.jumio.ai/docs/portals/welcome_to_the_jumio_portal) and can be overwritten using the API call (`tokenLifetime`). Within this token lifetime the token can be used to initialize the SDK. As soon as the workflow (transaction) starts, a 15 minutes session timeout is triggered. For each action performed (capture image, upload image) the session timeout will reset, and the 15 minutes will start again. After creating/updating a new account you will receive a `sdk.token` (JWT) for initializing the SDK. Use this SDK token with your iOS code: ``` sdk = Jumio.SDK() sdk.token = "YOUR_SDK_TOKEN" sdk.dataCenter = jumioDataCenter ``` ## Permissions The app’s Info.plist must contain the `NSCameraUsageDescription` key with a string value explaining to the user how the app uses this data. Example: _“This will allow `` to take photos of your credentials."_ ## Integration The [SDK Setup Tool](https://jumio.github.io/mobile-configuration-tool/out/) is a web tool that helps determine available product combinations and corresponding dependencies for the Jumio SDK, as well as an export feature to easily import the applied changes straight into your codebase. [![Jumio Setup](docs/images/setup_tool.png)](https://jumio.github.io/mobile-configuration-tool/out/) Additionally, check out the [Xcode sample project](https://github.com/Jumio/mobile-sdk-ios/tree/master/sample) to learn the most common use. Make sure to use the device only-frameworks for app submissions to the AppStore. Read more detailed information on this here: [Manual integration](docs/integration_guide.md#manually) ## App Thinning and Size Matters App thinning (app slicing, bitcode and on-demand resources) is supported within the SDK. For app slicing, the image resources are placed within a xcassets collection. For ID Verification, some resource files (e.g. images) are loaded on demand. ## Language Localization Our SDK supports localization for different languages. All label texts and button titles can be changed and localized using the `Localizable-Jumio.strings` file. Just adapt the values to your required language, add it to your app or framework project and mark it as Localizable. This way, when upgrading our SDK to a newer version your localization file won't be overwritten. Make sure, that the content of this localization file is up to date after an SDK update. ℹ️  **Note:** If using CocoaPods, the original file is located under `/Pods/Jumio/Localizations`. ℹ️  **Note:** If using Swift Package Manager, make sure to add your supported languages in the Info.plist under the CFBundleLocalizations key. Jumio SDK products support following languages for your convenience: _Afrikaans, Arabic, Bulgarian, Burmese, Chinese (Simplified), Chinese (Traditional), Croatian, Czech, Danish, Dutch, Estonian, English, Finnish, French, German, Greek, Hindi, Hungarian, Indonesian, Italian, Japanese, Khmer, Korean, Latvian, Lithuanian, Maltese, Norwegian, Polish, Portuguese (Portugal), Portuguese (Brazil), Romanian, Russian, Serbian (Cyril), Serbian (Latin), Slovak, Slovenian, Spanish, Swedish, Thai, Turkish, Ukrainian, Vietnamese, Zulu_ Please check out our [sample project](https://github.com/Jumio/mobile-sdk-ios/tree/master/sample) to see how to use the strings files in your app. Our SDK supports accessibility features. Visually impaired users can enable **VoiceOver** or increase **text size** on their device. VoiceOver uses separate values in the localization file, which can be customized. --- # ML Models The Jumio SDK utilizes ML Models to enable client-/server-side verification. Required models can be provided by downloading and adding them manually to the bundle or preloading them. The SDK will load them on demand if none of the previous is applied. Loading the models in advance will improve startup time of the SDK. For more details, please refer to our [integration guide](docs/integration_guide.md#ml-models). --- # Document Verification As of iOS SDK 4.3.0, Document Verification functionality is available. This functionality allows users to submit a number of different document types (e.g. a utility bill or bank statement) in digital form and verify the validity and authenticity of this document. Documents can be submitted using one of two ways: Taking a photo of the document or uploading a file. For more details, please refer to our [integration guide](docs/integration_guide.md#jumio-document-credential). ### Supported Documents: - BC (Birth certificate) - BS (Bank statement) - CAAP (Cash advance application) - CB (Council bill) - CC (Credit card) - CCS (Credit card statement) - CRC (Corporate resolution certificate) - CUSTOM (Custom document type) - HCC (Health care card) - IC (Insurance card) - LAG (Lease agreement) - LOAP (Loan application) - MEDC (Medicare card) - MOAP (Mortgage application) - PB (Phone bill) - SEL (School enrollment letter) - SENC (Seniors card) - SS (Superannuation statement) - SSC (Social security card) - STUC (Student card) - TAC (Trade association card) - TR (Tax return) - UB (Utility bill) - VC (Voided check) - VT (Vehicle title) - WWCC (Working with children check) ℹ️  **Note:** To enable the use of this feature, please contact [Jumio support](https://support.jumio.com). --- # Digital Identity As of Jumio iOS SDK 4.5.0, users may use their Digital Identity to verify their identity. For now, 'Brazil CNH-e PDF', 'ID by Mastercard' and 'eIDAS' are the only Digital Identity providers supported by our SDK. If you want to enable Digital Identity verification for your account please [contact us](https://support.jumio.com). In case you are already set up to use Digital Identity verificaiton within your app, check out the integration steps explained [here](docs/integration_guide.md#digital-identity-setup). --- # Security All SDK related traffic is sent over HTTPS using TLS and public key pinning, and additionally, the information itself within the transmission is also encrypted utilizing **Application Layer Encryption** (ALE). ALE is Jumio custom-designed security protocol which utilizes RSA-OAEP and AES-256 to ensure that the data cannot be read or manipulated even if the traffic was captured. --- # Release Notes Please refer to our [Change Log](docs/changelog.md) for more information about our current SDK version and further details. # Maintenance and Support Please refer to our [SDK maintenance and support policy](docs/maintenance_policy.md) for more information about Mobile SDK maintenance and support. ## Two-factor Authentication If you want to enable two-factor authentication for your Jumio Portal account [please contact us.](https://support.jumio.com). Once enabled, users will be guided through the setup upon their first login to obtain a security code using the "Google Authenticator" app. ## Licenses The source code and software available on this website (“Software”) is provided by Jumio Corporation or its affiliated group companies (“Jumio”) “as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall Jumio be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including but not limited to procurement of substitute goods or services, loss of use, data, profits, or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this Software, even if advised of the possibility of such damage. In any case, your use of this Software is subject to the terms and conditions that apply to your contractual relationship with Jumio. As regards Jumio’s privacy practices, please see our privacy notice available here: [Privacy Policy](https://www.jumio.com/privacy-center/privacy-notices/online-services-notice/). The software contains third-party open source software. For more information, please see [licenses](licenses). This software is based in part on the work of the Independent JPEG Group. ## Contact If you have any questions regarding our implementation guide please contact Jumio Customer Service at support@jumio.com. The Jumio online helpdesk contains a wealth of information regarding our service including demo videos, product descriptions, FAQs and other things that may help to get you started with Jumio. [Check it out at here](https://support.jumio.com). ## Copyright © Jumio Corporation, 100 Mathilda Place Suite 100 Sunnyvale, CA 94086 --- # Integration Guide https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-ios-master/docs/integration_guide ![Header Graphic](images/jumio_feature_graphic.jpg) # Integration Guide for iOS SDK Jumio’s products allow businesses to establish the genuine identity of their users by verifying government-issued IDs in real-time. ID Verification, Selfie Verification and other services are used by financial service organizations and other leading brands to create trust for safe onboarding, money transfers and user authentication. ## Release Notes Please refer to our [Change Log](changelog.md) for more information. Current SDK version: **4.18.0** For technical changes that should be considered when updating the SDK, please read our [Transition Guide](transition_guide.md). ## Code Documentation Full API documentation for the Jumio iOS SDK can be found [here](https://jumio.github.io/mobile-sdk-ios/Jumio). ## Setup The [basic setup](../README_iOS.md#basics) is required before continuing with the following setup for the Jumio SDK. If you are updating your SDK to a newer version, please also refer to: :arrow_right:  [Changelog](changelog.md) :arrow_right:  [Transition Guide](transition_guide.md) ### Dependencies #### Via Cocoapods Jumio supports CocoaPods as dependency management tool for easy integration of the SDK. You are required to use **Cocoapods 1.11.0** or newer. If you are not yet using Cocoapods in your project, first run: ``` sudo gem install cocoapods pod init ``` Then update your local clone of the specs repo in Terminal to ensure that you are using the latest podspec files using: ``` pod repo update ``` Adapt your Podfile and add the pods according to the product(s) you want use. Check the following example how a Podfile could look like, with a list of all available Jumio pods: :::note Please do not include everything! Make sure to **only** use pods that provide to the services you need! It's only possible to add 1 core functionality, but as many addons as needed. ::: ``` source 'https://github.com/CocoaPods/Specs.git' platform :ios, '13.0' use_frameworks! # Required for proper framework handling #Core (always add): pod 'Jumio/Jumio', '~>4.18.0' # Manual & DocFinder Capture #Addons: pod 'Jumio/Liveness', '~>4.18.0' # Liveness functionality pod 'Jumio/DefaultUI', '~>4.18.0' # Default UI functionality pod 'Jumio/NFC', '~>4.18.0' # NFC functionality #All: pod 'Jumio/All', '~>4.18.0' # All Jumio products with all available scanning methods ``` #### Via Swift Package Manager Jumio supports Swift Package Manager for easy integration of the SDK for version **4.4.0 and above**. To integrate the Jumio SDK with Swift Package Manager, add this [repo](https://github.com/Jumio/mobile-sdk-ios.git) as a dependency to your project. The Jumio SDK contains five different targets. Add them to your project based on the functionality that you need in your application. ``` #Core (always add): Jumio # Manual & DocFinder Capture #Addons: JumioLiveness # Jumio liveness functionality JumioDefaultUI # Default UI functionality JumioNFC # NFC functionality JumioLocalization # Adds strings for localization ``` #### Via Carthage Starting from SDK 4.5.0 Jumio supports Carthage as dependency management tool for easy integration of the SDK. Adapt you Cartfile and add Jumio dependencies. Check the following example how a Cartfile could look like: ``` #Core (always add): binary "https://raw.githubusercontent.com/Jumio/mobile-sdk-ios/master/Carthage/Jumio.json" == 4.18.0 #Addons: binary "https://raw.githubusercontent.com/Jumio/mobile-sdk-ios/master/Carthage/JumioLiveness.json" == 4.18.0 binary "https://raw.githubusercontent.com/Jumio/mobile-sdk-ios/master/Carthage/JumioDefaultUI.json" == 4.18.0 binary "https://raw.githubusercontent.com/Jumio/mobile-sdk-ios/master/Carthage/JumioNFC.json" == 4.18.0 ``` Update you Carthage dependencies via Terminal: ``` carthage update --use-xcframeworks ``` ### Manually Download our frameworks manually via [ios-jumio-mobile-sdk-4.18.0.zip](https://repo.mobile.jumio.ai/com/jumio/ios/jumio-mobile-sdk/4.18.0/ios-jumio-mobile-sdk-4.18.0.zip). :::note Our sample project on GitHub contains the sample implementation without our frameworks. The project file contains a “Run Script Phase” which downloads our frameworks automatically during build time. ::: The Jumio Mobile SDK consists of several dynamic frameworks. Depending on which product you use, you'll have to add the right frameworks to your project. Please see [Strip unused frameworks](integration_faq.md#strip-unused-frameworks) for more information. Add the following linker flags to your Xcode Build Settings: :::note Added automatically if using CocoaPods. ::: - "-lc++" - "-ObjC" (recommended) or -all_load Make sure that the following Xcode build settings in your app are set accordingly: | Setting | Value | | :---------------------------- | :---: | | Link Frameworks Automatically | YES | ### SDK Version Check Use [`Jumio.SDK.version`][sdkVersion] to check which SDK version is being used. ### Device & App Integrity We strongly suggest to run the SDK only on uncompromised devices and in untampered apps. We advise the following checks and settings to further hinder attackers from modifying the SDKs behaviour. #### Jailbreak Detection For security reasons, applications implementing the SDK should not run on jailbroken devices. We strongly advise to add a self-devised check to prevent users from running the SDK on jailbroken devices. We provide the below method [`isJailbroken`][isJailbroken] as a fallback mechanism. ``` Jumio.SDK.isJailbroken ``` ⚠️  __Note:__ Please be aware that this jailbreak check uses various lightweight mechanisms for detection and doesn't guarantee to detect 100% of all jailbroken devices. #### Build Settings For security reasons, you should set the following build settings: Activate the Enhanced Security capability and check "Enable Additional Runtime Platform Restrictions" and "Enable-Read-only Platform Memory" to leverage the platform's advanced hardening features. To generate a position independent executable, the build settings "Generate Position-Dependent Executable" and "Generate Position-Dependent Code" should both be set to "No". For Objective-C projects, you should enable stack canaries by adding "-fstack-protector-all" to "Other C Flags". For Objective-C projects, you should set "Objective-C Automatic Reference Counting" to "Yes". #### App Attest Use App Attest to check whether an attacker modified the binary of your application before installing it. We suggest to sign API token requests with App Attest and to return tokens only to legitimate applications. #### Deny Debugger Usage We recommend to deny debugging of publicly released apps. We published a [Guide](https://medium.com/jumio/the-invisible-shield-implementing-low-level-anti-debugging-in-ios-1a70a905c318), which provides detailed instructions on how to prevent attackers from debugging your app. ### NFC Setup To make our SDK capable of reading NFC chips you will need to set the following settings: Add the Near Field Communication Tag Reading capability to your project, App ID and provisioning profiles in [Apple Developer portal](https://developer.apple.com). Add `NFCReaderUsageDescription` to your **info.plist** file with a proper description of why you are using this feature. You will also need to add the following key and value to your plist file to be able to read NFC chips from passports and identity cards: ``` com.apple.developer.nfc.readersession.iso7816.select-identifiers A0000002471001 ``` ### Digital Identity Setup Over the course of Digital Identity verification with 'ID by Mastercard' the SDK will launch an according third party application representing your Digital Identity. Communication between both applications (your integrating application and the Digital Identity application) is done via a so-called "deep link". #### Deep link setup To enable your app specific deep link, our support team has to setup an according scheme of your choice for you. This scheme will be used by the SDK to identify your application while returning from the Digital Identity provider's application. For the scheme basically any string can be used, however it is recommended that it is unique to your application in some way. Following snippet shows how the deep link needs to be setup in your application's `AppDelegate.swift` file: ```swift func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool{ guard Jumio.SDK.handleDeeplinkURL(url) else { return false } return true } ``` #### Other Digital Identity providers Other Digital Identity providers, like 'Brazil CNH-e PDF' or 'eIDAS', stay within the app. Follow [Jumio ID Credential](#jumio-id-credential) and implement the [Scan Steps](#scan-steps) needed for the [`Jumio.Scan.Mode`][jumioScanMode] `digital`. ### Risk Signal: Device Risk If you want to include risk signals into your application, please check our [Risk Signal guide](https://documentation.jumio.ai/docs/references/riskSignals/deviceRiskCheck/deviceRisk). #### Iovation setup To integrate the device risk vendor Iovation into your application, please follow the [Iovation integration guide](https://github.com/iovation/deviceprint-SDK-iOS). #### API call To provide Jumio with the generated Device Risk blackbox, please follow the [Device Risk API guide](https://documentation.jumio.ai/docs/references/riskSignals/deviceRiskCheck/deviceRiskwithMobileSDK). --- ## ML Models By default, required models get downloaded by the SDK if not provided via the bundle or preloaded. ### Bundling models in the app You can download our encrypted models and add them to your bundle for the following frameworks. ⚠️  **Note:** Make sure not to alter the downloaded models (name or content) before adding them to your bundle. #### ID Verification You can find the models required for the [`Jumio.Scan.Mode`][jumioScanMode] `docFinder` [here](https://cdn.mobile.jumio.ai/ios/model/mobile-classifier-model-1.0.0.enc) and [here](https://cdn.mobile.jumio.ai/ios/model/docfinderModel_121923.enc). #### Liveness If you are using JumioLiveness.xcframework, find the required models [here](https://cdn.mobile.jumio.ai/ios/model/liveness_sdk_assets_v_1_1_5.enc). ### Preloading models In version `4.9.0` we introduced the [`Jumio.Preloader`][jumioPreloader]jumioPreloader. It provides functionality to preload models without the JumioSDK being initialized. To do so call: ```swift Jumio.Preloader.shared.preloadIfNeeded() ``` The [`Jumio.Preloader`][jumioPreloader] will identify which models are required based on your configuration. Preloaded models are cached so they will not be downloaded again. To clean the models call: ```swift Jumio.Preloader.clean() ``` ⚠️  **Note:** `clean` should never be called while the SDK is running. To get notified that preloading has finished, you can implement the [`Jumio.Preloader.Delegate`][jumioPreloaderDelegate] methods and set the delegate as follows: ```swift Jumio.Preloader.shared.delegate = {your delegate} ``` --- ## Initialization Your OAuth2 credentials are constructed using your previous API token as the Client ID and your previous API secret as the Client secret. You can view and manage your Client ID and secret in the Jumio Portal under: - **Settings > API credentials > OAuth2 Clients** Client ID and Client secret are used to generate an OAuth2 access token. OAuth2 has to be activated for your account. Contact your Jumio Account Manager for activation. Send a workflow request using the acquired OAuth2 access token to receive the SDK token necessary to initialize the Jumio SDK. For more details, please refer to [Authentication and Encryption](../README_iOS.md#authentication-and-encryption). ``` sdk = Jumio.SDK() sdk.token = "YOUR_SDK_TOKEN" sdk.dataCenter = jumioDataCenter ``` Make sure that your SDK token is correct. If it isn't, an exception will be thrown. Then provide a reference to identify the scans in your reports (max. 100 characters or `null`). Data center is set to `JumioDataCenter.US` by default. If your customer account is in the EU data center, use `JumioDataCenter.EU` instead. Alternatively, use `JumioDataCenter.SG` for Singapore. ⚠️  **Note:** We strongly recommend storing all credentials outside of your app! We suggest loading them during runtime from your server-side implementation. Make sure initialization and presentation are timely within one minute. On iPads, the presentation style `UIModalPresentationFormSheet` is default and mandatory. ``` self.present(jumioViewController, animated: true, completion: nil) ``` ## Configuration Every Jumio SDK instance is initialized using a specific [`sdk.token`][token]. This token contains information about the workflow, credentials, transaction identifiers and other parameters. Configuration of this token allows you to provide your own internal tracking information for the user and their transaction, specify what user information is captured and by which method, as well as preset options to enhance the user journey. Values configured within the [`sdk.token`][token] during your API request will override any corresponding settings configured in the Jumio Portal. ### Session Initialization Best Practices - Generate SDK tokens just-in-time before SDK launch. - Implement backend-controlled retry logic. - Use reportingCriteria and Customer Internal Reference for tracking. - Ensure runtime permissions are granted before launch. ### Workflow Selection Use ID verification callback to receive a verification status and verified data positions (see [Callback section](https://documentation.jumio.ai/docs/developer-resources/callback)). Make sure that your customer account is enabled to use this feature. A callback URL can be specified for individual transactions (for URL constraints see chapter **Jumio Callback IP Addresses**). This setting overrides any callback URL you have set in the Jumio Portal. Your callback URL must not contain sensitive data like PII (Personally Identifiable Information) or account login. Set your callback URL using the `callbackUrl` parameter. Use the correct [workflow definition key](https://documentation.jumio.ai/docs/references/servicesAndworkflow/standardService/standardServices) in order to request a specific workflow. Set your key using the `workflowDefinition.key` parameter. ``` '{ "customerInternalReference": "CUSTOMER_REFERENCE", "workflowDefinition": { "key": X, }, "callbackUrl": "YOUR_CALLBACK_URL" }' ``` For more details, please refer to our [Workflow Description Guide](https://documentation.jumio.ai/docs/references/servicesAndworkflow/standardService/standardServices). ### Transaction Identifiers There are several options in order to uniquely identify specific transactions. `customerInternalReference` allows you to specify your own unique identifier for a certain scan (max. 100 characters). Use `reportingCriteria`, to identify the scan in your reports (max. 100 characters). You can also set a unique identifier for each user using `userReference` (max. 100 characters). For more details, please refer to **Request Body** section in our [KYX Guide](https://documentation.jumio.ai/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts). ``` '{ "customerInternalReference": "CUSTOMER_REFERENCE", "workflowDefinition": { "key": X, }, "reportingCriteria": "YOUR_REPORTING_CRITERIA", "userReference": "YOUR_USER_REFERENCE" }' ``` ⚠️  **Note:** Transaction identifiers must not contain sensitive data like PII (Personally Identifiable Information) or account login. ### Preselection You can specify issuing country using [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) country codes, as well as ID types to skip selection during the scanning process. In the example down below, Austria ("AUT") and the USA ("USA") have been preselected. PASSPORT and DRIVER_LICENSE have been chosen as preselected document types. If all parameters are preselected and valid and there is only one given combination (one country and one document type), the document selection screen in the SDK can be skipped entirely. For more details, please refer to **Request Body** section in our [KYX Guide](https://documentation.jumio.ai/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts). ``` '{ "customerInternalReference": "CUSTOMER_REFERENCE", "workflowDefinition": { "key": X, "credentials": [ { "category": "ID", "type": { "values": ["DRIVING_LICENSE", "PASSPORT"] }, "country": { "values": ["AUT", "USA"] } } ] } }' ``` Digital Identity documents can also be preselected by specifying `"DIGITAL_IDENTITY"` as the type. To narrow down to a specific digital identity subtype, use the optional `"subType"` field with a single value. Supported subtypes are: `EIDAS`, `DIGITAL_DRIVING_LICENSE_PDF`. If only one digital identity type is available for the preselected country (and no physical documents), the document selection screen in the SDK can be skipped entirely. ```json { "customerInternalReference": "CUSTOMER_REFERENCE", "workflowDefinition": { "key": X, "credentials": [ { "category": "ID", "type": { "values": [ "DIGITAL_IDENTITY" ] }, "subType": { "values": [ "EIDAS" ] }, "country": { "values": [ "AUT" ] } } ] } } ``` ### Camera Handling Use [`cameraFacing`][cameraFacing] attribute of [`Jumio.Scan.View`][jumioScanView] to configure the default camera and set it to `front` or `back`. ``` scanView.cameraFacing = .front ``` Use boolean [`hasFlash`][hasFlash] of [`Jumio.Scan.View`][jumioScanView] to see if flash is available for the current device camera. Use boolean [`flash`][flash] to toggle the camera flash. ## SDK Workflow Implement the delegate methods of the [`DefaultUIDelegate`][defaultUIDelegate] protocol to be notified of successful initialization, successful scans, and errors. Dismiss the [`Jumio.ViewController`][jumioViewController] instance in your app in case of success or error. ### Initialization When this method is fired, the SDK has finished initialization and loading tasks, and is ready to use. The error object is only set when an error has occurred (e.g. wrong credentials are set or a network error occurred). ``` sdk.startDefaultUI() ``` ### Success Upon success, the extracted document data is returned within a [`Jumio.Result`][jumioResult] object that includes `workflowExecutionId` and `accountId`. The parameter [`isSuccess`][isSuccess] will be `true`. ``` func jumio(sdk: Jumio.SDK, finished result: Jumio.Result) { delegate?.defaultUIDidFinish(with: result) } ``` ### Error A workflow will result in an error when the user presses the cancel button during the workflow or in an error situation. [`Jumio.Result`][jumioResult] returns `workflowExecutionId` and `accountId`. It will also return a [`Jumio.Error`][jumioError] object, which contains an error code and error message. The parameter [`isSuccess`][isSuccess] will be `false`. ``` func jumio(sdk: Jumio.SDK, finished result: Jumio.Result) { delegate?.defaultUIDidFinish(with: result) } ``` ### Retrieving information The following tables give information on the specification of all data parameters and errors: - [`Jumio.IDResult`][jumioIDResult] - [`Jumio.FaceResult`][jumioFaceResult] - [`Jumio.RejectReason`][jumioRejectReason] - [`Jumio.Error`][jumioError] #### Class **_Jumio.IDResult_** | Parameter | Type | Max. length | Description | | :--------------- | :-------------- | :---------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | issuingCountry | String | 3 | Country of issue as [ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) country code | | idType | String | | PASSPORT, DRIVER_LICENSE, IDENTITY_CARD or VISA as provided or selected | | idSubType | String | | Sub type of the scanned ID | | firstName | String | 100 | First name of the customer | | lastName | String | 100 | Last name of the customer | | dateOfBirth | String | | Date of birth | | issuingDate | String | | Date of issue | | expiryDate | String | | Date of expiry | | documentNumber | String | 100 | Identification number of the document | | personalNumber | String | | Personal number of the document | | curp | String | | Unique Population Registry Code | | gender | String | | Gender M, F or X | | nationality | String | | Nationality of the customer | | placeOfBirth | String | 255 | Place of birth | | country | String | | Country of residence | | address | String | 64 | Street name of residence | | city | String | 64 | City of residence | | subdivision | String | 3 | Last three characters of [ISO 3166-2:US](https://en.wikipedia.org/wiki/ISO_3166-2:US) or [ISO 3166-2:CA](https://en.wikipedia.org/wiki/ISO_3166-2:CA) subdivision code | | postalCode | String | 15 | Postal code of residence | | mrzLine1 | String | 50 | MRZ line 1 | | mrzLine2 | String | 50 | MRZ line 2 | | mrzLine3 | String | 50 | MRZ line 3 | | extractionMethod | Jumio.Scan.Mode | | Extraction method used during scanning (manual, barcode, nfc, docFinder) | | imageData | Jumio.ImageData | | Wrapper class for accessing image data of all credential parts from an ID verification session. This feature has to be enabled by your account manager. | #### Class **_Jumio.FaceResult_** | Parameter | Type | Max. length | Description | | :--------------- | :-------------- | :---------- | :------------------------------------------------------------------------------------------------------------------------------------------------------ | | passed | Boolean | | | extractionMethod | Jumio.Scan.Mode | | Extraction method used during scanning (faceManual, liveness, livenessPremium) | | imageData | Jumio.ImageData | | Wrapper class for accessing image data of all credential parts from an ID verification session. This feature has to be enabled by your account manager. | #### Class **_Jumio.RejectReason_** List of all possible reject reasons returned if Instant Feedback is used. The actually returned reasons depend on the server-side configuration of your merchant: | Code | Message | Description | | :--- | :------------------- | :---------------------------------------------------------- | | 104 | DIGITAL_COPY | Document appears to be a digital copy | | 200 | NOT_READABLE | Document is not readable | | 201 | NO_DOC | No document could be detected | | 206 | MISSING_BACK | Backside of the document is missing | | 214 | MISSING_FRONT | Frontside of the document is missing | | 401 | UNSUPPORTED_DOCUMENT | Frontside or backside of document is unsupported | | 501 | INVALID_CERTIFICATE | Document has no valid certificate, relevant for digital ids | | 2001 | BLURRY | Document image is unusable because it is blurry | | 2003 | MISSING_PART_DOC | Part of the document is missing | | 2005 | DAMAGED_DOCUMENT | Document appears to be damaged | | 2004 | HIDDEN_PART_DOC | Part of the document is hidden | | 2006 | GLARE | Document image is unusable because of glare | #### Error Codes List of all **_error codes_** that are available via the `code` and `message` property of the [`Jumio.Error`][jumioError] object. The first letter (A-Z) represents the error case. The remaining characters are represented by numbers that contain information helping us understand the problem situation ([xx][yyyy]). | Code | Message | Description | | :---------: | :----------------------------------------------------------------- | :------------------------------------------------------------ | | A[xx][yyyy] | We have encountered a network communication problem | Retry possible, user decided to cancel | | B[xx][yyyy] | Authentication failed | Secure connection could not be established, retry impossible | | C[xx]0401 | Authentication failed | API credentials invalid, retry impossible | | E[xx]0000 | No Internet connection available | Retry possible, user decided to cancel | | F000000 | Scanning not available at this time, please contact the app vendor | Resources cannot be loaded, retry impossible | | G000000 | Cancelled by end-user | No error occurred | | H000000 | The camera is currently not available | Camera cannot be initialized, retry impossible | | I000000 | Certificate not valid anymore. Please update your application | End-to-end encryption key not valid anymore, retry impossible | | J000000 | Transaction already finished | User did not complete SDK journey within session lifetime | | N000000 | Scanning not available at this time, please contact the app vendor | Required images are missing to finalize the acquisition | ⚠️  **Note:** Please always include the whole error code when filing an error related issue to our support team. ## Default UI You can use Jumio SDK with the default theme or specify a custom theme (see [Customization](#customization) for details). Please note that the Jumio SDK launches in portrait mode only. You can start DefaultUI by calling `startDefaultUI` method on `Jumio.SDK` instance. Please make sure to include the dependency `Jumio/DefaultUI`. ## Custom UI ID Verification can also be implemented as a **custom scan view.** This means that only the scan view controllers (including the scan overlays) are provided by the SDK. The handling of the lifecycle, document selection, readability confirmation, error handling, and all other steps necessary to complete a scan have to be handled by the client application that implements the SDK. The following sequence diagram outlines components, callbacks and functions for a basic ID Verification workflow: ![Custom UI Happy Path Diagram](images/happy_paths/custom_ui_happy_path_diagram.png) Custom UI enables you to create and use a custom scan view with a plain scanning user interface. In order to do that, initialize the SDK instance by setting [`sdk.token`][token] and [`sdk.dataCenter`][dataCenter]. Specify a `delegate` instance which creates a [`Jumio.Controller`][jumioController]. :::note Instead of setting a `defaultUIDelegate` property, like you would do for DefaultUI, you need to pass a [`Jumio.Controller.Delegate`][jumioControllerDelegate] to the `start` function. ::: ``` sdk = Jumio.SDK() sdk?.token = "YOUR_SDK_TOKEN" sdk?.dataCenter = jumioDataCenter ``` - [`JumioDataCenter`][dataCenter] values: `US`, `EU`, `SG` Create a [`Jumio.Controller`][jumioController] instance and start the SDK: ``` var controller = Jumio.Controller? controller = sdk?.start(controllerDelegate) ``` ### UI/UX Best Practices - Launch SDK only after explicit user consent. - Show pre-permission screens explaining camera use. - Prompt better lighting for retries. - Avoid flashlight use by default. - Use SDK localization. ### Controller Handling Once the controller is initialized, the following delegate methods will be available to handle [`Jumio.Controller`][jumioController]: ``` // initialization finished func jumio(controller: Jumio.Controller, didInitializeWith credentialInformations: [Jumio.Credential.Info], consentItems: [Jumio.ConsentItem]?, termsOfUse: Jumio.TermsOfUse?) // result handling func jumio(controller: Jumio.Controller, finished result: Jumio.Result) func jumio(controller: Jumio.Controller, error: Jumio.Error) func jumio(controller: Jumio.Controller, logicalError: Jumio.LogicalError) ``` #### Consent Handling To support compliance with various data protection laws, if a user's consent is required the parameter `consentItems` will provide a list of `Jumio.ConsentItem`. Each consent item contains a text, a consent type and an URL that will redirect the user to Jumio's consent details. Each `Jumio.ConsentItem` also provides an attributedText where the text is parsed and link holder is underlined. If no consent is required, the parameter `consentItems` will be `null`. Each consent item can be one of two types: - `Jumio.ConsentType.active` - `Jumio.ConsentType.passive` For `active` types, the user needs to accept the consent items explicitly, e.g. by enabling an UISwitch or checking a checkbox for each consent item. For `passive` types, it is enough to present the consent text and URL to the user. The user implicitly accepts the passive consent items by continuing with the journey. The user can open and continue to the provided consent link if they choose to do so. If the user consents to the Jumio policy, [`controllerHandling?.userConsented(consentItem: Jumio.ConsentItem, decision: Bool)`][userConsented] is required to be called internally before any credential can be initialized and the user journey can continue. If no consent is required, the list of `consentItems` will be `null`. If the user does not consent or if [`controllerHandling?.userConsented(consentItem: Jumio.ConsentItem, decision: Bool)`][userConsented] is not called for all the items inside the`consentItems` list, the user will not be able to continue the user journey. **_Please note that biometric data protection laws and other laws governing consent can change over time and therefore you must include user consent handling as described above, even if a record of the user’s consent is not required for your current use case._** ⚠️  **Note:** Please be aware that in cases where list of `consentItems` is not null, the user **must consent** to Jumio's processing of personal information, including biometric data, and be provided a link to Jumio's Privacy Notice. Do not accept automatically without showing the user any terms. #### Terms of Use Handling The `termsOfUse` parameter provides a [`Jumio.TermsOfUse`][jumioTermsOfUse] containing: - `text`: The localized string containing the terms of use text. - `url`: The URL to redirect the user to Jumio’s terms of use details. If the `termsOfUse` parameter is `null`, then it should be ignored. ### Credential Handling The [`Jumio.Credential`][jumioCredential] object contains all necessary information about the scanning process. You will receive a specific subclass depending on the verification type, such as an [`IDCredential`][jumioIDCredential] for ID Verification or a [`FaceCredential`][jumioFaceCredential] for Selfie Verification. Initialize the credential and check if it is already preconfigured. If the [`isConfigured`][isConfigured] parameter is true, the credential can be started right away. If you are using digital identities and do not want the user to select a specific document type for physical document scanning, call [`setDefaultDocumentConfiguration()`][setDefaultDocumentConfiguration] on the IDCredential. This allows the user to skip country selection and proceed directly to document scanning. ``` var currentCredential: Jumio.Credential? currentCredential = controller?.start(credentialInfo: currentCredentialInfo) if currentCredential?.isConfigured { scanSides = currentCredential?.scanSides // start next scan part } ``` If the credential is not yet configured, configuration needs to be set before scanning can be initialized for available countries. In case of ID verification, all available countries for a specific [`IDCredential`][jumioIDCredential] are returned in [`countries`][countries] parameter of the individual credential. Use [`isSupportedConfiguration()`][isSupportedConfiguration] function to check if a certain configuration (e.g. a specific combination of country and documents) is supported for a certain ID credential. Use [`setConfiguration()`][setConfiguration] to set a valid country / document combination: ``` currentCredential.isSupportedConfiguration(country: country, document: document) else { return } currentCredential.setConfiguration(country: country, document: document) ``` Make sure to initialize credentials in the order defined in the [`Jumio.Credential.Info.order`][jumioCredentialInfoOrder]. If multiple credentials have the same order, you can initialize them in any order. #### Jumio ID Credential To use the document found in `Jumio.LookupResult` for the Selfie.Done workflow, a consent value `true` is mandatory. If the user does not want to use the document, an explicit `false` (non-consent) must still be recorded before the process can proceed: ``` let idCredential = ... // The legalStatment is retrieved from the `Jumio.LookupResult.LegalStatement` idCredential.userConsented(to: legalStatement, decision: true) ``` In case of [`Jumio.IDCredential`][jumioIDCredential], you can retrieve all available countries from [`supportedCountries`][supportedCountries]. After selecting a specific country from that list, you can query available documents for that country by either calling `physicalDocuments(for:)` or `digitalDocuments(for:)`. To configure the [`Jumio.IDCredential`][jumioIDCredential], pass your desired document as well as the country to `setConfiguration()`: Retrieve the supported countries: ``` let idCredential = ... let supportedCountries = idCredential.supportedCountries ``` Retrieve the Physical documents for a country: ``` let idCredential = ... let physicalDocuments = idCredential.physicalDocuments(for: countryCode) ``` Retrieve the Digital documents for a country: ``` let idCredential = ... let digitalDocuments = idCredential.digitalDocuments(for: countryCode) ``` Set a valid country / document combination: ``` let idCredential = ... idCredential.setConfiguration(country: country, document: document) ``` Retrieve the first credential part of the credential to start the scanning process by calling: ``` var credentialParts: [Jumio.Credential.Part]? credentialParts = currentCredential?.parts ``` Check if current [`Credential.Part`][jumioCredentialPart] is the first one: ``` var index = credentialParts?.firstIndex { $0 == previousCredentialPart } ?? 0 index += previousCredentialPart != nil ? 1 : 0 guard credentialParts?.count ?? 0 > index, let credentialPart = credentialParts?[index] else { return } ``` - [`Jumio.Credential.Category`][credentialCategory] values: `id`, `face`, `document` - [`Jumio.Document`][jumioDocument] values: `Jumio.Document.Physical`, `Jumio.Document.Digital` - [`Jumio.Document.Physical`][jumioPhysicalDocument] represents a single JumioDocumentType and JumioDocumentVariant combination - [`Jumio.Document.Physical.DocumentType`][jumioDocumentType] values: `passport`, `visa`, `drivingLicense`, `identityCard` - [`Jumio.Document.Physical.DocumentVariant`][jumioDocumentVariant] values: `paper`, `plastic` - [`Jumio.Document.Digital`][jumioDigitalDocument] represents a digital document ("Digital Identity") - [`JumioDigitalDocumentType`][jumiodigitaldocumenttype] values: `TRUST_CHECK`, `EIDAS`, `MASTERCARD`, `DIGITAL_DRIVING_LICENSE_PDF` #### Jumio Face Credential In case of [`Jumio.FaceCredential`][jumioFaceCredential], Jumio uses Certified Liveness technology to determine liveness. The mode can be detected by checking the [`Jumio.Scan.Mode`][jumioScanMode] of the [`Jumio.Scan.Part`][jumioScanPart]. Make sure to also implement `faceManual` as a fallback, in case `liveness` is not available. Retrieve the credential part of the credential to start the scanning process by calling: ``` var credentialPart = [Jumio.Credential.Part]? var scanPart = credential?.initScanPart(credentialPart, scanPartDelegate: self) ``` :::note Portrait orientation is required when performing the face credential. ::: #### Jumio Document Credential In case of [`Jumio.DocumentCredential`][jumioDocumentCredential], there is the option to either acquire the image using the camera or selecting a file from the device. Call `setConfiguration` with a [`Jumio.Acquire.Mode`][jumioAcquireMode] to select the preferred mode as described in the code documentation. - [`Jumio.Acquire.Mode`][jumioAcquireMode] values: `camera`, `file` ``` func select(acquireMode: Jumio.Acquire.Mode?) { guard let documentCredential = credential as? Jumio.DocumentCredential, let acquireMode = acquireMode, documentCredential.isSupportedConfiguration(acquireMode: acquireMode) else { delegate?.configurationNotSupported() return } documentCredential.setConfiguration(acquireMode: acquireMode) delegate?.loaded(scanSides: createViewModels(from: documentCredential.parts)) } ``` Retrieve the credential part of the credential to start the scanning process by calling: ``` func initScanPart(with credentialPart: Jumio.Credential.Part) { guard let scanPart = createScanPart(credentialPart: credentialPart) else { return } activeCredentialPart = credentialPart self.scanPart = scanPart isScanPartFinishable = false } ``` If [`Jumio.Acquire.Mode`][jumioAcquireMode] `file` is used, the [`JumioFileAttacher`][jumioFileAttacher] needs to be utilized to add a File or FileDescriptor for the selected [`Jumio.Scan.Part`][jumioScanPart]. ``` let attacher = Jumio.FileAttacher() attacher.attach(scanPart: scanPart) attacher.set(url: "path/to/your/file") ``` Check the [`Jumio.FileRequirements`][jumioFileRequirements] to know the specifications of the file. Currently, the SDK supports `application/pdf`, `image/webp`, `image/jpeg`, `image/png` and `image/heic`. ### ScanPart Handling The following sequence diagram outlines an overview of ScanPart handling details: ![ScanPart Happy Path Diagram](images/happy_paths/scanpart_happy_path_diagram.png) Start the scanning process by initializing the scan part. Provide a `Jumio.Credential.Part` from the list below: - [`Jumio.Credential.Part`][jumioCredentialPart] values: `front`, `back`, `face`, `nfc`, `document`, `multipart`, `digital` Each [`Jumio.Scan.Part`][jumioScanPart] has an associated `scanMode`. Depending on the scan mode, you need to provide a different user guidance. The following scan modes are available for the different `Jumio.Credential.Part`s: - [`Jumio.Scan.Mode`][jumioScanMode] values: - `front`, `back`, `multipart`: `manual`, `barcode`, `docFinder` - `digital`: `web`, `file` - `nfc`: `nfc` - `face`: `faceManual`, `liveness`, `livenessPremium` - `document`: `manual`, `file` During the scanning process, use the `scanPart` delegate method to check on the scanning progress. #### Scan Steps A [`Jumio.Scan.Step`][jumioScanStep] is sent via `jumio(scanPart: Jumio.Scan.Part, step: Jumio.Scan.Step, data: Any?)` and covers lifecycle events which require action from the customer to continue the process. - [`Jumio.Scan.Step`][jumioScanStep] values: `prepare`, `started`, `scanView`, `digitalIdentityView`, `thirdPartyVerification`, `attachFile`, `imageTaken`, `processing`, `nextPart`, `confirmationView`, `retry`, `rejectView`, `canFinish`, `addonScanPart`. [`prepare`][prepare] is only sent if a scan part requires upfront preparation and the customer should be notified (e.g. by displaying a loading screen). [`started`][started] is always sent when a scan part is started. If a loading view was triggered before, it can now be dismissed. It additionally returns the started [`Jumio.Credential.Part`][jumioCredentialPart] as data object. [`scanView`][scanView] is sent, when the scan view should be displayed. On this view, the user will capture a photo or a sequence of photos of a document or of a face with the camera. [`digitalIdentityView`][digitalIdentityView] is only sent if a scan part is digital and is triggered to indicate that the scan part needs a `Jumio.DigitalIdentity.View` attached. [`thirdPartyVerification`][thirdPartyVerification] is triggered to indicate that the scan part will switch to a third party's application to continue verification. As this might take some time, showing a loading indicator is recommended. [`attachFile`][attachFile] is sent, when the user needs to select and upload a file. For this, you should create a [`JumioFileAttacher`][jumioFileAttacher] and provide the document. The step is only sent, when the scan method is `file`. [`imageTaken`][imageTaken] is triggered as soon as all images of one part are taken. There can't be more than one [`imageTaken`][imageTaken] step during one part. Instead, [`Jumio.Scan.Update.nextPosition`][nextPosition] events are sent, when multiple images are taken. [`Jumio.Scan.Step.processing`][processing] is triggered when background processing happens. The camera preview is stopped during that step. When a [`multipart`][multipart] scan part is started, an additional [`nextPart`][nextPart] step is sent after all images from the current part are taken. This signals that another side of the document should be scanned now. The step returns the [`Jumio.Credential.Part`][jumioCredentialPart], which should be scanned next, as data object. We suggest to actively guide the user to move to the next part, e.g. by showing an animation and by disabling the extraction during the animation. When a confirmation view should be displayed, depending on the outcome either [`Jumio.Scan.Step.confirmationView`][confirmationView] or [`Jumio.Scan.Step.rejectView`][rejectView] is triggered. To display the ScanPart in the confirmation or reject view, instantiate a [`Jumio.Confirmation.Handler`][jumioConfirmationHandler] or [`Jumio.Reject.Handler`][jumioRejectHandler], and simply attach the ScanPart to the handler and render the views once the steps are triggered: ``` func jumio(scanPart: Jumio.Scan.Part, step: Jumio.Scan.Step, data: Any?) { switch step { case .confirmationView: if let scanPart = self.scanPart { confirmationHandler?.attach(scanPart: scanPart) delegate?.showConfirmationViews() } case .rejectView: // Use the rejectReasons to show the user why the scan was rejected let rejectReasons = data as? [Jumio.Credential.Part: Jumio.RejectReason] ?? [:] if let scanPart = self.scanPart { rejectHandler?.attach(scanPart: scanPart) delegate?.showRejectViews() } } } func showRejectViews() { rejectHandler?.parts.forEach { part in let rejectView = Jumio.Reject.View() rejectHandler?.render(part: part, view: rejectView) delegate?.display(rejectView) } } ``` The scan part can be confirmed by calling `confirmationHandler?.confirm()` or the scan can be taken again: Either by calling `confirmationHandler?.retake()` in case the scan attempt was successful, or by calling `rejectHandler?.retake()` in case the scan attempt was rejected. (Bad lighting conditions or glare, image was blurry, etc. ...) The retry scan step returns a data object of type [`Jumio.Retry.Reason`][jumioRetryReason]. On [`retry`][retry], a retry has to be triggered on the credential. ``` func jumio(scanPart: Jumio.Scan.Part, step: Jumio.Scan.Step, data: Any?) { case .retry: activeRetryReason = data as? Jumio.Retry.Reason var code = activeRetryReason?.code var message = activeRetryReason?.message } ``` As soon as the scan part has been confirmed and all processing has been completed [`canFinish`][canFinish] is triggered. `scanPart.finish()` can now be called. During the finish routine the SDK checks if there is an add-on functionality for this part available, e.g. possible NFC scanning after a DocFinder scan part. If an add-on is available, the `addonScanPart` step is triggered. To see if the finished credential part was the last one of the credential, check `currentCredentialPart == currentCredential?.credentialPart?.last()` Check if the credential is complete by calling [`currentCredential?.isComplete`][isComplete] and finish the current credential by calling [`currentCredential?.finish()`][credentialFinish]. Continue that procedure until all necessary credentials (e.g. `id`, `face`, `document`, `data`) are finished. Check if the last credential is finished with: ``` var index = credentialParts?.firstIndex { $0 == previousCredentialPart } ?? 0 index += previousCredentialPart != nil ? 1 : 0 guard credentialParts?.count ?? 0 > index, let credentialPart = credentialParts?[index] else { return } ``` Then call [`controller?.finish()`][controllerFinish] to end the user journey. #### Scan Updates [`Jumio.Scan.Update`][jumioScanUpdate]s are sent via `jumio(scanPart: Jumio.Scan.Part, updates update: Jumio.Scan.Update, data: Any?)` and cover scan information that is relevant and might need to be displayed during the scanning process. - [`Jumio.Scan.Update`][jumioScanUpdate] values: `fallback(FallbackReason)`, `nfcExtractionStarted`, `nfcExtractionProgress`, `nfcExtractionFinished`, `extractionState(ExtractionState)`, `flash(FlashState)`, `nextPosition`, `cameraAvailable` - In case of a `fallback`, the `scanMode` changed and you should adapt the user interface to reflect the new scan mode. For example, if you fallback to a manual scan method, you might want to show a shutter button. - `nfcExtractionStarted`, `nfcExtractionProgress`, and `nfcExtractionFinished` make it possible to track the progress of a NFC scan. `nfcExtractionProgress` additionally delivers an integer in the data parameter in the range of 0-100 to signal the progress in the current data group. - `extractionState`s signal a desired user behaviour. - `flash` signals the enabling or disabling of the camera flash. - `nextPosition` signals that the user needs to take a second image, e.g., needs to move the face in a liveness scan. - `cameraAvailable` signals that the camera loaded successfully. Note that `cameraAvailable` is also called when the camera facing was successfully changed. * [`Jumio.Scan.Update.FallbackReason`][jumioFallbackReason] values: `userAction`, `lowPerformance` - `userAction` is sent after `scanPart.fallback()` was called. - `lowPerformance` is sent, when the device is not capable of running the current `scanMode`. * [`Jumio.Scan.Update.ExtractionState`][jumioExtractionState]: - We send the following extraction states for the scan mode `docFinder`: `centerId`, `tooClose`, `moveCloser`, `holdStraight`, `tilt`, `imageAnalysis`, `rotate` - Please note - fallback and camera switch will also not be available during the states `FLASH` and `IMAGE_ANALYSIS`. * We send the following extraction states for the scan modes `liveness` and `livenessPremium`: `centerFace`, `faceTooClose`, `moveFaceCloser`, `moveFaceIntoFrame`, `levelEyesAndDevice`, `holdStill`, `tiltFaceUp`, `tiltFaceDown`, `tiltFaceLeft`, `tiltFaceRight` * [`Jumio.Scan.Update.FlashState`][jumioFlashState] values: `on`, `off` * [`Jumio.Scan.Update.TiltState`][jumioTiltState] is sent in the data parameter of `jumio(scanPart: Jumio.Scan.Part, updates: Jumio.Scan.Update, data: Any?)` for the update `extractionState(.tilt)` and returns the current tilt angle as well as the target tilt angle. - When a tilt update is sent, advise the user to tilt the identity document by e.g. showing an animation or an overlay. ### Result and Error Handling The method `jumio(controller: Jumio.Controller, finished result: Jumio.Result)` has to be implemented to handle data after a successful scan, which will return [`Jumio.Result`][jumioResult]. ``` func jumio(controller: Jumio.Controller, finished result: Jumio.Result) { delegate?.controller(finished: result) // handle success case } ``` ⚠️  **Note:** We recommend to hide any sensitive data, which you display to the user, when the app goes to the background. This includes the results you receive from us. The delegate method `jumio(controller: Jumio.Controller, error: Jumio.Error)` has to be implemented to handle data after an unsuccessful scan, which will return [`Jumio.Error`][jumioError]. Check the parameter [`error.isRetryable`][isRetryable] to see if the failed scan attempt can be retried. If an error is not retryable, the only possibility is to cancel the controller. This will result in a finished call with a [`Jumio.Result`][jumioResult] instance containing this error. ``` func jumio(controller: Jumio.Controller, error: Jumio.Error) { guard controller === self.controller else { return } guard error.isRetryable else { Task { await controller.cancel() } return } ... // handle error case } ``` The delegate method `(controller: Jumio.Controller, error: Jumio.LogicalError)` has to be implemented to handle data after an unsuccessful scan. [`Jumio.LogicalError`][jumioLogicalError] case occurs whenever some kind of logical error occurs. (For example: `.deadCredential: Credential` is returned when a credential has already been finished or canceled and can’t execute any action anymore. Controller has to be finished or canceled before a new one can be initialized. - [`Jumio.LogicalError`][jumioLogicalError] values: `dependencyWrongVersion`, `notYetImplemented`, `deadController`, `errorNotRetryable`, `needToConsentFirst`, `controllerNotCompleted`, `isBeingFinished`, `multipleCredentials`, `unknownCredential`, `deadCredential`, `credentialNotCompleted`, `multipleScanParts`, `unknownScanPart`, `scanPartNotCompleted`, `deadScanPart`, `noFallbackAvailable`, `takePictureNotAllowed`, `tokenValidationFailed`, `dataCenterValidationFailed` ``` func jumio(controller: Jumio.Controller, logicalError: Jumio.LogicalError) { var logicalErrorMessage: String = "" switch logicalError { case .dependencyWrongVersion: logicalErrorMessage = "3rd party dependency have wrong version" case ... // handle error cases @unknown default: logicalErrorMessage = "unknown logical error reported" } delegate?.display(logicalErrorMessage: logicalErrorMessage) } ``` #### Instant Feedback The use of Instant Feedback provides immediate end user feedback by performing a usability check on any image the user took and prompting them to provide a new image immediately if this image is not usable, for example because it is too blurry. Please refer to the [JumioRejectReason table](#class-jumiorejectreason) for a list of all reject possibilities. #### Error Handling & Retry Strategy - Categorize errors: soft (retry allowed) vs hard (exit flow). - On failure: create new accountId or reuse existing accountId with new session. - Redirect to retry/support screen instead of immediate SDK relaunch. - Log errors without storing PII. ## Customization ### Customization Tool [Jumio Surface](https://jumio.github.io/surface-tool) is a web tool that offers the possibility to apply and visualize, in real-time, all available customization options for the Jumio SDK, as well as an export feature to import the applied changes straight into your codebase. [![Jumio Surface](images/surface_tool.png)](https://jumio.github.io/surface-tool) ### Default UI customization The surface tool utilizes each screen of Jumio's [Default UI](#default-ui) to visualize all items and colors that can be customized. If you are planning to use the [Default UI](#default-ui) implementation, you can specify the [`Jumio.Theme`][jumioTheme] as a parent style and overriding attributes within this theme. After customizing the SDK via the surface tool, you can click the `Swift` button in the **Output** menu on the bottom right to copy the code from the theme [`Jumio.Theme`][jumioTheme] to your iOS app's. You can customize Jumio SDK UI. By using [`Jumio.Theme`][jumioTheme] class you can create your own theme and set it to your Jumio instance. You can use ['our sample app'](https://github.com/Jumio/mobile-sdk-ios/blob/master/sample/SampleApp/DefaultUI+Customization.swift) as guide to create your theme. #### Dark Mode [`Jumio.Theme`][jumioTheme] attributes can also be customized for dark mode. For each [`Jumio.Theme.Value`][jumioThemeValue] you can initiate with either only one color or with `light and dark`. If `light and dark` colors have been specified, they will be applied to the modes respectively. Dark mode will be applied when darkmode is enabled in system settings. ### Custom UI customization If you implement your own UI, you can still customize how some views provided by the SDK look. By following the steps explained in [Default UI customization](#default-ui-customization) you can see potential attributes to override. ## Testing & Validation - Use Jumio official sample apps to validate flows. - Test on varied device tiers and OS versions. - Test multiple ID types and lighting conditions. --- # Security All SDK related traffic is sent over HTTPS using TLS and public key pinning. Additionally, the information itself within the transmission is also encrypted utilizing **Application Layer Encryption** (ALE). ALE is a Jumio custom-designed security protocol that utilizes RSA-OAEP and AES-256 to ensure that the data cannot be read or manipulated even if the traffic was captured. ## Token Management & Session Security - Always create SDK tokens server-side. - Auth tokens are valid for 60 Mins. Kindly reuse them. - Pass Auth tokens securely using HTTPS only and store in-memory only. - Never hard-code or store the token creation mechanism on devices. - Always log accountId and workflowExecutionId. # Support ## Licenses The software contains third-party open source software. For more information, see [licenses](../licenses). This software is based in part on the work of the Independent JPEG Group. ## Contact If you have any questions regarding our implementation guide please contact Jumio Customer Service at support@jumio.com. The [Jumio online helpdesk](https://support.jumio.com) contains a wealth of information regarding our services including demo videos, product descriptions, FAQs, and other resources that can help to get you started with Jumio. ## Copyright © Jumio Corporation, 395 Page Mill Road, Suite 150, Palo Alto, CA 94306 The source code and software available on this website (“Software”) is provided by Jumio Corp. or its affiliated group companies (“Jumio”) "as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall Jumio be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including but not limited to procurement of substitute goods or services, loss of use, data, profits, or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this Software, even if advised of the possibility of such damage. In any case, your use of this Software is subject to the terms and conditions that apply to your contractual relationship with Jumio. As regards Jumio’s privacy practices, please see our privacy notice available here: [Privacy Policy](https://www.jumio.com/legal-information/privacy-policy/). [token]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/SDK.html#/s:5JumioAAV3SDKC5tokenSSvp [dataCenter]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/DataCenter.html [sdkVersion]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/SDK.html#/s:5JumioAAV3SDKC17defaultUIDelegateAA0a7DefaultD0_pSgvp [isJailbroken]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/SDK.html#/s:5JumioAAV3SDKC12isJailbrokenSbvpZ [defaultUIDelegate]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/SDK.html#/s:5JumioAAV3SDKC17defaultUIDelegateAA0a7DefaultD0_pSgvp [cameraFacing]: https://jumio.github.io/mobile-sdk-ios/Jumio/Classes/JumioScanView.html#/s:5Jumio0A8ScanViewC12cameraFacingA2AV06CameraE0Ovp [supportedCountries]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/IDCredential.html#/s:5JumioAAV12IDCredentialC18supportedCountriesSaySSGvp [hasFlash]: https://jumio.github.io/mobile-sdk-ios/Jumio/Classes/JumioScanView.html#/s:5Jumio0A8ScanViewC8hasFlashSbvp [flash]: https://jumio.github.io/mobile-sdk-ios/Jumio/Classes/JumioScanView.html#/s:5Jumio0A8ScanViewC5flashSbvp [isSuccess]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Result.html#/s:5JumioAAV6ResultC9isSuccessSbvp [userConsented]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Controller.html#/s:5JumioAAV10ControllerC13userConsentedyyF [isConfigured]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Credential.html#/s:5JumioAAV10CredentialC12isConfiguredSbvp [setDefaultDocumentConfiguration]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/IDCredential.html#/s:5JumioAAV12IDCredentialC31setDefaultDocumentConfigurationyyF [countries]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/IDCredential.html#/s:5JumioAAV12IDCredentialC9countriesSDySSSayAA0A8Document_pGGvp [isSupportedConfiguration]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/IDCredential.html#/s:5JumioAAV12IDCredentialC24isSupportedConfiguration7country8documentSbSS_AB8DocumentVtF [setConfiguration]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/IDCredential.html#/s:5JumioAAV12IDCredentialC16setConfiguration7country8documentySS_AB8DocumentVtF [credentialCategory]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Credential.html#/s:5JumioAAV10CredentialC8CategoryO [prepare]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html#/s:5JumioAAV4ScanV4StepO7prepareyA2FmF [started]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html#/s:5JumioAAV4ScanV4StepO7startedyA2FmF [imageTaken]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html#/s:5JumioAAV4ScanV4StepO10imageTakenyA2FmF [processing]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html#/s:5JumioAAV4ScanV4StepO10processingyA2FmF [digitalIdentityView]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html#/s:5JumioAAV4ScanV4StepO19digitalIdentityViewyA2FmF [thirdPartyVerification]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html#/s:5JumioAAV4ScanV4StepO22thirdPartyVerificationyA2FmF [attachFile]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html#/s:5JumioAAV4ScanV4StepO10attachFileyA2FmF [scanView]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html#/s:5JumioAAV4ScanV4StepO8scanViewyA2FmF [confirmationView]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html#/s:5JumioAAV4ScanV4StepO16confirmationViewyA2FmF [rejectView]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html#/s:5JumioAAV4ScanV4StepO10rejectViewyA2FmF [canFinish]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html#/s:5JumioAAV4ScanV4StepO9canFinishyA2FmF [nextPart]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html#/s:5JumioAAV4ScanV4StepO8nextPartyA2FmF [isComplete]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Credential.html#/s:5JumioAAV10CredentialC10isCompleteSbvp [credentialFinish]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Credential.html#/s:5JumioAAV10CredentialC6finishyyF [controllerFinish]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Controller.html#/s:5JumioAAV10ControllerC6finishyyF [retry]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html#/s:5JumioAAV4ScanV4StepO5retryyA2FmF [isRetryable]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Error.html#/s:5JumioAAV5ErrorV11isRetryableSbvp [multipart]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Credential/Part.html#/s:5JumioAAV10CredentialC4PartO9multipartyA2FmF [nextPosition]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Update.html#/s:5JumioAAV4ScanV6UpdateO12nextPositionyA2FmF [jumioScanView]: https://jumio.github.io/mobile-sdk-ios/Jumio/Classes/JumioScanView.html [jumioTheme]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Theme.html [jumioThemeValue]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Theme.html#/s:5JumioAAV5ThemeV5ValueV [jumioViewController]: https://jumio.github.io/mobile-sdk-ios/Jumio/Classes.html#/c:@M@Jumio@objc(cs)JumioViewController [jumioResult]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Result.html [jumioIDResult]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/IDResult.html [jumioFaceResult]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/FaceResult.html [jumioRejectReason]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/RejectReason.html [jumioRetryReason]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Retry.html#/s:5JumioAAV5RetryV6ReasonC [jumioError]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Error.html [jumioSetupError]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/SetupError.html [jumioLogicalError]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/LogicalError.html [jumioController]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Controller.html [jumioControllerDelegate]: https://jumio.github.io/mobile-sdk-ios/Jumio/Protocols/JumioControllerDelegate.html [jumioCredential]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Credential.html [jumioCredentialInfoOrder]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Credential/Info.html#/s:5JumioAAV10CredentialC4InfoV5orderSivp [jumioIDCredential]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/IDCredential.html [jumioPhysicalDocument]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/PhysicalDocument.html [jumioDigitalDocument]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/DigitalDocument.html [jumiodigitaldocumenttype]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/DigitalDocument.html [jumioDocumentCredential]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/DocumentCredential.html [jumioDataCredential]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/DataCredential.html [jumioFaceCredential]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/FaceCredential.html [jumioDocument]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Document.html [jumioDocumentType]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/PhysicalDocument/DocumentType.html [jumioDocumentVariant]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/PhysicalDocument/DocumentVariant.html [jumioScanStep]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Step.html [jumioScanUpdate]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Update.html [jumioScanMode]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Mode.html [jumioCredentialPart]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Credential/Part.html [jumioScanPart]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Part.html [jumioConfirmationHandler]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Confirmation/Handler.html [jumioRejectHandler]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Reject/Handler.html [jumioFallbackReason]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Update/FallbackReason.html [jumioExtractionState]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Update/ExtractionState.html [jumioFlashState]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Update/FlashState.html [jumioTiltState]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Update/TiltState.html [jumioPreloader]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Preloader.html [jumioPreloaderDelegate]: https://jumio.github.io/mobile-sdk-ios/Jumio/Protocols/JumioPreloaderDelegate.html [jumioAcquireMode]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Acquire/Mode.html [jumioFileAttacher]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/FileAttacher.html [jumioFileAttachHelpUrl]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/FileAttacher.html#/s:5JumioAAV12FileAttacherC7helpUrlSSSgvp [jumioFileRequirements]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/FileRequirements.html [jumioTermsOfUse]: https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/TermsOfUse.html --- # Transition Guide https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-ios-master/docs/transition_guide ![Header Graphic](images/jumio_feature_graphic.jpg) # Transition Guide for iOS SDK This section covers all technical changes that should be considered when updating from previous versions, including, but not exclusively: API breaking changes or new functionality in the public API, major dependency changes, attribute changes, deprecation notices. :::note When updating your SDK version, **all** changes/updates made in in the meantime have to be taken into account and applied if necessary. **Example:** If you're updating from SDK version **3.7.2** to **3.9.2**, the changes outlined in **3.8.0, 3.9.0** and **3.9.1** are **still relevant**. ::: ## 4.18.0 #### Changes to Public API - `Jumio.DigitalDocument.DocumentType` enum has been added with the following supported values: `TRUST_CHECK`, `EIDAS`, `MASTERCARD`, `DIGITAL_DRIVING_LICENSE_PDF` - `Jumio.DigitalDocument` property `type` has changed from `String` to `Jumio.DigitalDocument.DocumentType` - `Jumio.DigitalDocument` contains new optional property `logoUrl` - `Jumio.IDCredential` contains new function `setDefaultDocumentConfiguration()` #### Preselection - Digital Identity documents can now be preselected via the account request. See the [Preselection](integration_guide.md#preselection) section in the integration guide for details. #### Localization Keys The following keys have been added: - `jumio_di_continue_with_provider` - `jumio_di_doctype_digital_id_subheader` - `jumio_di_external_instructions_one` - `jumio_di_external_instructions_two` - `jumio_di_external_instructions_three` - `jumio_di_external_sub_header` - `jumio_di_select_from_list_below` - `jumio_di_unexpected_error_description` - `jumio_di_unexpected_error_title` - `jumio_di_use_another_id` - `jumio_di_what_happens_next` - `jumio_physical_id` The following keys have been renamed: - `jumio_idtype_subtitle_id` has been renamed to `jumio_select_id_type` - `jumio_di_vendor_selection_title` has been renamed to `jumio_di_choose_digital_id` ## 4.17.2 - Adds `CFBundleShortVersionString` to JumioLivenessClient.xcframework. ## 4.17.1 - Adds x86_64 simulator support to JumioLivenessClient.xcframework. ## 4.17.0 #### Changes to Public API - Added `Jumio.LookupResult` - Added `Jumio.LookupResult.LegalStatement` - Added `Jumio.IDCredential.lookupResult` - Added `Jumio.IDCredential.userConsented(to: Jumio.LookupResult.LegalStatement, decision: Bool) - Added `Jumio.Credential.Info.order` - Added `Jumio.TermsOfUse` - Changed `Jumio.Controller.Delegate.jumio(controller: Jumio.Controller, didInitializeWith credentialInformations: [Jumio.Credential.Info], consentItems: [Jumio.ConsentItem]?)` to `Jumio.Controller.Delegate.jumio(controller: Jumio.Controller, didInitializeWith credentialInformations: [Jumio.Credential.Info], consentItems: [Jumio.ConsentItem]?, termsOfUse: Jumio.TermsOfUse?)`. #### Logical Errors - Added `pendingLowOrderCredential` for starting a credential when not all lower order credentials are completed. #### Customization options - Added `Jumio.Theme.termsOfUseForeground` #### Localization Keys The following keys have been added: - `jumio_loaders_almost_there` - `jumio_loaders_finishing_up` - `jumio_loaders_starting_camera` - `jumio_loaders_success` - `jumio_loaders_this_will_take_a_moment` - `jumio_loaders_working_on_it` - `jumio_selfiedone_ID_Found` - `jumio_selfiedone_continue` - `jumio_selfiedone_scan_ID_manually` - `jumio_selfiedone_we_found_your_ID` The following key has been removed: - `jumio_analyzing_biometric` - `jumio_dv_confirm_file_info` - `jumio_dv_method_description` - `jumio_dv_retry_not_readable` - `jumio_dv_retry_size_limit` - `jumio_error_instant_feedback_bw_copy_tip_color_image` - `jumio_error_instant_feedback_bw_copy_title` - `jumio_error_instant_feedback_color_photocopy_title` - `jumio_liveness_scanning_completed` - `jumio_uploading_success` - `jumio_uploading_title` ## 4.16.0 #### DefaultUI - Removed support for landscape orientation on iPhones in DefaultUI. #### Modules - Removed `Jumio/IProov`, please use `Jumio/Liveness` instead. - Removed NFC functionality from Jumio core: - Removed `Jumio/Slim` as now `Jumio/Jumio` acts as the only Jumio core product. - Added `Jumio/NFC` as new dependency for NFC functionality. - Check out the [Integration guide](integration_guide.md#via-cocoapods) #### Customization options - Added `Jumio.Theme.ScanView.shutter` - Removed `Jumio.Theme.ScanView.documentShutter` - Removed `Jumio.Theme.ScanView.faceShutter` #### Document Verification - Document Verification supports additional mime types: - `image/webp` - `image/jpeg` - `image/png` - `image/heic` #### Scan Updates - Added `Jumio.Scan.Update.ExtractionState.rotate` ## 4.15.0 #### Changes to Public API The following functions and property-getters are now `async`: - `Jumio.Controller.cancel()` - `Jumio.Credential.cancel()` - `Jumio.ScanPart.cancel()` - `Jumio.ScanPart.finish()` - `Jumio.Scan.View.isShutterEnabled` - `Jumio.Scan.View.flash` - Added `Jumio.Scan.View.set(flash:)` as `Jumio.Scan.View.flash` is get-only. - `Jumio.Scan.View.hasFlash` The following functions and properties are now annotated with `@MainActor`: - `Jumio.Confirmation.Handler.parts` - `Jumio.Confirmation.Handler.renderPart(part:,view:)` - `Jumio.Reject.Handler.parts` - `Jumio.Reject.Handler.renderPart(part:,view:)` - All functions in `Jumio.DefaultUI.Delegate` - All functions in `Jumio.Controller.Delegate` - All functions in `Jumio.ScanPart.Delegate` - All functions in `Jumio.Preloader.Delegate` The following classes, structs and enums conform now to `Sendable`: - `Jumio.Theme` and all structs within - `Jumio.Scan.Mode` - `Jumio.Scan.Step` - `Jumio.Scan.Update` - `Jumio.Scan.Update.ExtractionState` - `Jumio.Scan.Update.FallbackReason` - `Jumio.Scan.Update.FlashState` - `Jumio.Scan.Update.TiltState` #### Customization options - Added `Jumio.Theme.NFC.phoneScreen` - Added `Jumio.Theme.NFC.chipPrimary` - Added `Jumio.Theme.NFC.chipSecondary` - Added `Jumio.Theme.NFC.chipBorder` - Added `Jumio.Theme.NFC.pulse` #### Localization Keys The following keys have been added: - `jumio_nfc_error_description_id` - `jumio_nfc_error_description_other` - `jumio_nfc_error_description_us` The following key has been removed: - `jumio_nfc_retry_error_general` ## 4.14.0 #### Scan Updates - Added `Jumio.Scan.Update.ExtractionState.imageAnalysis` - Added `Jumio.Scan.Update.cameraAvailable` #### Localization Keys The following keys have been added: - `jumio_id_scan_prompt_analyzing` - `jumio_scan_switch_to_back_camera` - `jumio_scan_switch_to_front_camera` - `jumio_switched_to_back_camera` - `jumio_switched_to_front_camera` - `jumio_button_continue` - `jumio_change_issuing_country` - `jumio_current_issuing_country` - `jumio_eidas_description` - `jumio_eidas_login_header` - `jumio_european_did_login_header` - `jumio_id_scan_hint_error_fallback` - `jumio_select` ## 4.13.0 - Increased minimum iOS version to 13.0. - Removed `Jumio/Datadog` module. ## 4.12.0 #### Scan Modes - Added `Jumio.Scan.Mode.livenessPremium` #### Scan Updates - Added `Jumio.Scan.Update.ExtractionState.tiltFaceUp` - Added `Jumio.Scan.Update.ExtractionState.tiltFaceDown` - Added `Jumio.Scan.Update.ExtractionState.tiltFaceLeft` - Added `Jumio.Scan.Update.ExtractionState.tiltFaceRight` - Added `Jumio.Scan.Update.ExtractionState.moveFaceIntoFrame` #### Jumio IDResult - Added `curp` to `Jumio.IDResult` - Removed `rawBarcodeData` from `Jumio.IDResult` #### Localization Keys The following keys have been added: - `jumio_liveness_prompt_keep_centered` - `jumio_liveness_prompt_keep_still` - `jumio_liveness_prompt_keep_upright` - `jumio_liveness_prompt_move_away` - `jumio_liveness_prompt_success_another_scan` - `jumio_liveness_prompt_tilt_down` - `jumio_liveness_prompt_tilt_left` - `jumio_liveness_prompt_tilt_right` - `jumio_liveness_prompt_tilt_up` - `jumio_liveness_scanning_completed` - `jumio_error_scanning_not_possible` The following keys have been removed: - `jumio_liveness_prompt_success_another_shot` - `jumio_error_ocr_failed` #### Reject Reasons - Added `Jumio.RejectReason.invalidCertificate` #### File Attacher - Added property `helpUrl` #### ML Models - Replaced model for determining liveness. Find the new model [here](https://cdn.mobile.jumio.ai/ios/model/liveness_sdk_assets_v_1_1_5.enc). ## 4.11.1 - Removed `Jumio/Datadog` from default podspec configuration. This fixes [this known issue](known_issues.md#xcode16). ## 4.11.0 #### SPM - Library `JumioLocalization` makes it possible to localize strings with Swift Package Manager. #### Scan Updates - Added `Jumio.Scan.Update.ExtractionState.tilt` - Added `Jumio.Scan.Update.TiltState` - Added additional time parameter (in seconds) for `Jumio.Scan.Update.ExtractionState.holdStill` update - Added `Jumio.Scan.Update.nextPosition` #### Scan Steps - `Jumio.Scan.Step.imageTaken` is sent exactly once per scan. - Please use `Jumio.Scan.Update.nextPosition` to determine the position change for Jumio Liveness instead. #### Logical Errors - Deprecated `noDataCenterSet` error - Added `tokenValidationFailed` error for starting SDK with empty token - Added `dataCenterValidationFailed` error for starting SDK without datacenter #### Localization Keys The following keys have been added: - `jumio_id_scan_guide_photo_side_tilt` - `jumio_id_scan_prompt_tilt_less` - `jumio_id_scan_prompt_tilt_more` #### Reject Reasons - Added `401 unsupportedDocument` to `Jumio.RejectReason`. ## 4.10.1 - Removed `Jumio/Datadog` from default podspec configuration. This fixes [this known issue](known_issues.md#xcode16). ## 4.10.0 - Added `Jumio.Scan.Update.flash(FlashState)` - Added `Jumio.Scan.Update.FlashState` - Changed customization options - Renamed `Jumio.Theme.bubble.circleItemForeground` to `Jumio.Theme.bubble.outline` - Renamed `Jumio.Theme.scanView.bubbleForeground` to `Jumio.Theme.scanView.tooltipForeground` - Renamed `Jumio.Theme.scanView.bubbleBackground` to `Jumio.Theme.scanView.tooltipBackground` - Removed `Jumio.Theme.bubble.circleItemBackground` - Removed `Jumio.Theme.searchBubble.backgroundSelected` - Removed `Jumio.Theme.scanOverlay.fill` - Removed `Jumio.Theme.scanOverlay.scanOverlayTransparent` #### Localization Keys The following keys have been added: - `jumio_id_scan_prompt_captured` The following keys have been removed: - `jumio_id_scan_prompt_front_captured` - `jumio_id_scan_prompt_back_captured` #### Localization - Added Serbian (Cyril) `sr-Cyrl` - Added Serbian (Latin) `sr-Latn` ## 4.9.1 - Fixed a crash on iOS 12 app startup. ## 4.9.0 - Minimum iOS version raised to 12. - Removed `Jumio/DocFinder` dependency as the functionality was moved to Jumio core. Every dependency now contains DocFinder functionality. - Removed `Jumio/DeviceRisk` dependency as the functionality was moved to Jumio API. Plase check out our [Integration guide](integration_guide.md#risk-signal-device-risk). - Removed Default UI from Jumio core functionality - Added `Jumio/DefaultUI` - Check out the [Integration Guide](integration_guide.md) - Added `idSubType` to `Jumio.IDResult` - Added `Jumio/Preloader`, check out the [Integration Guide](integration_guide.md#preloading-models) - New `Jumio.Retry.Reason.Face` - generic - tooMuchMovement - lightingTooBright - lightingTooDark - eyesClosed - obscuredFace - multipleFaces - sunglasses - Changed customization options - Added `Jumio.Theme.face` - Added `Jumio.Theme.PrimaryButton.outline` - Added `Jumio.Theme.SecondaryButton.foregroundPressed` - Added `Jumio.Theme.SecondaryButton.foregroundDisabled` - Added `Jumio.Theme.SecondaryButton.outline` - Added `Jumio.Theme.SearchBubble.outline` - Added `Jumio.Theme.Loading.loadingAnimationGradient` - Added `Jumio.Theme.Loading.loadingAnimationErrorGradient` - Added `Jumio.Theme.Confirmation.imageBorder` - Renamed `Jumio.Theme.Bubble.selectionIconForeground` to `Jumio.Theme.selectionIconForeground` - Renamed `Jumio.Theme.SearchBubble.listItemSelected` to `Jumio.Theme.SearchBubble.backgroundSelected` ## 4.8.1 - Removed `Starscream` dependency for `Jumio/IProov`. ## 4.8.0 #### Manual Integration - Framework `JumioLiveness.xcframework` is now required when using `JumioIProov.xcframework` #### Carthage Integration - Framework `JumioLiveness.xcframework` is now required when using `JumioIProov.xcframework` ## 4.7.1 - Removed `Starscream` dependency for `Jumio/IProov`. ## 4.7.0 #### Barcode - Removed `Jumio/Barcode` dependency as the functionality was moved to Jumio core. Every dependency now contains Barcode functionality. #### MRZ - Removed `Jumio/MRZ` dependency. Please use `Jumio/Jumio` instead. #### NFC - Removed `Jumio/NFC` dependency. Please use `Jumio/Jumio` instead. #### Linefinder - Removed `Jumio/LineFinder` dependency. Please use `Jumio/Slim` in combination with `Jumio/DocFinder` instead. #### Changes to Public API - Deprecated `Jumio.Theme.IProov.animationForeground` - Added `Jumio.Theme.ScanHelp.faceAnimationForeground` - Deprecated `Jumio.Theme.IProov.animationBackground` - Added `Jumio.Theme.ScanHelp.faceAnimationBackground` - Deprecated `Jumio.Theme.PrimaryButton.text` - Added `Jumio.Theme.PrimaryButton.foreground` - Deprecated `Jumio.Theme.SecondaryButton.text` - Added `Jumio.Theme.SecondaryButton.foreground` - Added `Jumio.Theme.PrimaryButton.foregroundPressed` - Added `Jumio.Theme.PrimaryButton.foregroundDisabled` - Removed `Jumio.Scan.Mode.lineFinder` - Removed `Jumio.Scan.Mode.mrz` - Deprecated `Jumio.Scan.Update.legalHint` - Deprecated `Jumio.SDK.giveDataDogConsent(enabled: Bool)` - Deprecated `Jumio.IDResult.rawBarcodeData` #### Localization Keys The following keys have been added: - jumio_id_scan_guide_photo_side - jumio_id_scan_guide_back_side - jumio_id_scan_guide_photo_side_manually - jumio_id_scan_guide_back_side_manually The following keys have been removed: - jumio_id_scan_guide_take_photo_front_idc - jumio_id_scan_guide_take_photo_back_idc - jumio_id_scan_guide_take_photo_passport - jumio_id_scan_guide_take_photo_front_dl - jumio_id_scan_guide_take_photo_back_dl - jumio_id_scan_guide_take_photo_front_pd - jumio_id_scan_guide_take_photo_back_pd #### Localization - Replaced Portuguese `pt` with Portuguese (Portugal) `pt-PT` - Added Portugise (Brasil) `pt-BR` #### SPM - Library `JumioDatadog` which can be used to integrate JumioDatadog. #### Carthage - Added `JumioDatadog.json`. #### Frameworks - Datadog dependency `DatadogSDK` is removed ## 4.6.2 - Removed `Starscream` dependency for `Jumio/IProov`. ## 4.6.1 #### Cocoapods - `pod 'Jumio/DeviceRisk'` was removed from `pod 'Jumio/All'`. ## 4.6.0 #### Liveness - Added new library `JumioLiveness` to enhance the Liveness user experience/interface. Check out our [Integration Guide](integration_guide.md). - Removed liveness confirmation handling #### Cocoapods - `pod 'Jumio/IProov'` replaces ~~`pod 'Jumio/Liveness'`~~ as new pod for using iProov liveness technology. - `pod 'Jumio/Liveness'` is now required to use the Jumio liveness solution. #### SPM - Library `'JumioIProov'` replaces ~~`'JumioLiveness'`~~ as new library for our iProov liveness solution. - Library `'JumioLiveness'` is now required to use the Jumio liveness solution. #### Carthage - Added `'JumioLiveness.json'` which is now required to use the Jumio liveness solution. #### Changes to Public API - Deprecated `Jumio.Theme.ScanView.shutter`: - Added `Jumio.Theme.ScanView.documentShutter` - Added `Jumio.Theme.ScanView.faceShutter` ## 4.5.0 #### Customization - Option `Jumio.Theme.ScanView.animationBackground` has been removed. #### Changes to Public API - Error code format updated from `[A][x][yyyy]` to `[A][xx][yyyy]` - Deprecated `Jumio.IDCredential.countries`: - Added `Jumio.IDCredential.supportedCountries` - Added `Jumio.IDCredential.physicalDocuments(for:)` - Added `Jumio.IDCredential.digitalDocuments(for:)` - Added `Jumio.SDK.handleDeeplinkURL()` - Added `Jumio.Document.Physical` - Added `Jumio.Document.Digital` - New `Jumio.Credential.Part` - digital - New `Jumio.Scan.Step` - digitalIdentityView - thirdPartyVerification - New `Jumio.Retry.Reason.DigitalIdentity` - unknown - expired - thirdPartyVerificationError - serviceError - Changed `JumioScanView` - Changed `extraction` variable to get-only - Added `startExtraction()` function - Added `stopExtraction(hidePreview: Bool)` function - Changed `JumioControllerDelegate` - Changed `jumio(controller: Jumio.Controller, didInitializeWith credentialInformations: [Jumio.Credential.Info], policyUrl: String?)` to `jumio(controller: Jumio.Controller, didInitializeWith credentialInformations: [Jumio.Credential.Info], consentItems: [Jumio.ConsentItem]?)` - Changed `Jumio.Controller` - Changed `userConsented()` to be `userConsented(to consentItem: Jumio.ConsentItem, decision: Bool)` - Added `getUnconsentedItems() -> [Jumio.ConsentItem]?` #### Localization Keys The following keys have been added: - jumio_idtype_di - jumio_di_vendor_selection_title - jumio_di_retry_unknown - jumio_di_retry_third_party_verification_error - jumio_di_retry_service_error - jumio_di_back_to_document_selection #### Cocoapods - install hook for liveness is changed in the `podfile`: ``` post_install do |installer| installer.pods_project.targets.each do |target| if ['iProov', 'Starscream'].include? target.name target.build_configurations.each do |config| config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES' end end end end ``` #### Frameworks - iProov dependency `SwiftProtobuf` is removed ## 4.4.0 #### Changes to Public API - New `Jumio.Credential.Part` - `multipart`: This is the new Autocapture scan part. Instead of having a single scan part for all parts of a document (front, back), there is now a single `multipart` scan part that combines the two. Within this scan part all needed parts of a document are captured at once. - New `Jumio.Scan.Step` - `nextPart`: This scan step shows that the previous part has been captured and the next one can be started (e.g. frontside has been captured, now switch to the backside of the document). Contains the `Jumio.Credential.Part` as additional data. We suggest to actively guide the user to move to the next part, e.g. by showing an animation and by disabling the extraction during the animation. - Updated `Jumio.Scan.Step.started` - Added `Jumio.Credential.Part` as additional data - Changed confirmation and reject handling - Added `Jumio.Confirmation.Handler` - Added `Jumio.Reject.Handler` - Moved `attach`, `detach`, `retake` and `confirm` methods from `Jumio.Confirmation.View` to `Jumio.Confirmation.Handler` - Moved `attach`, `detach` and `retake` methods from `Jumio.Reject.View` to `Jumio.Reject.Handler` - As a result the confirmation views for front and/or back within multipart scans are obsolete and not existing anymore. - New `Jumio.Retry.Reason.iProov`: - faceMisaligned - eyesClosed - faceTooFar - faceTooClose - sunglasses - obscuredFace - userTimeout - notSupported - Updated `Jumio.Scan.Step.rejectView`: - The returned scan step data now contains a dictionary `[Jumio.Credential.Part: Jumio.RejectReason]` instead of a single `Jumio.RejectReason`. - Removed `Jumio.Retry.Reason.iProov`: - ambiguousOutcome - lightingFlash - lightingBacklit - motionMouth - New options in `Jumio.Theme.IProov`: - filterBackgroundColor - surroundColor - livenessAssuranceCompletedOvalStrokeColor - Renamed options in `Jumio.Theme.IProov`: - lineColor to filterForegroundColor - headerTextColor to titleTextColor - floatingPromptRoundedCorners to promptRoundedCorners - genuinePresenceAssuranceReadyOverlayStrokeColor to genuinePresenceAssuranceReadyOvalStrokeColor - genuinePresenceAssuranceNotReadyOverlayStrokeColor to genuinePresenceAssuranceNotReadyOvalStrokeColor - livenessAssuranceOverlayStrokeColor to livenessAssuranceOvalStrokeColor - genuinePresenceAssuranceReadyFloatingPromptBackgroundColor to promptBackgroundColor - genuinePresenceAssuranceNotReadyFloatingPromptBackgroundColor to promptBackgroundColor - livenessAssuranceFloatingPromptBackgroundColor to promptBackgroundColor - Removed options in `Jumio.Theme.IProov`: - headerBackgroundColor - footerBackgroundColor - livenessAssurancePrimaryTintColor - livenessAssuranceSecondaryTintColor - genuinePresenceAssuranceProgressBarColor - genuinePresenceAssuranceNotReadyTintColor - genuinePresenceAssuranceReadyTintColor - floatingPromptEnabled #### Localization Keys The following keys have been added: - IProov_PromptAlignFace - IProov_FailureEyesClosed - IProov_FailureFaceTooClose - IProov_FailureFaceTooFar - IProov_FailureMisalignedFace - IProov_FailureNotSupported - IProov_FailureObscuredFace - IProov_FailureSunglasses - IProov_FailureTooBright - IProov_FailureTooDark - IProov_FailureTooMuchMovement - IProov_FailureUnknown - IProov_FailureUserTimeout - IProov_AccessibilityPromptAlignFace - IProov_AccessibilityPromptScanning The following keys have been renamed: - IProov_ErrorCameraPermissionDeniedMessageIos to IProov_ErrorCameraPermissionDeniedMessage The following keys have been removed: - IProov_MessageFormat - IProov_PromptTapToBegin - IProov_PromptLivenessAlignFace - IProov_PromptLivenessNoTarget - IProov_PromptGenuinePresenceAlignFace - IProov_ProgressStreamingSlow - IProov_PromptGrantPermission - IProov_PromptGrantPermissionMessage - IProov_FailureAmbiguousOutcome - IProov_FailureLightingBacklit - IProov_FailureLightingFaceTooBright * IProov_FailureLightingFlashReflectionTooLow - IProov_FailureLightingTooDark - IProov_FailureMotionTooMuchMouthMovement - IProov_FailureMotionTooMuchMovement #### Liveness - We have seperated our liveness solution in `JumioIProov.xcframework`. You need to add this framework beside `Jumio.xcframework` to your project. #### Cocoapods - The following pods have been removed. Instead `Jumio/Liveness` should be added in your pod file. - `pod 'Jumio/SlimLiveness'` - `pod 'Jumio/LineFinderLiveness'` - `pod 'Jumio/MRZLiveness'` - `pod 'Jumio/BarcodeLiveness'` - `pod 'Jumio/NFCLiveness'` - install hook for liveness is changed in the `podfile`: ``` post_install do |installer| installer.pods_project.targets.each do |target| if ['iProov', 'SwiftProtobuf', 'Starscream'].include? target.name target.build_configurations.each do |config| config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES' end end end end ``` #### Frameworks - iProov dependency `SwiftProtobuf` is added - iProov dependency `SocketIO` is removed ## 4.3.1 No backward incompatible changes. ## 4.3.0 #### Changes to the Public API - `Jumio.Scan.Update.fallback` has now an additional `Jumio.Scan.Update.FallbackReason`: - `userAction`: Initiated by the user through the call of `Jumio.Scan.ScanPart.fallback()`. - `lowPerformance`: Initiated due to low performance on the current `Jumio.Scan.Mode`. - Document Verification is now supported. Please check the [Integration Guide](integration_guide.md#jumio-document-credential) for more information. #### Cocoapods - One new pod added, containing data analysis functionality: - `pod 'Jumio/Datadog'` - `pod 'Jumio/DocFinder'` - `pod 'Jumio/All'` replaces ~~`pod 'Jumio/Jumio'`~~ as default subspec of `pod 'Jumio'` #### Simulator Slice - Minimum iOS version for simulator slice was increased to 15.0 ## 4.2.0 #### Changes to the Public API - `Jumio.Theme.Value(light: UIColor?, dark: UIColor?)` has been replaced by `Jumio.Theme.Value(light: UIColor, dark: UIColor)`. - `Jumio.Theme.Value(_: UIColor)` has been added. This initializer should be used to provide one color for both light and dark mode. - `Jumio.Scan.Side` has been renamed to `Jumio.Credential.Part`. ## 4.1.2 No backward incompatible changes. ## 4.1.1 #### Customization Added Customization functionality to enable customizing Jumio Theme. `Jumio.Theme` is a class that can be used to create a custom theme and override colors for Jumio views. For more details on Customization, please refer to [Customization](integration_guide.md#customization) in our guides. #### ObjC support Added DefaultUI support for Objective-C based projects. Now `JumioSDK` class can be reached and initiated form Objective-C code with it's own configuration and delegate `JumioDefaultUIDelegate`. ## 4.1.0 #### Cocoapods - Two new pods added, containing NFC scan functionality: - `pod 'Jumio/NFC'` - `pod 'Jumio/NFCLiveness'` #### Instant Feedback Reject Reasons Added Instant Feedback functionality to give more granular user feedback with new reject reasons: - blackWhiteCopy - colorPhotocopy - digitalCopy - notReadable - noDoc - missingBack - missingFront - blurry - missingPartDoc - damagedDocument - hiddenPartDoc - glare ## 4.0.0 #### Authentication ℹ️  **As of version 4.0.0 and onward, the SDK can only be used in combination with Jumio KYX or Jumio API v3. API v2 as well as using API token and secret to authenticate against the SDK will no longer be compatible.** #### Cocoapods Please refer to the [Integration section](integration_guide.md#via-cocoapods) of our guides for a detailed description of all Cocoapods and framework changes. #### Default UI Updates As of SDK version 4.0.0, a lot of SDK parameters that previously could be set in the actual code are now contained within and provided by the `sdk.token`. These parameters have to be configured beforehand, during the API call that requests the token. Please refer to the [Configuration section](integration_guide.md#configuration) of our integration guides for a detailed description of all Default UI changes and updates. Information about which user journey (ID Verification, Identity Verification, Authentication, ...) the SDK is going to provide now also has to be specified during the API call that request the `sdk.token`. For more details on individual Jumio workflows, please refer to [Workflow Descriptions](https://documentation.jumio.ai/docs/references/servicesAndworkflow/standardService/standardServices) in our guides. #### Custom UI Updates As of SDK version 4.0.0, Custom UI workflow has been completely restructured. Please refer to the [Custom UI section](integration_guide.md#custom-ui) of our integration guides for a detailed description of all Custom UI changes and updates. --- # Known Issues https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-ios-master/docs/known_issues ![Header Graphic](images/jumio_feature_graphic.jpg) # Known Issues ## Portrait Effect The Liveness check will fail, if you add the key `NSCameraPortraitEffectEnabled` to your Info.plist file. Make sure that it is not set. ## Xcode16 There might be crashes on app startup when using our Datadog frameworks with Xcode16 via Cocoapods. For versions `4.10.0` and `4.11.0` if you use `Jumio` default podspec (`All`) please use the fixed versions `4.10.1` and `4.11.1`. For versions below `4.10.0` or if you use `Jumio/Datadog` pod we advise to remove the Datadog dependency (`Jumio/Datadog`) or update to the newer versions. ## Apple Privacy Guidelines The guide of Jumio SDK compliance to Apple Privacy Guidelines is in [integration FAQ](integration_faq.md#apple-privacy-guidelines) ## 4.9.0 There might be crashes on app startup when using our `4.9.0` frameworks on iOS 12. Please use version `4.9.1` instead. ## SDK Runs Fine on Debug Build, Fails on Release Build For Xcode 13 and above, application might build and run fine for debug builds, but crash on release builds. This might also occur with Testflight. When archiving / exporting an app with Xcode 13, Jumio SDK cannot be initialized and might throws the following exception, despite the fact that SDK version and all framework versions appear to be correct: ``` SDKVersionNotCompatibleException: JumioFRAMEWORK is expected to be of version X.X.X ``` This is due to Xcode 13 introducing a new option to their **App Store Distribution Options**: **"Manage Version and Build Number"** (see image below) If checked, this option changes the version and build number of all content of your app to the overall application version, including third-party frameworks. **This option is enabled by default.** Please make sure to disable this option when archiving / exporting your application to the App Store. Otherwise, the Jumio SDK version check, which ensures all bundled frameworks are up to date, will fail. ![Xcode13 Issue](images/known_issues_xcode13.png) Alternatively, it is also possible to set the key `manageAppVersionAndBuildNumber` in the **exportOptions.plist** to `false`: ``` manageAppVersionAndBuildNumber ``` ## Library Not Loaded: Image Not Found Building an application using Objective C might result in the following error: `Termination Description: DYLD, Library not loaded: @rpath/libswiftCore.dylib | Referenced from: {PATH} | Reason: image not found` Please make sure `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` is set to `Yes` in the **Build Options.** ## Custom Theme Issues ### Language Localization Issues Please make sure to select your project in the project and targets list in the **Project Navigator,** navigate to the **Info** tab. In the **Localizations** section, make sure that _"Use Base Internationalization"_ is checked. Otherwise, the system will fall back on the default localization. To select a different language use the “+” button in the **Localizations** section. This will let you choose a new language you want to support from a dropdown list. Please refer to the [full list of languages supported by Jumio](../README_iOS.md#language-localization) for more details. Adding a new language from the list will generate files under a new language project folder named `[new language].lproj` For example, if Japanese support is added, a folder named `ja.lproj` will be created. #### Localizable.strings File The `Localizable-Jumio.strings` file makes it possible to easily add translations as key-value pairs. Adapt the values to your required language as needed and add it to your app or framework project. Again, please make sure to mark the project as _Localizable._ After SDK updates, make sure to check whether the content of this localization file is up to date, as individual strings may have changed. :::tip Refer to the transition guides for possible updates. ::: #### Language Changes at Runtime Runtime language changes _within_ the SDK or separate language support (meaning the SDK language differs from the overall device language) is not possible. This goes against Apple's basic iOS user model for switching languages in the Settings app. --- # Integration Glossary https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-ios-master/docs/integration_glossary ![Header Graphic](images/jumio_feature_graphic.jpg) # Glossary ## Commonly Used Abbrevations ### CVV Card Verification Value: A verification number on any credit card, usually 3-4 digits long ### DOB Date Of Birth ### DV Driver’s License ### GDPR [General Data Protection Regulation](https://gdpr-info.eu) (EU): EU-wide data privacy regulation protecting natural persons and their personal data, especially in regards to collecting, processing and the free movement of that data ### ISO 3166-1 ISO standard detailing standard country code abbreviations (like AUT, DEU, etc); either [alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) (using two letters) or [alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) (using three letters) ### KYC Know Your Customer ### KYX Know Your Everything: Jumio’s end-to-end [identity platform](https://www.jumio.com/platform/) ### MRP Machine Readable Passport ### MRTD Machine Readable Travel Document ### eMRTD Electronic Machine Readable Travel Document ### NFC [Near-Field Communication:](https://en.wikipedia.org/wiki/Near-field_communication#Identity_and_access_tokens) Establishes wireless connection from one device to another, but only if that device is in close enough proximity; can act as an electronic identity document / electronic identity token and is already used in many identity documents worldwide ### NV Netverify ### OAuth2 An [industry-standard protocol for authorization](https://oauth.net/2/) ### OAuth2 Access Token An [access token using the OAuth2 protocol](https://oauth.net/2/access-tokens/) to make safe API calls and securely access resources from a server ### OCR [Optical Character Recognition:](https://en.wikipedia.org/wiki/Optical_character_recognition) Converts images of text, such as text on IDs, to machine-encoded and machine-readable text ### PII Personal(ly) Identifiable Information: All of our products deal with highly sensitive data regarding information relating to an identifiable person, which is handled with great care, the best possible security and in compliance with the GDPR. ### PP Passport ### 3D-Liveness Liveness check: The 3D-liveness check makes sure that a face scan performed was not of a picture, but of an actual, living person who also matches the picture on the previously scanned document. --- # Integration FAQ https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-ios-master/docs/integration_faq import enhanced_injection_detection_02 from './images/capturing_methods/enhanced_injection_detection_02.png'; import enhanced_injection_detection_01 from './images/capturing_methods/enhanced_injection_detection_01.png'; import manual_capturing_02 from './images/capturing_methods/manual_capturing_02.png'; import manual_capturing_01 from './images/capturing_methods/manual_capturing_01.png'; import barcode_scanning_02 from './images/capturing_methods/barcode_scanning_02.png'; import barcode_scanning_01 from './images/capturing_methods/barcode_scanning_01.png'; import autocapture_02 from './images/capturing_methods/autocapture_02.png'; import autocapture_01 from './images/capturing_methods/autocapture_01.png'; import user_consent_active_on from './images/consent/user_consent_active_on.png'; import user_consent_active_off from './images/consent/user_consent_active_off.png'; import user_consent_passive from './images/consent/user_consent_passive.png'; ![Header Graphic](images/jumio_feature_graphic.jpg) # FAQ ## User Consent User consent is now acquired for all users to ensure the accordance with biometric data protection laws. Depending on the legal requirements, consent can be acquired in one of two ways: **Active** or **passive**. For **active** consent instances, the user needs to accept the consent items explicitly, e.g. by enabling a UI switch or checking a checkbox for each consent item. For **passive** consent instances, it is enough to present the consent text and URL to the user. The user implicitly accepts the passive consent items by continuing with the journey.
Acquiring passive user consent Acquiring active user consent Acquiring passive user consent
## Apple Privacy Guidelines At WWDC23 Apple introduced new privacy manifest and signature for third-party software development kits (SDKs) and announced that developers will need to declare approved reasons for using a set of APIs in their app’s privacy manifest. These changes help app developers better understand how third-party SDKs use data, secure software dependencies, and provide additional privacy protection for end users. On March 13, 2024, App updates or new Apps added to App Store Connect that use an API requiring approved reasons, Apple will send an email if the app’s privacy manifest is missing any reason. On May 1, 2024, App updates or new Apps added to App Store Connect should comply with the Apple Privacy Guidelines. After the WWDC23 announcement, the requested changes were applied and released with Jumio SDK 4.6.1. Starting from Jumio SDK 4.6.1 and the versions released afterward, Jumio frameworks follow the privacy guidelines requested from Apple. Apple also published a list of most commonly used third-party SDKs. Any version of a listed SDK, as well as any SDKs that repackage those on the list, must contain a privacy manifest and a signature. One of Jumio SDK optional dependencies, iProov, uses one of the SDKs mentioned in the list, Starscream. iProov SDK provided new releases v11.0.3 and v10.3.3 which follow the privacy guidelines. The new iProov version was included in Jumio SDK 4.9.0. Jumio SDK also included the updated iProov SDK in the versions 4.6.2, 4.7.1 and 4.8.1. Jumio frameworks follow Apple privacy guidelines starting from version 4.6.1 and onwards. Jumio frameworks and Jumio optional dependencies (iProov) follow Apple privacy guidelines on version 4.6.2, 4.7.1, 4.8.1, 4.9.0 and onwards. ## Apple Accessibility Nutrition Labels At WWDC25 Apple introduced Accessibility Nutrition Labels, which inform users before download whether the app is accessible to them. Jumio conforms to and tests the following accessibility categories: - VoiceOver: The Jumio SDK supports VoiceOver. - Larger Text: It is possible to increase text size within the Jumio SDK. - Dark Interface: The Jumio SDK supports both light and dark mode. - Differentiate Without Color Alone: The Jumio SDK doesn't rely solely on color, but uses shapes to indicate required user actions. - Sufficient Contrast: The Jumio SDK follows the color guidelines to have sufficient contrast. - Reduced Motion: The Jumio SDK doesn't contain any animations, which could cause discomfort. - Captions: The Jumio SDK doesn't play any videos. - Audio Descriptions: The Jumio SDK doesn't play any audio. ## Autocapture The new Autocapture experience allows users to capture multiple images within a single camera session. For example the user can be guided to first capture the front of a document, then flip the document and capture the back of a document. https://user-images.githubusercontent.com/27801945/232710790-9caf1be0-145e-4cf6-b1ff-5a7b98d4ab66.mov ## Improve User Experience and Reduce Drop-off Rate When evaluating user flows, one of the most commonly used metrics is the rate of drop-offs. At Jumio, we see considerable variance in drop-off rates across industries and customer implementations. For some implementations and industries, we see a higher rate of drop-offs on the first screens when compared with the average. Scanning an ID with sensitive personal data printed on it naturally creates a high barrier for participation on the part of the end user. Therefore, conversion rates can be significantly influenced when the application establishes a sense of trust and ensures that users feel secure sharing their information. One pattern that is recognizable throughout all of our customers’ SDK implementations: the more seamless the SDK integration, and the better job is done of setting user expectations prior to the SDK journey, the lower the drop-off rate becomes. Our SDK provides a variety of [customization options](integration_guide.md#customization) to help customers achieve a seamless integration. For customers using the standard SDK workflow, our [Surface tool](https://jumio.github.io/surface-tool/) provides an easy-to-use WYSIWYG interface to see simple customization options that can be incorporated with minimal effort and generate the code necessary to implement them. For customers who want to have more granular control over look and feel, our SDK offers the [CustomUI](integration_guide.md#custom-ui) option, which allows you to customize the entire user interface. ### Example of a Non-Ideal SDK Integration: ![Onboarding bad case](images/onboardingBadCase.jpg) - Default SDK UI is used and is presented on one of the first screens during onboarding. The user is unprepared for the next steps and might not understand the intention behind the request to show their ID. ### Suggested Improvements with Additional Customization: ![Onboarding good case](images/onboardingGoodCase.jpg) - Host application has an explanatory help screen that explains what will happen next and why this information is needed. - In `multipart` ScanParts, the user is guided to move to the next part (e.g. back side of the identity card) with an animation. The extraction should be disabled during this guidance. - SDK is either customized to have a more embedded appearance or [CustomUI](integration_guide.md#custom-ui) is used to create a completely seamless integration in the UX of our customers. - Also after the Jumio workflow that shows the displayed results and/or a message that the ID is currently verified, which might take some minutes. ## Managing Errors Not every error that is returned from the SDK should be treated the same. The [error codes listed for ID Verification](integration_guide.md#error-codes) should be handled specifically. The following table highlights the most common error codes which are returned from the SDK and explains how to handle them appropriately in your application. | Code | Cause | Recommended Handling | | :---------: | :------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- | | A[xx][yyyy] | Caused by temporary network issues like a slow connection. | Advise to check the signal and retry the SDK journey. | | E[xx][yyyy] | Flight mode is activated or no connection available. | The user should be asked to disable flight mode or to verify if the phone has proper signal. Advise to connect to WIFI and retry the SDK journey afterwards. | | G[00][0000] | The user pressed back or X to exit the SDK while no error view was presented. | Reasons for this could be manyfold. Often it might be due to the fact that the user didn't have his identity document at hand. Give the user the option to retry. | | J[xx][yyyy] | The SDK journey was not completed within the session's max. lifetime. (The default is 15 minutes.) | The user should be informed about the timeout and be directed to start a new Jumio SDK session. | ### Ad blockers or Firewall End users might face the situation where they are connected to a network that can't reach our Jumio endpoints. Possible reasons for this might be ad blockers on the device, network wide ad blockers or network specific firewall settings. In these cases the SDK will return a specific error code: A10900. If this error is received we suggest to add a screen where the user is advised to switch network and/or turn off possible ad blockers. ## Reducing the Size of Your App The Netverify SDK contains a wide range of different scanning methods. The SDK is able to capture identity documents and extract information on the device using enhanced machine learning and computer vision technologies. If you want to reduce the size of the SDK within your application, there are several ways to achieve this: ### Strip Unused Frameworks Depending on your specific needs, you may want to strip out unused functionality. As most of our frameworks can be linked optionally, you can reduce file size by simply not adding them to your project. The following table shows a range of different product configurations with the frameworks that are required and the corresponding application size. These measurements reflect the extra size that Jumio components add to your app download size and are based on our [sample application](../sample) after being uploaded to the [Appstore](https://apps.apple.com/us/app/jumio-showcase/id639531180). | Product Configuration | Size | Modules | | :-------------------- | :-----: | :----------------------------: | | Core | 3.08 MB | base | | Core + NFC | 4.94 MB | base, nfc | | Core + DefaultUI | 4.42 MB | base, defaultUI | | Core + Liveness | 4.96 MB | base, liveness | | Core + all | 8.16 MB | base, nfc, defaultUI, liveness | In case you use a combination of these products, make sure to add frameworks only once to your app and that those frameworks are linked and embedded in your Xcode project. ## Jumio Authentication Workflow Integration Jumio Authentication can be used for any use case in which you want your end-users to confirm their identities. As a result of the Authentication journey you get a success or failed result back from the SDK or from our server (callback or retrieval). In case of a **successful result** you can grant the user access to your service or let him proceed with the user flow. In case of a **failed result**, a proper retry handling within your workflow is necessary. A failure could occur because of the following reasons: - The user presenting their face is a different one than the user who owns the account - An imposter is trying to spoof the liveness check - User does not want to show their face at all, but is still trying to complete the onboarding - User does not look straight into the camera - User does not finish the first or second step of face scan - User has bad lighting conditions (too dark, too bright, reflections on face, not enough contrast, …) - User is covering (parts) of their face with a scarf, hat or something similar - A different person is scanning their face in the second step than in the first one - User is not able to align his face with the oval presented during scanning In case an Authentication fail is returned, we recommend to allow the user between 3-5 Authentication attempts to prove their identity, before you lock the user from performing the action. This approach makes the most sense, as you don't want to lock out possible valid users who might not have completed the face capture task successfully for a legitimate reason. Don't worry about offering a potential fraudster more attempts to gain access to your system - our bullet proof liveness check does not allow them to get a successful result. ## Fallback and Manual Capturing The variable [`hasFallback`](https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Part.html#/s:5JumioAAV4ScanV4PartC11hasFallbackSbvp) determines if a fallback for the current scan mode is available and returns a boolean. If the method returns true, the available fallback scan mode will have to be started with the method [`fallback()`](https://jumio.github.io/mobile-sdk-ios/Jumio/Structs/Jumio/Scan/Part.html#/s:5JumioAAV4ScanV4PartC8fallbackyyF). The variable [`isShutterEnabled`](https://jumio.github.io/mobile-sdk-ios/Jumio/Classes/JumioScanView.html#/s:5Jumio0A8ScanViewC16isShutterEnabledSbvp) determines if a shutter button needs to be shown because the image has to be taken manually and returns a boolean. If the method returns true, you will have to display your own shutter button and call the method [`takePicture()`](https://jumio.github.io/mobile-sdk-ios/Jumio/Classes/JumioScanView.html#/s:5Jumio0A8ScanViewC11takePictureyyF) once it is clicked. :::note Please note that the variable `isShutterEnabled` does neither create nor display the actual shutter button! ::: "Manual capturing" simply refers to the user being able to manually take a picture. "Fallback" refers to an alternative scan mode the SDK can resort to if possible, in case there is an issue during the original scanning process. The fallback scan mode might be manual capturing in some cases, but not all. ## Language Localization Our SDK supports localization for different languages and cultures. All label texts and button titles can be changed and localized using the `Localizable-Jumio.strings` file. Just adapt the values to your required language, add it to your app or framework project and mark it as Localizable. This way, when upgrading our SDK to a newer version your localization file won't be overwritten. Make sure, that the content of this localization file is up to date after an SDK update. If you're having issues with Localization, please refer to our [Known Issues](known_issues.md#language-localization-issues) :::note If using CocoaPods, the original file is located under `/Pods/Jumio/Localization`. ::: Currently, the following languages are automatically supported for your convenience: [supported languages](../README_iOS.md#language-localization) Runtime language changes _within_ the SDK or separate language support (meaning the SDK language differs from the overall device languages) is not possible. ### Accessibility Our SDK supports accessibility features. Visually impaired users can enable **VoiceOver** or increase **text size** on their device. VoiceOver uses separate values in the localization file, which can be customized. ## Overview of Scanning Methods #### Autocapture Combines all previously existing scanning methods into one automatic, seamless experience.
Autocapture Success Autocapture Scanning
#### Barcode PDF417 barcode data extraction, for example from US and Canadian driver licenses.
Barcode Empty Barcode Document
#### Manual Capture Manual scanning (taking a picture) using the shutterbutton, fallback option in case user is having trouble.
Manual Capture Empty Manual Capture Document
#### Enhanced Injection Detection You may see additional detection screens during the ID Scan process. This is expected behavior and is part of Jumio's enhanced fraud protection measures.
Enhanced Injection Detection Enhanced Injection Detection
## Glossary A [quick guide to commonly used abbreviations](integration_glossary.md) throughout the documentation which may not be all that familiar. ## Simulator Support We don't support the use of the Jumio SDK on simulator, please only run it on physical devices. When running Jumio SDK in Default UI, an empty ViewController will be presented. When running Jumio SDK in Custom UI, the SDK won't provide any functionality. ## Jumio Support The Jumio development team is constantly striving to optimize the size of our frameworks while increasing functionality, to improve your KYC and to fight fraud. If you have any further questions, please reach out to our [support team](https://www.jumio.com/contact/support). --- # Changelog https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-ios-master/docs/changelog ![Header Graphic](images/jumio_feature_graphic.jpg) [Improvement]: https://img.shields.io/badge/Improvement-green 'Improvement shield' [Change]: https://img.shields.io/badge/Change-blue 'Change shield' [Fix]: https://img.shields.io/badge/Fix-success 'Fix shield' # Change Log All notable changes, such as SDK releases, updates and fixes, are documented in this file. For detailed technical changes please refer to our [Transition Guide](transition_guide.md). ## Support Period Current SDK version: __4.18.0__ Please refer to our [SDK maintenance and support policy](maintenance_policy.md) for more information about Mobile SDK maintenance and support. ## SDK Version: 4.18.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for Global Digital ID Acceptance ![Improvement](https://img.shields.io/badge/Improvement-green) Added controls for limiting and preventing Manual Capture (ID and Selfie) ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for localized default consent links ## SDK Version: 4.17.2 ![Fix](https://img.shields.io/badge/Fix-success) Readded CFBundleShortVersionString to JumioLivenessClient.xcframework ## SDK Version: 4.17.1 ![Fix](https://img.shields.io/badge/Fix-success) x86_64 simulator crash fix ## SDK Version: 4.17.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for the Selfie.Done workflow ![Improvement](https://img.shields.io/badge/Improvement-green) Redesigned loading screens ## SDK Version: 4.16.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Redesign of the ID Autocapture user experience ![Improvement](https://img.shields.io/badge/Improvement-green) Support for image upload for DocProof workflows ![Improvement](https://img.shields.io/badge/Improvement-green) Support for Liveness capture using back camera ![Improvement](https://img.shields.io/badge/Improvement-green) Added separate NFC package ## SDK Version: 4.15.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for NFC read-only scanning. ![Improvement](https://img.shields.io/badge/Improvement-green) Introduced a configurable max retry count for NFC scanning. ![Improvement](https://img.shields.io/badge/Improvement-green) Included NFC scanning result status in transaction details via the Retrieval API. ![Improvement](https://img.shields.io/badge/Improvement-green) Enhanced user experience for NFC scanning with automatic NFC chip location detection. ## SDK Version: 4.14.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added enhanced virtual camera injection detection [ID Verification, Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Accessibility updates for compliance with WCAG 2.2 AA and EAA ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for Digital Identity using eIDAS for selected countries [ID Verification] ## SDK Version: 4.13.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for NFC extraction of Chilean IDs ![Fix](https://img.shields.io/badge/Fix-success) Various bug fixes and improvements ## SDK Version: 4.12.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for Jumio Liveness Premium with enhanced deepfake detection [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added support for Brazilian Digital Driver's License [ID Verification] ## SDK Version: 4.11.1 ![Fix](https://img.shields.io/badge/Fix-success) Removed Datadog from default podspec [ID Verification, Selfie Verification, Document Verification] ## SDK Version: 4.11.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added tilted image capture for frontside of ID documents. Enhanced checks of certain document security features [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added unsupported documents check to improve quality of extracted data and improve user experience [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added an Updated Authentication Service [Selfie Verification] ## SDK Version: 4.10.1 ![Fix](https://img.shields.io/badge/Fix-success) Removed Datadog from default podspec [ID Verification, Selfie Verification, Document Verification] ## SDK Version: 4.10.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Support for 4k Image capture. Improved ML model input, enhanced image and fraud checks [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added flash capture for frontside of ID documents. Enhanced checks of certain document security features [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Support for Serbian language, for both Cyrillic and Latin [ID Verification, Selfie Verification, Document Verification] ## SDK Version: 4.9.1 ![Fix](https://img.shields.io/badge/Fix-success) iOS 12 app startup crash fixed [ID Verification] ## SDK Version: 4.9.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added possibility to pre-load required ML models. For more information checkout the according section in the [README](../README_iOS.md#ml-models) [ID Verification, Identity Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Automated document and country selection, powered by classifer ML model [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Major UI Redesign [ID Verification, Selfie Verification, Document Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Improved Liveness retry logic. Prepared for granular instant feedback, if configured accordingly [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 11.0.3 [Selfie Verification] ![Change](https://img.shields.io/badge/Change-blue) Default UI implementation moved to its own dynamic framework, see: [Transition Guide](transition_guide.md). [Selfie Verification] ![Change](https://img.shields.io/badge/Change-blue) Removed Device Risk module from SDK [Selfie Verification] ## SDK Version: 4.8.1 ![Improvement](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 10.3.3 [Selfie Verification] ## SDK Version: 4.8.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Managing Liveness dependencies to help better conversion ## SDK Version: 4.7.1 ![Improvement](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 10.3.3 [Selfie Verification] ## SDK Version: 4.7.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Datadog SDK version update to 2.0: Added possibility to have two Datadog instances at the same time. Added SPM and Carthage support for Datadog ![Change](https://img.shields.io/badge/Change-blue) Removed previous scanning functionalities, now all included in Autocatpure functionality [ID Verification] ![Change](https://img.shields.io/badge/Change-blue) Pod Jumio/DeviceRisk excluded from pod Jumio/All. ![Change](https://img.shields.io/badge/Change-blue) MRZ functionality moved to Jumio core. ![Change](https://img.shields.io/badge/Change-blue) Barcode functionality was moved to Jumio core. ## SDK Version: 4.6.2 ![Improvement](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 10.3.3 [Selfie Verification] ## SDK Version: 4.6.1 ![Improvement](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 10.3.1 [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added Apple Privacy Manifest ![Change](https://img.shields.io/badge/Change-blue) Pod Jumio/DeviceRisk was excluded from pod Jumio/All. ## SDK Version: 4.6.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added Jumio Liveness module to enhance the Liveness user experience and interface [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Improved Liveness customization options [Selfie Verification] ![Change](https://img.shields.io/badge/Change-blue) Dependency name for iProov liveness was changed, see: [Transition Guide](transition_guide.md). [Selfie Verification] ## SDK Version: 4.5.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Added possibility for users to verify their identity using [Digital Identity](../README_iOS.md#digital-identity) [ID Verification, Identity Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) iProov SDK version update to 10.1.3 [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Improved user consent handling in accordance with biometric data protection laws [ID Verification, Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Improvement Added Carthage as new option for dependency manager ![Fix](https://img.shields.io/badge/Fix-success) Bug fixes: UI bugs [ID Verification]
More details ### User consent User consent is now acquired for all users to ensure the accordance with biometric data protection laws. Please also refer to the [User Consent section](integration_faq.md#user-consent) in our FAQ.
## SDK Version: 4.4.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Fully redesigned ID Autocapture experience - seamless capturing, precise guidance and faster user journey [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Major iProov SDK version update to 10.1.0 - no more face scanning filter, improved UI and more customization options [Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Mandatory NFC scanning option [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Added iOS 11+ Simulator and M1 (Apple silicon) support ![Improvement](https://img.shields.io/badge/Improvement-green) Added Swift Package Manager (SPM) as new option for dependency manager ![Fix](https://img.shields.io/badge/Fix-success) Bug fixes: UI bugs, internal crashes
More details ### Autocapture The new Autocapture experience allows users to capture multiple images within a single camera session. For example the user can be guided to first capture the front of a document, then flip the document and capture the back of a document. Please also refer to the [Autocapture section](integration_faq.md#autocapture) in our FAQ. ### iOS Simulator The Jumio SDK is now buildable with all Simulator iOS versions, but to really perform a scan you still need to use a physical device.
## SDK Version: 4.3.1 ![Fix](https://img.shields.io/badge/Fix-success) Fixed camera focus issue with iPhone 14 Pro ## SDK Version: 4.3.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Alignment of previously existing scanning method and improved user experience through addition of Autocapture module [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) [Document Verification](../README_iOS.md#document-verification) functionality added ![Improvement](https://img.shields.io/badge/Improvement-green) Improved user guidance: Clear distinction between scanning frontside or backside of ID document [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Addition of optional Datadog diagnostics module for monitoring SDK behavior and performance, as well as more efficient troubleshooting ![Change](https://img.shields.io/badge/Change-blue) iProov SDK version update to 9.5.0 [Selfie Verification] ![Fix](https://img.shields.io/badge/Fix-success) UI bugs, internal crashes [Selfie Verification] ## SDK Version: 4.2.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Support for device fingerprint capability [ID Verification, Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Improved NFC image extraction, it's now possible to extract selfie for similarity check [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Improved liveness customization: Centered Floating prompt for better user guidance during face scanning [Selfie Verification] ![Fix](https://img.shields.io/badge/Fix-success) Bug fixes: UI bugs, internal crashes, security patches ## SDK Version: 4.1.2 ![Fix](https://img.shields.io/badge/Fix-success) Fixed NFC library handling ## SDK Version: 4.1.1 ![Improvement](https://img.shields.io/badge/Improvement-green) Improved customization options [ID Verification, Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Support for ObjectiveC for DefaultUI [ID Verification, Selfie Verification] ![Change](https://img.shields.io/badge/Change-blue) iProov SDK version update to 9.3.2 [Selfie Verification] ![Fix](https://img.shields.io/badge/Fix-success) Bug fixes: UI bugs ## SDK Version: 4.1.0 ![Improvement](https://img.shields.io/badge/Improvement-green) Improved, granular user feedback for improved user experience and workflow through addition of Instant Feedback [ID Verification, Selfie Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Addition of NFC functionality to improve data extraction for documents [ID Verification] ![Improvement](https://img.shields.io/badge/Improvement-green) Addition of iPad support [ID Verification, Selfie Verification] ![Change](https://img.shields.io/badge/Change-blue) iProov SDK version update to 9.2.0 [Selfie Verification] ![Fix](https://img.shields.io/badge/Fix-success) Bug fixes: UI bugs, security improvements, internal crashes ## SDK Version: 4.0.0 This is a complete rewrite of our SDK. The SDK was built with Custom UI as a basis and restructured to align Android and iOS to reduce overall complexity and integration effort. ![Improvement](https://img.shields.io/badge/Improvement-green) Improved security by switching to one-time authorization tokens for SDK initialization instead of relying on API token and secret ![Improvement](https://img.shields.io/badge/Improvement-green) Redesigned Default UI flow ![Improvement](https://img.shields.io/badge/Improvement-green) Slimline SDK configuration of only 2.8 MB size ![Improvement](https://img.shields.io/badge/Improvement-green) Improved data extraction via enhancing the SDK capabilities with server-side extraction capabilities ![Improvement](https://img.shields.io/badge/Improvement-green) Manual capture is now available as a fallback option for all other capture methods ## Contact If you have any questions regarding our implementation guide please contact Jumio Customer Service at support@jumio.com. The Jumio online helpdesk contains a wealth of information regarding our service including demo videos, product descriptions, FAQs and other things that may help to get you started with Jumio. [Check it out at here.](https://support.jumio.com). --- # Maintenance Policy https://documentation.jumio.ai/docs/developer-resources/SDKs/mobile-sdk/mobile-sdk-ios-master/docs/maintenance_policy ![Header Graphic](images/jumio_feature_graphic.jpg) # Maintenance and Support Policy ## Overview This document outlines the maintenance policy for Jumio’s Software Development Kits (“SDKs”), including Mobile and Web SDK and their dependencies. Our SDK releases are published publicly as indicated in our documentation as well as to package managers. Documentation and sample implementations are available as source code on GitHub ([Android](https://github.com/Jumio/mobile-sdk-android) and [iOS](https://github.com/Jumio/mobile-sdk-ios)). We are consistently updating the Jumio SDKs in order to provide the best possible experience for you. Upgrading to the latest SDK version will not only ensure you benefit from various performance enhancements and bug fixes, but will also allow you to take advantage of new capabilities. All releases undergo comprehensive testing by our teams before being deployed. If you are using a Mobile SDK, please ensure your apps have been released and your end-users have updated before the End-of-Support date. Jumio does not provide support after the End-of-Support date. Customers should review the [Jumio Terms and Conditions](https://www.jumio.com/legal-information/privacy-notices/) for requirements related to the implementation of updates. ## Versioning Jumio SDK release versions are in the form of X.Y.Z: - X major version - very rarely updated - Y minor version - normally updated once in a quarter - Z patch version - updated on demand Major versions of Jumio’s SDKs are released rarely, and only in case of substantial changes to support new features and patterns. Breaking changes can happen in Major and Minor versions. Applications need to be updated in order for them to work with the newest SDK version. Breaking changes are highlighted in our [Android](https://github.com/Jumio/mobile-sdk-android) and [iOS](https://github.com/Jumio/mobile-sdk-ios) implementation guides for each release. Jumio will only provide patches or additional updates on the latest version regardless if it’s Major, Minor or Patch. ## SDK Version Lifecycle The life-cycle for SDK versions consists of these phases, which are outlined below: - **Developer Preview** (Phase 0) - During this phase, SDKs are not supported, must not be used in production environments, and are meant for early access and feedback purposes only. It is possible for future releases to introduce breaking changes. It can be alpha, beta, or release candidate. - **General availability / Full support** (Phase 1) - During this phase, SDKs are fully supported. Jumio will provide active support on this version and will provide required bug fixes or security fixes within new / upcoming versions (major, minor, patch). - **End-of-Support** (Phase 2) - Each SDK version reaches end of support 9 months after the release date. Issues that appear after the End-of-Support date will only be addressed in the upcoming SDK releases. Previously published releases will continue to be available via public package managers and the code will remain on GitHub. Use of an SDK that has reached End-of-Support is done at the business customers’ discretion. We recommend upgrading to the latest version. - **End-of-Life** (Phase 3) - By default, our SDK will reach the end of life 24 months after the release date. The SDK may continue to work but Jumio will no longer provide support or updates. Customers will be notified at least 3 months prior to the end of life of a product should it be less than 24 months. The following table is a visual representation of the SDK 4.x.x version life-cycle. SDK 3.x.x has reached its End-of-Life on December 31, 2023. | Version | Release | End of Support | End of Life | | :-----: | :---------------: | :---------------: | :---------------: | | 4.18.0 | 10 July 2026 | 10 April 2027 | 10 July 2028 | | 4.17.2 | 19 May 2026 | 16 December 2026 | 16 March 2028 | | 4.17.1 | 30 April 2026 | 16 December 2026 | 16 March 2028 | | 4.17.0 | 16 March 2026 | 16 December 2026 | 16 March 2028 | | 4.16.0 | 10 February 2026 | 10 November 2026 | 10 February 2028 | | 4.15.0 | 10 October 2025 | 10 July 2026 | 10 October 2027 | | 4.14.0 | 03 September 2025 | 03 June 2026 | 03 September 2027 | | 4.13.0 | 04 April 2025 | 04 January 2026 | 04 April 2027 | | 4.12.0 | 05 December 2024 | 05 September 2025 | 05 December 2026 | | 4.11.0 | 19 August 2024 | 19 May 2025 | 19 August 2026 | | 4.10.0 | 05 June 2024 | 5 March 2025 | 5 June 2026 | | 4.9.1 | 13 March 2024 | 21 November 2024 | 21 February 2026 | | 4.9.0 | 21 February 2024 | 21 November 2024 | 21 February 2026 | | 4.8.0 | 17 October 2023 | 17 July 2024 | 17 October 2025 | | 4.7.0 | 27 September 2023 | 27 June 2024 | 27 September 2025 | | 4.6.1 | 05 September 2023 | 05 March 2024 | 05 June 2025 | | 4.6.0 | 05 June 2023 | 05 March 2024 | 05 June 2025 | | 4.5.0 | 14 April 2023 | 14 January 2024 | 14 April 2025 | | 4.4.0 | 21 December 2022 | 21 September 2023 | 21 December 2024 | | 4.3.1 | 25 October 2022 | 30 May 2023 | 30 August 2024 | | 4.3.0 | 30 August 2022 | 30 May 2023 | 30 August 2024 | | 4.2.0 | 25 May 2022 | 25 February 2023 | 25 May 2024 | | 4.1.2 | 19 April 2022 | 09 December 2022 | 09 March 2024 | | 4.1.1 | 04 April 2022 | 09 December 2022 | 09 March 2024 | | 4.1.0 | 09 March 2022 | 09 December 2022 | 09 March 2024 | | 4.0.0 | 16 November 2021 | 16 August 2022 | 16 November 2023 | ## Upgrade & Maintenance Practices - Follow Semantic Versioning and test updates in staging. - Monitor documentation (https://github.com/Jumio/mobile-sdk-ios/releases) for changes and depreciation notices. - Perform regression testing after upgrades. ## Troubleshooting - Enable debug logging in dev mode only: -- NetverifyConfiguration().debugMode = true - Share workflowExecutionId, app version, OS, device, timestamp, and screenshots with support. --- # Cross-Platform References https://documentation.jumio.ai/docs/developer-resources/SDKs/crossplatform/CrossPlatform_Intro # Cross-Platform Integration Overview Jumio supports multiple cross-platform mobile frameworks to help developers integrate identity verification into hybrid or multi-platform apps. This page outlines the current level of support for the following, - [React Native](../crossplatform/mobile-react-master/README_React) - [Apache Cordova](../crossplatform/mobile-cordova-master/README_Cordova) - [Flutter](../crossplatform/mobile-flutter-master/README_Flutter) --- # Plugin for React Native https://documentation.jumio.ai/docs/developer-resources/SDKs/crossplatform/mobile-react-master/README_React # Plugin for React Native Official Jumio Mobile SDK plugin for React Native This plugin is compatible with version 4.13.0 of the Jumio SDK. If you have questions, please reach out to your Account Manager or contact [Jumio Support](https://www.jumio.com/contact/support/). ## Compatibility We only ensure compatibility with a minimum React Native version of 0.79.1 ## Recent Release :::important - **Learn about the latest releases [here](https://github.com/Jumio/mobile-react/releases)**. - **To know more about the setup, click [here](https://github.com/Jumio/mobile-react)**. ::: ## Setup Create React Native project and add the Jumio Mobile SDK module to it, **learn [more](https://github.com/Jumio/mobile-react).** ```sh react-native init MyProject cd MyProject npm install --save https://github.com/Jumio/mobile-react.git#v4.13.0 cd ios && pod install ``` ## Integration ### iOS 1. Add the "**NSCameraUsageDescription**"-key to your Info.plist file. 2. Your app's deployment target must be at least iOS 13.0 #### NFC Check out the [NFC setup guide](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/integration_guide.md#nfc-setup). #### Digital Identity Check out the [Digital Identity setup guide](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/integration_guide.md#digital-identity-setup). #### Device Risk To include Jumio's Device Risk functionality, you need to add `pod Jumio/DeviceRisk` to your Podfile. ### Android **AndroidManifest** Open your AndroidManifest.xml file and change `allowBackup` to false. ```` ```xml ```` ```` Make sure your compileSdkVersion and buildToolsVersion are high enough. ```groovy android { compileSdkVersion 33 buildToolsVersion "33.0.0" ... } ```` **Enable MultiDex** Follow the Android developers guide: https://developer.android.com/studio/build/multidex.html ```groovy android { ... defaultConfig { ... multiDexEnabled true } } ``` **Upgrade Gradle build tools** The plugin requires at least version 8.0.0 of the Android build tools. This transitively requires and upgrade of the Gradle wrapper to version 8 and an update to Java 11. Upgrade build tools version to 8.7.3 in android/build.gradle: ```groovy buildscript { ... dependencies { ... classpath 'com.android.tools.build:gradle:8.7.3' } } ``` If necessary, modify the Gradle Wrapper version in android/gradle.wrapper/gradle-wrapper.properties: ``` distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip ``` **Repository** Add the Jumio Mobile SDK repository: ```groovy exclusiveContent { forRepository { maven { url 'https://repo.mobile.jumio.ai' } } filter { includeGroup "com.jumio.android" includeGroup "com.iproov.sdk" } } ``` #### Proguard For information on Android Proguard Rules concerning the Jumio SDK, please refer to our [Android guides](https://github.com/Jumio/mobile-sdk-android#proguard). ## Usage 1. Add **"NativeModules"** to the import of 'react-native'. ```javascript import { ... NativeModules } from 'react-native'; ``` 2. Create a variable of your iOS module: ```javascript const {JumioMobileSDK} = NativeModules; ``` 3. The SDKs can be initialized with the following calls. ```javascript `JumioMobileSDK.initialize(, );`; ``` Datacenter can either be **US**, **EU** or **SG**. For more information about how to obtain an `AUTHORIZATION_TOKEN`, please refer to our [API Guide](https://documentation.jumio.ai/docs/developer-resources/API/authorization). As soon as the SDK is initialized, the SDK is started by the following call. ```javascript JumioMobileSDK.start(); ``` Optionally, it is possible to check whether a device is rooted / jailbroken with the following method: ```javascript const isRooted = await JumioMobileSDK.isRooted(); ``` ### Retrieving information You can listen to events to retrieve the scanned data: - `EventResult` for Jumio results. - `EventError` for Jumio error. First add `NativeEventEmitter` to the import from 'react-native' and listen to the events. ```javascript import { ... NativeEventEmitter } from 'react-native'; ``` The event receives a JSON object with all the data. The example below shows how to retrieve the information of each emitter as a String: ```javascript const emitterJumio = new NativeEventEmitter(JumioMobileSDK); emitterJumio.addListener('EventResult', EventResult => console.warn('EventResult: ' + JSON.stringify(EventResult))); emitterJumio.addListener('EventError', EventError => console.warn('EventError: ' + JSON.stringify(EventError))); ``` ## Customization ### Android JumioSDK Android appearance can be customized by overriding the custom theme `AppThemeCustomJumio`. A customization example of all values can be found in the [`styles.xml`](DemoApp/android/app/src/main/res/values/styles.xml) of the DemoApp. ### iOS JumioSDK iOS appearance can be customized to your respective needs. You can customize each color based on the device's set appearance, for either Dark mode or Light mode, or you can set a single color for both appearances. Customization is optional and not required. You can pass the following customization options to the [`setupCustomizations()`](DemoApp/index.js#L30) function: | Customization key | | :---------------------------------------------- | | facePrimary | | faceSecondary | | faceOutline | | faceAnimationForeground | | iProovFilterForegroundColor | | iProovFilterBackgroundColor | | iProovTitleTextColor | | iProovCloseButtonTintColor | | iProovSurroundColor | | iProovPromptTextColor | | iProovPromptBackgroundColor | | genuinePresenceAssuranceReadyOvalStrokeColor | | genuinePresenceAssuranceNotReadyOvalStrokeColor | | livenessAssuranceOvalStrokeColor | | livenessAssuranceCompletedOvalStrokeColor | | primaryButtonBackground | | primaryButtonBackgroundPressed | | primaryButtonBackgroundDisabled | | primaryButtonForeground | | primaryButtonForegroundPressed | | primaryButtonForegroundDisabled | | primaryButtonOutline | | secondaryButtonBackground | | secondaryButtonBackgroundPressed | | secondaryButtonBackgroundDisabled | | secondaryButtonForeground | | secondaryButtonForegroundPressed | | secondaryButtonForegroundDisabled | | secondaryButtonOutline | | bubbleBackground | | bubbleForeground | | bubbleBackgroundSelected | | bubbleOutline | | loadingCirclePlain | | loadingCircleGradientStart | | loadingCircleGradientEnd | | loadingErrorCircleGradientStart | | loadingErrorCircleGradientEnd | | loadingCircleIcon | | scanOverlay | | scanOverlayBackground | | nfcPassportCover | | nfcPassportPageDark | | nfcPassportPageLight | | nfcPassportForeground | | nfcPhoneCover | | scanViewTooltipForeground | | scanViewTooltipBackground | | scanViewForeground | | scanViewDocumentShutter | | scanViewFaceShutter | | searchBubbleBackground | | searchBubbleForeground | | searchBubbleOutline | | confirmationImageBackground | | confirmationImageBackgroundBorder | | confirmationIndicatorActive | | confirmationIndicatorDefault | | confirmationImageBorder | | background | | navigationIconColor | | textForegroundColor | | primaryColor | | selectionIconForeground | All colors are provided with a HEX string in the following formats: `#ff00ff` or `#66ff00ff` if you want to set the alpha level. **Customization example** Example for setting color based on Dark or Light mode: ``` JumioMobileSDK.setupCustomizations({ primaryColor: { light:"ffffff", dark:"000000" } primaryButtonBackground: { light:ffffff, dark:"000000" } }); ``` Example for setting same color for both Dark and Light mode: ``` JumioMobileSDK.setupCustomizations({ primaryColor: "ffffff" primaryButtonBackground: "ffffff" }); ``` ## Configuration For more information about how to set specific SDK parameters (callbackUrl, userReference, country, ...), please refer to our [API Guide](https://documentation.jumio.ai/docs/developer-resources/API/). ## Callbacks In oder to get information about result fields, Retrieval API, Delete API, global settings and more, please read our [page with server related information](https://jumio.github.io/kyx/integration-guide.html#callback). ## Result Objects The JSON object with all the extracted data that is returned for the specific products is described in the following subchapters: ### EventResult | Parameter | Type | Max. length | Description | | :---------------------- | :------- | :---------- | :--------------------------------------------------------------------------------------------------------- | | selectedCountry | String | 3 | [ISO 3166-1 alpha-3](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) country code as provided or selected | | selectedDocumentType | String | 16 | PASSPORT, DRIVER_LICENSE, IDENTITY_CARD or VISA | | selectedDocumentSubType | String | | Sub type of the scanned ID | | idNumber | String | 100 | Identification number of the document | | personalNumber | String | | Personal number of the document | | issuingDate | Date | | Date of issue | | expiryDate | Date | | Date of expiry | | issuingCountry | String | 3 | Country of issue as ([ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3)) country code | | lastName | String | 100 | Last name of the customer | | firstName | String | 100 | First name of the customer | | dob | Date | | Date of birth | | gender | String | 1 | m, f or x | | originatingCountry | String | 3 | Country of origin as ([ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3)) country code | | addressLine | String | 64 | Street name | | city | String | 64 | City | | subdivision | String | 3 | Last three characters of [ISO 3166-2:US](http://en.wikipedia.org/wiki/ISO_3166-2:US) state code | | postCode | String | 15 | Postal code | | mrzData | MRZ-DATA | | MRZ data, see table below | | optionalData1 | String | 50 | Optional field of MRZ line 1 | | optionalData2 | String | 50 | Optional field of MRZ line 2 | | placeOfBirth | String | 255 | Place of Birth | ### MRZ-Data | Parameter | Type | Max. length | Description | | :------------------ | :----- | :---------- | :----------------------------------------------------------------------------- | | format | String | 8 | MRP, TD1, TD2, CNIS, MRVA, MRVB or UNKNOWN | | line1 | String | 50 | MRZ line 1 | | line2 | String | 50 | MRZ line 2 | | line3 | String | 50 | MRZ line 3 | | idNumberValid | BOOL | | True if ID number check digit is valid, otherwise false | | dobValid | BOOL | | True if date of birth check digit is valid, otherwise false | | expiryDateValid | BOOL | | True if date of expiry check digit is valid or not available, otherwise false | | personalNumberValid | BOOL | | True if personal number check digit is valid or not available, otherwise false | | compositeValid | BOOL | | True if composite check digit is valid, otherwise false | ## Local Models for ID Verification and Liveness Our SDK requires several machine learning models to work best. We recommend to download the files and add them to your project without changing their names (the same way you add Localization files). This will save two network requests on runtime to download these files. ### Preloading models You can preload the ML models before initializing the Jumio SDK. To do so set the completion block with `JumioMobileSDK.setPreloaderFinishedBlock` and start the preloading with `JumioMobileSDK.preloadIfNeeded`. ### iOS You can find the models in the [Bundling models in the app](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/integration_guide.md#bundling-models-in-the-app) section of our integration guide. You also need to copy those files to the "ios/Assets" folder for React to recognize them. ### Android You can find the models in the [Bundling models in the app](https://github.com/Jumio/mobile-sdk-android/blob/master/docs/integration_guide.md#bundling-models-in-the-app) section of our integration guide. You need to copy those files to the assets folder of your Android project (Path: "app/src/main/assets/"). ## FAQ ### Face help animation breaks on Android If face help animation looks as expected in debug builds, but breaks in release builds, please make sure to include the following rule in your [**Proguard** file](DemoApp/android/app/proguard-rules.pro): ``` `-keep class androidx.constraintlayout.motion.widget.** { *; }` ``` ### iOS Simulator shows a white-screen, when the Jumio SDK is started The Jumio SDK does not support the iOS Simulator. Please run the Jumio SDK only on physical devices. ### iOS Runs on Debug, Crashes on Release Build This happens due to Xcode 13 introducing a new option to their **App Store Distribution Options**: **"Manage Version and Build Number"** (see image below) If checked, this option changes the version and build number of all content of your app to the overall application version, including third-party frameworks. **This option is enabled by default.** Please make sure to disable this option when archiving / exporting your application to the App Store. Otherwise, the Jumio SDK version check, which ensures all bundled frameworks are up to date, will fail. ![Xcode13 Issue](images/known_issues_xcode13.png) Alternatively, it is also possible to set the key `manageAppVersionAndBuildNumber` in the **exportOptions.plist** to `false`: ``` `manageAppVersionAndBuildNumber` `` ``` ### Using iOS Dynamic Frameworks with React Native Sample App Jumio SDK version 3.8.0 and newer use iProov dependencies that need need to be built as dynamic frameworks. Since React Native supports only static libraries, a pre-install hook has been added to ensure that pods added as `dynamic_frameworks` are actually built as dynamic frameworks, while all other pods are built as static libraries. ``` pre_install do |installer| installer.pod_targets.each do |pod| puts "Overriding the static_framework? method for #{pod.name}" def pod.static_framework?; true end def pod.build_type; Pod::BuildType.static_library end end end ``` Additionally, a post install hook needs to be added to the Podfile to ensure dependencies are build for distribution: ``` post_install do |installer| installer.pods_project.targets.each do |target| if ['iProov', 'DatadogRUM', 'DatadogCore', 'DatadogInternal'].include? target.name target.build_configurations.each do |config| config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES' end end end end ``` ### iOS Crashes on Start with Xcode 15 If you are working with Xcode 15 and above, please make sure the following lines have been added to your `Podfile`: ``` post_install do |installer| installer.pods_project.targets.each do |target| if ['iProov', 'DatadogRUM', 'DatadogCore', 'DatadogInternal'].include? target.name target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0' end end end end ``` Please refer to the iOS section of our [DemoApp guide](DemoApp/README.md#iOS) for additional details. ### iOS Build Fails for React 0.71.2 `use_frameworks!` needs to be included in the `Podfile` and properly executed in order for Jumio dynamic frameworks to install correctly. Make sure [the necessary `pre_install` and `post_install` hooks](#using-ios-dynamic-frameworks-with-react-native-sample-app) have been included. Also make sure that [Flipper](https://fbflipper.com/) is disabled for your project, since Flipper is not compatible with iOS dynamic frameworks at the moment. Please also refer to the [Podfile](DemoApp/ios/Podfile) of our sample application for further details. ### iOS Localization After installing Cocoapods, please localize your iOS application using the languages provided at the following path: `ios -> Pods -> Jumio -> Localization -> xx.lproj` ![Localization](images/RN_localization.gif) Make sure your `Podfile` is up to date and that new pod versions are installed properly so your `Localizable` files include new strings. For more information, please refer to our [Changelog](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/changelog.md) and [Transition Guide](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/transition_guide.md). # Support ## Contact If you have any questions regarding our implementation guide please contact Jumio Customer Service at support@jumio.com or https://support.jumio.com. The Jumio online helpdesk contains a wealth of information regarding our service including demo videos, product descriptions, FAQs and other things that may help to get you started with Jumio. Check it out at: https://support.jumio.com. --- # Plugin for Apache Cordova https://documentation.jumio.ai/docs/developer-resources/SDKs/crossplatform/mobile-cordova-master/README_Cordova # Plugin for Apache Cordova Official Jumio Mobile SDK plugin for Apache Cordova This plugin is compatible with version 4.13.0 of the Jumio SDK. If you have questions, please reach out to your Account Manager or contact [Jumio Support](https://www.jumio.com/contact/support/). ## Compatibility With this release, we only ensure compatibility with the latest Cordova versions and plugins. At the time of this release, the following minimum versions are supported: - Cordova: 12.0.0 - Cordova Android: 14.0.0 - Cordova iOS: 7.1.1 ## Recent Release :::important - **Learn about the latest releases [here](https://github.com/Jumio/mobile-cordova/releases)**. - **To know more about the setup, click [here](https://github.com/Jumio/mobile-react)**. ::: ## Setup Create Cordova project and add our plugin, **learn [more](https://github.com/Jumio/mobile-react)**. ``` cordova create MyProject com.my.project "MyProject" cd MyProject cordova platform add ios cordova platform add android cordova plugin add https://github.com/Jumio/mobile-cordova.git#v4.13.0 cd platforms/ios && pod install ``` ## Integration ### iOS Manual integration or dependency management via cocoapods possible, please see [the official documentation of the Jumio Mobile SDK for iOS](https://github.com/Jumio/mobile-sdk-ios/tree/master#basics) #### NFC Check out the [NFC setup guide](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/integration_guide.md#nfc-setup). #### Digital Identity Check out the [Digital Identity setup guide](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/integration_guide.md#digital-identity-setup). #### Device Risk To include Jumio's Device Risk functionality, you need to add `pod Jumio/DeviceRisk` to your Podfile. ### Android Add required permissions for the products as described in chapter [Permissions](https://github.com/Jumio/mobile-sdk-android/blob/master/README.md#permissions) To use the native Jumio Android component, your App needs to support AndroidX. This can be enabled by adding the following preference to your config.xml: ```xml ``` **Upgrade Gradle build tools** The plugin requires at least version 8.0.0 of the Android build tools. This transitively requires an upgrade of the Gradle wrapper to version 8 and an update to Java 11. If necessary, modify the Gradle Wrapper version in `android/gradle.wrapper/gradle-wrapper.properties`: ```groovy ... distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip ``` #### Proguard For information on Android Proguard Rules concerning the Jumio SDK, please refer to our [Android Guides](https://github.com/Jumio/mobile-sdk-android#proguard). For other build issues, refer to the The [FAQ section](#faq) at the bottom. ## Usage 1. To initialize the SDK, perform the following call. ```javascript Jumio.initialize(, ); ``` Datacenter can either be **US**, **EU** or **SG**. For more information about how to obtain an AUTHORIZATION_TOKEN, please refer to our [API Guide](https://documentation.jumio.ai/docs/developer-resources/API/authorization). 2. As soon as the SDK is initialized, the sdk is started by the following call. ```javascript Jumio.start(successCallback, errorCallback); ``` ## Customization ### Android The JumioSDK colors can be customized by overriding the custom theme `AppThemeCustomJumio`. The styles-file for Android is automatically copied to your app by the rule in the `plugin.xml`. An example customization of all values that can be found in the [jumio-styles.xml of the plugin](src/android/res/values/jumio-styles.xml) ### iOS JumioSDK iOS appearance can be customized to your respective needs. You can customize each color based on the device's set appearance, for either Dark mode or Light mode, or you can set a single color for both appearances. Customization is optional and not required. You can pass the following customization options at [`Jumio.start`](demo/www/js/index.js#L40): | Customization key | | :---------------------------------------------- | | facePrimary | | faceSecondary | | faceOutline | | faceAnimationForeground | | iProovFilterForegroundColor | | iProovFilterBackgroundColor | | iProovTitleTextColor | | iProovCloseButtonTintColor | | iProovSurroundColor | | iProovPromptTextColor | | iProovPromptBackgroundColor | | genuinePresenceAssuranceReadyOvalStrokeColor | | genuinePresenceAssuranceNotReadyOvalStrokeColor | | livenessAssuranceOvalStrokeColor | | livenessAssuranceCompletedOvalStrokeColor | | primaryButtonBackground | | primaryButtonBackgroundPressed | | primaryButtonBackgroundDisabled | | primaryButtonForeground | | primaryButtonForegroundPressed | | primaryButtonForegroundDisabled | | primaryButtonOutline | | secondaryButtonBackground | | secondaryButtonBackgroundPressed | | secondaryButtonBackgroundDisabled | | secondaryButtonForeground | | secondaryButtonForegroundPressed | | secondaryButtonForegroundDisabled | | secondaryButtonOutline | | bubbleBackground | | bubbleForeground | | bubbleBackgroundSelected | | bubbleOutline | | loadingCirclePlain | | loadingCircleGradientStart | | loadingCircleGradientEnd | | loadingErrorCircleGradientStart | | loadingErrorCircleGradientEnd | | loadingCircleIcon | | scanOverlay | | scanOverlayBackground | | nfcPassportCover | | nfcPassportPageDark | | nfcPassportPageLight | | nfcPassportForeground | | nfcPhoneCover | | scanViewTooltipForeground | | scanViewTooltipBackground | | scanViewForeground | | scanViewDocumentShutter | | scanViewFaceShutter | | searchBubbleBackground | | searchBubbleForeground | | searchBubbleOutline | | confirmationImageBackground | | confirmationImageBackgroundBorder | | confirmationIndicatorActive | | confirmationIndicatorDefault | | confirmationImageBorder | | background | | navigationIconColor | | textForegroundColor | | primaryColor | | selectionIconForeground | All colors are provided with a HEX string with the following formats: `#ff00ff` or `#66ff00ff` if you want to set the alpha level. **Customization example** Example for setting color based on Dark or Light mode ``` Jumio.start(successCallback, errorCallback, { primaryColor: { light:"ffffff", dark:"000000" } primaryButtonBackground: { light:ffffff, dark:"000000" } }); ``` Example for setting same color for both Dark and Light mode ``` Jumio.start(successCallback, errorCallback, { primaryColor: "ffffff" primaryButtonBackground: "ffffff" }); ``` ## Configuration For more information about how to set specific SDK parameters (callbackUrl, userReference, country, ...), please refer to our [API Guide](https://documentation.jumio.ai/docs/developer-resources/API/). ## Callback To get information about callbacks, Netverify Retrieval API, Netverify Delete API and Global Netverify settings and more, please read our [page with server related information](https://documentation.jumio.ai/docs/developer-resources/callback). ## Result Objects JumioSDK will return a JSONObject `documentData` with all extracted data in case of a successfully completed workflow and `error` in case of error. An error object always includes an error code and an error message. ### Result | Parameter | Type | Max. length | Description | | :---------------------- | :------- | :---------- | :--------------------------------------------------------------------------------------------------------- | | selectedCountry | String | 3 | [ISO 3166-1 alpha-3](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) country code as provided or selected | | selectedDocumentType | String | 16 | PASSPORT, DRIVER_LICENSE, IDENTITY_CARD or VISA | | selectedDocumentSubType | String | | Sub type of the scanned ID | | idNumber | String | 100 | Identification number of the document | | personalNumber | String | 14 | Personal number of the document | | issuingDate | Date | | Date of issue | | expiryDate | Date | | Date of expiry | | issuingCountry | String | 3 | Country of issue as ([ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3)) country code | | lastName | String | 100 | Last name of the customer | | firstName | String | 100 | First name of the customer | | dob | Date | | Date of birth | | gender | String | 1 | m, f or x | | originatingCountry | String | 3 | Country of origin as ([ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3)) country code | | addressLine | String | 64 | Street name | | city | String | 64 | City | | subdivision | String | 3 | Last three characters of [ISO 3166-2:US](http://en.wikipedia.org/wiki/ISO_3166-2:US) state code | | postCode | String | 15 | Postal code | | mrzData | MRZ-DATA | | MRZ data, see table below | | optionalData1 | String | 50 | Optional field of MRZ line 1 | | optionalData2 | String | 50 | Optional field of MRZ line 2 | | placeOfBirth | String | 255 | Place of Birth | _MRZ-Data_ | Parameter | Type | Max. length | Description | | :------------------ | :----- | :---------- | :----------------------------------------------------------------------------- | | format | String | 8 | MRP, TD1, TD2, CNIS, MRVA, MRVB or UNKNOWN | | line1 | String | 50 | MRZ line 1 | | line2 | String | 50 | MRZ line 2 | | line3 | String | 50 | MRZ line 3 | | idNumberValid | BOOL | | True if ID number check digit is valid, otherwise false | | dobValid | BOOL | | True if date of birth check digit is valid, otherwise false | | expiryDateValid | BOOL | | True if date of expiry check digit is valid or not available, otherwise false | | personalNumberValid | BOOL | | True if personal number check digit is valid or not available, otherwise false | | compositeValid | BOOL | | True if composite check digit is valid, otherwise false | ## Local Models for ID Verification and Liveness Our SDK requires several machine learning models to work best. We recommend to download the files and add them to your project without changing their names (the same way you add Localization files). This will save two network requests on runtime to download these files. ### Preloading models You can preload the ML models before initializing the Jumio SDK. To do so set the completion block with `JumioMobileSDK.setPreloaderFinishedBlock` and start the preloading with `JumioMobileSDK.preloadIfNeeded`. ### iOS You can find the models in the [Bundling models in the app](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/integration_guide.md#bundling-models-in-the-app) section of our integration guide. You also need to copy those files to the "ios/Assets" folder for Cordova to recognize them. ### Android You can find the models in the [Bundling models in the app](https://github.com/Jumio/mobile-sdk-android/blob/master/docs/integration_guide.md#bundling-models-in-the-app) section of our integration guide. You need to copy those files to the assets folder of your Android project (Path: "app/src/main/assets/"). # FAQ ## Android Issues This is a list of common **Android build issues** and how to resolve them: - `AAPT: error: resource android:attr/lStar not found` is resolved [in this Stackoverflow post](https://stackoverflow.com/a/70492116/1297835) - `Build-tool 32.0.0 is missing DX` (on Windows) - [in this Stackoverflow post](https://stackoverflow.com/a/68430992/1297835) - Gradle plugin 4.X not supported, please install 5.X --> Change the version in the `gradle-wrapper.properties` file - Device-ready not fired after X seconds --> The plugin definition in "YOURPROJECT/platforms/android/platform_www/plugins/cordova-plugin-jumio-mobilesdk/www" might be duplicated/corrupted due to the issue mentioned [in this Stackoverflow post](https://stackoverflow.com/questions/28017540/cordova-plugin-javascript-gets-corrupted-when-added-to-project/28264312#28264312). Please fix the duplicated `cordova.define()` call in these files as mentioned in the post. ## iOS Issues ### iOS Simulator Shows a White Screen when Jumio SDK Starts The Jumio SDK does not support the iOS Simulator. Please run the Jumio SDK only on physical devices. ### iOS Runs on Debug, Crashes on Release Build This happens due to Xcode 13 introducing a new option to their **App Store Distribution Options**: **"Manage Version and Build Number"** (see image below) If checked, this option changes the version and build number of all content of your app to the overall application version, including third-party frameworks. **This option is enabled by default.** Please make sure to disable this option when archiving / exporting your application to the App Store. Otherwise, the Jumio SDK version check, which ensures all bundled frameworks are up to date, will fail. Alternatively, it is also possible to set the key `manageAppVersionAndBuildNumber` in the **exportOptions.plist** to `false`: ``` manageAppVersionAndBuildNumber ``` ### iOS Localization After installing Cocoapods, please localize your iOS application using the languages provided at the following path: `ios -> Pods -> Jumio -> Localizations -> xx.lproj` ### Framework not found iProov.xcframework If iOS application build is failing with `ld: framework not found iProov.xcframework` or `dyld: Symbol not found: ... Referenced from: /.../Frameworks/iProov.frameworks/iProov`, please make sure the necessary post install-hook has been included in your `Podfile`: ``` post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES' end end end ``` ### Framework not found DatadogCore.xcframework If iOS application build is failing with `ld: framework not found DatadogCore.xcframework` or `dyld: Symbol not found: ... Referenced from: /.../Frameworks/DatadogCore.frameworks/DatadogCore`, please make sure the necessary post install-hook has been included in your `Podfile`: ``` post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' end end end ``` For more information, please refer to our [iOS guides](https://github.com/Jumio/mobile-sdk-ios#certified-liveness-vendor). # Support ## Contact If you have any questions regarding our implementation guide please contact Jumio Customer Service at support@jumio.com or https://support.jumio.com. The Jumio online helpdesk contains a wealth of information regarding our service including demo videos, product descriptions, FAQs and other things that may help to get you started with Jumio. Check it out at: https://support.jumio.com. --- # Plugin for Flutter https://documentation.jumio.ai/docs/developer-resources/SDKs/crossplatform/mobile-flutter-master/README_Flutter # Plugin for Flutter Official Jumio Mobile SDK plugin for Flutter This plugin is compatible with version 4.13.0 of the Jumio SDK. If you have questions, please reach out to your Account Manager or contact [Jumio Support](https://www.jumio.com/contact/support/). ## Compatibility Compatibility has been tested with a Flutter version of 3.29.3 and Dart 3.7.2 ## Recent Release :::important - **Learn about the latest releases [here](https://github.com/Jumio/mobile-flutter/releases)**. - **To know more about the setup, click [here](https://github.com/Jumio/mobile-flutter)**. ::: ## Setup Create Flutter project and add the Jumio Mobile SDK module to it. ```sh flutter create MyProject ``` Add the Jumio Mobile SDK as a dependency to your `pubspec.yaml` file: ```yaml dependencies: flutter: sdk: flutter jumio_mobile_sdk_flutter: ^4.13.0 ``` And install the dependency: ```sh cd MyProject flutter pub get cd ios && pod install ``` ## Integration ### iOS 1. Add the "**NSCameraUsageDescription**"-key to your Info.plist file. 2. Your app's deployment target must be at least iOS 11.0 #### NFC Check out the [NFC setup guide](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/integration_guide.md#nfc-setup). #### Digital Identity Check out the [Digital Identity setup guide](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/integration_guide.md#digital-identity-setup). #### Device Risk To include Jumio's Device Risk functionality, you need to add `pod Jumio/DeviceRisk` to your Podfile. ### Android **AndroidManifest** Open your AndroidManifest.xml file and change `allowBackup` to false. ```xml ... android:allowBackup="false"> ... ``` Make sure your compileSdkVersion, minSdkVersion and buildToolsVersion are high enough. ```groovy android { minSdkVersion 21 compileSdkVersion 35 buildToolsVersion "35.0.0" ... } ``` **Enable MultiDex** Follow the Android developers guide [here](https://developer.android.com/studio/build/multidex.html) ```groovy android { ... defaultConfig { ... multiDexEnabled true } } ``` **Upgrade Gradle build tools** The plugin requires at least version 8.0.0 of the Android build tools. This transitively requires an upgrade of the Gradle wrapper to version 8 and an update to Java 11. If necessary, upgrade your build tools version to 8.7.3 in `android/build.gradle`: ```groovy buildscript { ... dependencies { ... classpath 'com.android.tools.build:gradle:8.7.3' } } ``` If necessary, modify the Gradle Wrapper version in `android/gradle.wrapper/gradle-wrapper.properties`: ```groovy ... distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip ``` #### Proguard For information on Android Proguard Rules concerning the Jumio SDK, please refer to our [Android guides](https://github.com/Jumio/mobile-sdk-android#proguard). To enable analytic feedback and internal diagnostics, please make sure to include the lines: ``` -keep class io.flutter.embedding.android.FlutterActivity -keep class io.flutter.embedding.android.FlutterEngineProvider ``` to your Proguard Rules. ## Usage 1. Import "**jumiomobilesdk.dart**" ```dart import 'package:jumio_mobile_sdk_flutter/jumio_mobile_sdk_flutter.dart'; ``` 2. The SDKs can be initialized with the following call: ```dart Jumio.init("AUTHORIZATION_TOKEN", "DATACENTER"); ``` Datacenter can either be **US**, **EU** or **SG**. For more information about how to obtain an `AUTHORIZATION_TOKEN`, please refer to our [API Guide](https://documentation.jumio.ai/docs/developer-resources/API/authorization). 3. As soon as the SDK is initialized, the SDK is started by the following call. ```dart Jumio.start(); ``` ### Retrieving information Scan results are returned from the startXXX() methods asynchronously. Await the returned values to get the results. Exceptions are thrown issues such as invalid credentials, missing API keys, permissions errors and such. ## Customization ### Android JumioSDK Android appearance can be customized by overriding the custom theme `AppThemeCustomJumio`. An example customization of all values that can be found in the [styles.xml](example/android/app/src/main/res/values/styles.xml) of the DemoApp. ### iOS JumioSDK iOS appearance can be customized to your respective needs. You can customize each color based on the device's set appearance, for either Dark mode or Light mode, or you can set a single color for both appearances. Customization is optional and not required. You can pass the following customization options at [`Jumio.start`](example/lib/main.dart#L79): | Customization key | | :---------------------------------------------- | | facePrimary | | faceSecondary | | faceOutline | | faceAnimationForeground | | iProovFilterForegroundColor | | iProovFilterBackgroundColor | | iProovTitleTextColor | | iProovCloseButtonTintColor | | iProovSurroundColor | | iProovPromptTextColor | | iProovPromptBackgroundColor | | genuinePresenceAssuranceReadyOvalStrokeColor | | genuinePresenceAssuranceNotReadyOvalStrokeColor | | livenessAssuranceOvalStrokeColor | | livenessAssuranceCompletedOvalStrokeColor | | primaryButtonBackground | | primaryButtonBackgroundPressed | | primaryButtonBackgroundDisabled | | primaryButtonForeground | | primaryButtonForegroundPressed | | primaryButtonForegroundDisabled | | primaryButtonOutline | | secondaryButtonBackground | | secondaryButtonBackgroundPressed | | secondaryButtonBackgroundDisabled | | secondaryButtonForeground | | secondaryButtonForegroundPressed | | secondaryButtonForegroundDisabled | | secondaryButtonOutline | | bubbleBackground | | bubbleForeground | | bubbleBackgroundSelected | | bubbleOutline | | loadingCirclePlain | | loadingCircleGradientStart | | loadingCircleGradientEnd | | loadingErrorCircleGradientStart | | loadingErrorCircleGradientEnd | | loadingCircleIcon | | scanOverlay | | scanOverlayBackground | | nfcPassportCover | | nfcPassportPageDark | | nfcPassportPageLight | | nfcPassportForeground | | nfcPhoneCover | | scanViewTooltipForeground | | scanViewTooltipBackground | | scanViewForeground | | scanViewDocumentShutter | | scanViewFaceShutter | | searchBubbleBackground | | searchBubbleForeground | | searchBubbleOutline | | confirmationImageBackground | | confirmationImageBackgroundBorder | | confirmationIndicatorActive | | confirmationIndicatorDefault | | confirmationImageBorder | | background | | navigationIconColor | | textForegroundColor | | primaryColor | | selectionIconForeground | All colors are provided with a HEX string with the following formats: `#ff00ff` or `#66ff00ff` if you want to set the alpha level. **Customization example** Example for setting color based on Dark or Light mode ``` Jumio.start({ "primaryColor": { light:"ffffff", dark:"000000" } "primaryButtonBackground": { light:ffffff, dark:"000000" } }); ``` Example for setting same color for both Dark and Light mode ``` Jumio.start({ "primaryColor": "ffffff" "primaryButtonBackground": "ffffff" }); ``` ## Configuration For more information about how to set specific SDK parameters (callbackUrl, userReference, country, ...), please refer to our [API Guide](https://documentation.jumio.ai/docs/developer-resources/API/). ## Callbacks In oder to get information about result fields, Retrieval API, Delete API, global settings and more, please read our [page with server related information](https://documentation.jumio.ai/docs/developer-resources/callback). ## Result Objects JumioSDK will return `EventResult` in case of a successfully completed workflow and `EventError` in case of error. `EventError` includes an error code and an error message. ### EventResult | Parameter | Type | Max. length | Description | | :---------------------- | :------- | :---------- | :--------------------------------------------------------------------------------------------------------- | | selectedCountry | String | 3 | [ISO 3166-1 alpha-3](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-3) country code as provided or selected | | selectedDocumentType | String | 16 | PASSPORT, DRIVER_LICENSE, IDENTITY_CARD or VISA | | selectedDocumentSubType | String | | Sub type of the scanned ID | | idNumber | String | 100 | Identification number of the document | | personalNumber | String | | Personal number of the document | | issuingDate | Date | | Date of issue | | expiryDate | Date | | Date of expiry | | issuingCountry | String | 3 | Country of issue as ([ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3)) country code | | lastName | String | 100 | Last name of the customer | | firstName | String | 100 | First name of the customer | | dob | Date | | Date of birth | | gender | String | 1 | m, f or x | | originatingCountry | String | 3 | Country of origin as ([ISO 3166-1 alpha-3](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-3)) country code | | addressLine | String | 64 | Street name | | city | String | 64 | City | | subdivision | String | 3 | Last three characters of [ISO 3166-2:US](http://en.wikipedia.org/wiki/ISO_3166-2:US) state code | | postCode | String | 15 | Postal code | | mrzData | MRZ-DATA | | MRZ data, see table below | | optionalData1 | String | 50 | Optional field of MRZ line 1 | | optionalData2 | String | 50 | Optional field of MRZ line 2 | | placeOfBirth | String | 255 | Place of Birth | ### MRZ-Data | Parameter | Type | Max. length | Description | | :------------------ | :----- | :---------- | :----------------------------------------------------------------------------- | | format | String | 8 | MRP, TD1, TD2, CNIS, MRVA, MRVB or UNKNOWN | | line1 | String | 50 | MRZ line 1 | | line2 | String | 50 | MRZ line 2 | | line3 | String | 50 | MRZ line 3 | | idNumberValid | BOOL | | True if ID number check digit is valid, otherwise false | | dobValid | BOOL | | True if date of birth check digit is valid, otherwise false | | expiryDateValid | BOOL | | True if date of expiry check digit is valid or not available, otherwise false | | personalNumberValid | BOOL | | True if personal number check digit is valid or not available, otherwise false | | compositeValid | BOOL | | True if composite check digit is valid, otherwise false | ## Local Models for ID Verification and Liveness Our SDK requires several machine learning models to work best. We recommend to download the files and add them to your project without changing their names (the same way you add Localization files). This will save two network requests on runtime to download these files. ### Preloading models You can preload the ML models before initializing the Jumio SDK. To do so set the completion block with `JumioMobileSDK.setPreloaderFinishedBlock` and start the preloading with `JumioMobileSDK.preloadIfNeeded`. ### iOS You can find the models in the [Bundling models in the app](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/integration_guide.md#bundling-models-in-the-app) section of our integration guide. You also need to copy those files to the "ios/Assets" folder for Flutter to recognize them. ### Android You can find the models in the [Bundling models in the app](https://github.com/Jumio/mobile-sdk-android/blob/master/docs/integration_guide.md#bundling-models-in-the-app) section of our integration guide. You need to copy those files to the assets folder of your Android project (Path: "app/src/main/assets/"). ## FAQ ### Face help animation breaks on Android If face help animation looks as expected in debug builds, but breaks in release builds, please make sure to include the following rule in your [**Proguard** file](example/android/app/proguard-rules.pro): ``` -keep class androidx.constraintlayout.motion.widget.** { *; } ``` ### iOS Simulator shows a white-screen, when the Jumio SDK is started The Jumio SDK does not support the iOS Simulator. Please run the Jumio SDK only on physical devices. ### iOS Runs on Debug, Crashes on Release Build This happens due to Xcode 13 introducing a new option to their **App Store Distribution Options**: **"Manage Version and Build Number"** (see image below) If checked, this option changes the version and build number of all content of your app to the overall application version, including third-party frameworks. **This option is enabled by default.** Please make sure to disable this option when archiving / exporting your application to the App Store. Otherwise, the Jumio SDK version check, which ensures all bundled frameworks are up to date, will fail. ![Xcode13 Issue](images/known_issues_xcode13.png) Alternatively, it is also possible to set the key `manageAppVersionAndBuildNumber` in the **exportOptions.plist** to `false`: ``` manageAppVersionAndBuildNumber ``` ### App Crash at Launch for iOS If iOS application crashes immediately after launch and without additional information, but works fine for Android, please make sure the following lines have been added to your `Podfile`: ``` post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES' end end end ``` If you are working with Xcode 15 and above, please make sure the following lines have been added to your `Podfile`: ``` post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' end end end ``` Please refer to [iOS guide](https://github.com/Jumio/mobile-sdk-ios#via-cocoapods) for more details. ### iOS Localization After installing Cocoapods, please localize your iOS application using the languages provided at the following path: `ios -> Pods -> Jumio -> Localization -> xx.lproj` ![Localization](images/Flutter_localization.gif) Make sure your `podfile` is up to date and that new pod versions are installed properly so your `Localizable` files include new strings. For more information, please refer to our [Changelog](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/changelog.md) and [Transition Guide](https://github.com/Jumio/mobile-sdk-ios/blob/master/docs/transition_guide.md). ### Empty Country List for Android Release Build If country list is empty for the Android release build, please make sure your app has the proper internet permissions. Without a working network connection, countries won't load in and the list will stay empty. If necessary, please add `android.permission.INTERNET` permission to your `AndroidManifest.xml` file. The standard Flutter template will not include this tag automatically, but still allows Internet access during development to enable communication between Flutter tools and a running app. For more information, please refer to the [official Flutter documentation.](https://flutter.dev/docs/deployment/android#reviewing-the-app-manifest) # Support ## Contact If you have any questions regarding our implementation guide please contact Jumio Customer Service at support@jumio.com or https://support.jumio.com. The Jumio online helpdesk contains a wealth of information regarding our service including demo videos, product descriptions, FAQs and other things that may help to get you started with Jumio. Check it out at: https://support.jumio.com. ## Licenses The source code and software available on this website (“Software”) is provided by Jumio Corp. or its affiliated group companies (“Jumio”) "as is” and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall Jumio be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including but not limited to procurement of substitute goods or services, loss of use, data, profits, or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this Software, even if advised of the possibility of such damage. In any case, your use of this Software is subject to the terms and conditions that apply to your contractual relationship with Jumio. As regards Jumio’s privacy practices, please see our privacy notice available here: [Privacy Policy](https://www.jumio.com/legal-information/privacy-policy/). The software contains third-party open source software. For more information, please see [Android licenses](https://github.com/Jumio/mobile-sdk-android/tree/master/licenses) and [iOS licenses](https://github.com/Jumio/mobile-sdk-ios/tree/master/licenses) This software is based in part on the work of the Independent JPEG Group. ## Copyright © Jumio Corp. 268 Lambert Avenue, Palo Alto, CA 94306 --- # Web SDK https://documentation.jumio.ai/docs/developer-resources/SDKs/web-sdk/introduction-web # Getting Started with the Jumio Web SDK The Jumio Web SDK lets you quickly integrate and customize a fully-functional implementation of the customer journeyClosed into your web and mobile applications. It provides a set of UI components that guide your end users through the verification process, including preparing and capturing the credentials required by the workflow specified in the account request. The components are implemented as custom html elements and named html templates that are managed by JavaScript resources packaged as [Ecmascript Modules](https://nodejs.org/api/esm.html#modules-ecmascript-modules). Adding the default integration to your application is as simple as adding a single `` element to a page and passing it a couple of parameters: ``` ```
  • **dc** is the data center for your Jumio tenant.
  • **us** for the US data center
  • **eu** for the European data denter
  • **sgp** for the Singapore data center
  • **token** is the sdk.token value returned in the response from an account request.
See [Creating or Updating Accounts](/docs/developer-resources/API/CreateUpdateAccounts/creating-and-updating-accounts) and [Example: Default Integration](/docs/developer-resources/SDKs/web-sdk/introduction-web#example-default-integration) :::tip [Storybook Documentation](https://docs.web.jumio.ai/) provides detailed reference information, along with an interactive way to try out the default implementation. ::: The following topics provide additional information and examples about **Web SDK**: - [Installing the Package](#installing-the-web-sdk-package) - [Slots](/docs/developer-resources/SDKs/web-sdk/slots) provides examples of high-level customizations including theme, logging, and browser navigation. - [CSS Variables](/docs/developer-resources/SDKs/web-sdk/web-sdk-css) provides examples of customizing fonts and colors. - [Templates](/docs/developer-resources/SDKs/web-sdk/web-sdk-templates) provides examples of using templates to customize the steps in the customer journey. ## Installing the Web SDK Package The Web SDK is available as a NPM package. It is publicly available in the npm registry at [@jumio/websdk](https://www.npmjs.com/package/@jumio/websdk?activeTab=readme). Install the package using this command: ``` npm i @jumio/websdk ``` The package includes a README.md file and an index.html file. The README.md contains additional information including how to launch a local server and access the index.html. The index.html is a minimal file that includes the `` tag. You can try out the various slots and templates by adding them and seeing the results in a browser accessing the localhost server. ## Example: Default Integration The following example shows: - The index.html document that is included with the Web SDK package. - A `