Skip to main content

Introduction to v3

note

This content applies to the legacy v3 products. Documentation for the current Jumio Platform is available at Jumio Documentation.

The Jumio v3 (Legacy) Platform API allows you to manage your user journeys. It allows you to create and update accounts for your users, prompt them to provide data such as a photo ID and selfie, and get identity verification results in real time so you can complete their onboarding.

The v3 Platform API is user-based and highly flexible, allowing various workflows that can be easily combined into a single user journey. Each workflow defines a single transaction executing a series of specific tasks, such as data extraction and a liveness check. Multiple workflows can be executed on the same account. Your workflows can execute functionality from several Jumio products, including:

ID Verification: Is this photo ID valid? Identity Verification: Is this person who they say they are? The following diagram shows several possible workflows:

Some functionalities described in this document might be unavailable, depending on the scope of your license with Jumio. Contact your Jumio Solutions Engineer if you have any questions.

Implementation Steps:

Account Creation Account Update Data Acquisition Finalization

Authentication and Encryption

API calls are protected using either HTTP Basic Authentication or OAuth2.

⚠️ Never share your API token, API secret, or OAuth2 credentials with anyone — not even Jumio Support! The Account Management Service initiates the acquisition process and returns:

either a JSON Web Token (JWT), which can be used to authenticate to the Jumio backend system to use with the SDK or Redirect-URLs, which can be used to upload documents using the other channels At the moment, your Basic Auth credentials are constructed using your API token as the User ID and your API secret as the password. You can view and manage your API token and secret in the Customer Portal under:

Settings > API credentials > API Users

OAuth2

Your new 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 Customer 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 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.

ℹ️ Calls with missing, incorrect or suspicious headers or parameter values will result in HTTP status code 400 Bad Request Error or 403 Forbidden

Examples

Request Access Token

curl --location --request POST '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": "YOUR_ACCESS_TOKEN",
"expires_in": 3600,
"token_type": "Bearer"
}

Access Token Timeout

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 Customer Portal and can be overwritten using the API call (tokenLifetime). Within this token lifetime the token can be used to initialize the SDK, API or Web journey.

As soon as the workflow (transaction) starts, a 15 minutes session timeout starts. For each action performed (capture image, upload image) the session timeout will reset, and the 15 minutes will start again.

Account Creation

Create a new account for your end user by using the following API endpoint and below mentioned request headers and request body:

HTTP Request Method: POST

US: https://account.amer-1.jumio.ai/api/v1/accounts EU: https://account.emea-1.jumio.ai/api/v1/accounts SG: https://account.apac-1.jumio.ai/api/v1/accounts

Request Headers

The following fields are required in the header section of your Request

Accept: application/json
Content-Type: application/json
Content-Length: see RFC-7230
Authorization: see RFC6749
User-Agent: YourCompany YourApp/v1.0

⚠️ Jumio requires the User-Agent value to reflect your business or entity name for API troubleshooting. ℹ️ Calls with missing or suspicious headers, suspicious parameter values, or without OAuth2 will result in HTTP status code 403 Forbidden

Request Body

The body of your initiate API request allows you to:

provide your own internal tracking information for the user and transaction. specify what user information is captured and by which method. preset options to enhance the user journey. Values set in your API request will override the corresponding settings configured in the Customer Portal.

(Mandatory parameters in bold.)

ParameterTypeMax. LengthNotes
customerInternalReferencestring100Customer internal reference for linking the request in the customer backend (must not contain any PII)
workflowDefinitionobjectDefinition of the specific documents required to execute the workflow capabilities
userConsent2objectUser consent required where facial recognition or biometric data processing is used. Possible values: See userConsent
workflowDefinition.keyobjectKey of the workflow definition to execute. See Workflow Definition Keys
workflowDefinition.credentialsarray (object)Optional. Customize the acquiring and workflow process. See workflowDefinition.credentials for possible values
workflowDefinition.capabilitiesobjectOptional. Customize the acquiring and workflow process. See workflowDefinition.capabilities for possible values
userReference1string100Reference for the end user in the customer backend (must not contain any PII)
reportingCriteriastring255Additional information provided by the customer for searching and aggregation purposes
callbackUrlstring255Callback URL for this request. Overrides the callback URL set in the Customer Portal
tokenLifetimestringValid period unit: s (seconds), m (minutes), h (hours), d (days). Minimum: 5m, Maximum: 60d, Default: 30m. Overrides Authorization token lifetime in the Customer Portal. Example: 1d, 30m, 600s
webobjectParameters relevant only for the Web channel
web.successUrlstring255URL to redirect the end user after a successful web acquisition. Overrides success URL in the Customer Portal
web.errorUrlstring255URL to redirect the end user after a failed web acquisition. Overrides error URL in the Customer Portal
web.localestring5Renders content in the specified language. Overrides default locale in the Customer Portal. See supported locale values

1 Mandatory request parameter for Workflow 32: ID Verification, Identity Verification, Screening.. 2 Mandatory for End-User Consent even if the user is not based in USA.

Request workflowDefinition.credentials

ParameterTypeMax. LengthNotes
categorystringType of credential. Possible values: ID, FACEMAP, DOCUMENT, SELFIE
countryobjectDefines the countries applicable for the workflow. Possible values: country.predefinedType, country.values
country.predefinedTypestringDetermines how the country is presented to the end user. Possible values: DEFINED (default: end user cannot change), RECOMMENDED (preselected but user can change)
country.valuesarray (string)List of applicable countries. At least one ISO 3166-1 alpha-3 country code must be defined for the workflow. Example: USA, BRA, DEU
typeobjectDefines the credential type(s) used in the workflow. Possible values: type.predefinedType, type.values
type.predefinedTypeobjectDetermines how the document type is presented to the end user. Possible values: DEFINED (default: user cannot change), RECOMMENDED (preselected but user can change)
type.valuesarray (string)List of credential types allowed for the workflow. Possible values: • If category = ID: ID_CARD, DRIVING_LICENSE, PASSPORT, VISA • If category = FACEMAP: IPROOV_STANDARD (Web + SDK only), IPROOV_PREMIUM (Workflow 3: ID & Identity Verification Web + SDK / Workflow 9: Authentication SDK / Workflow 16: Authentication On Premise SDK), JUMIO_STANDARD

1 Web channel: Only supports predefined country and type when both are provided. Also only a single country and a single type must be specified, a list of presets is not supported for Web.

Request workflowDefinition.capabilities

ParameterTypeMax. LengthNotes
watchlistScreeningobjectConfiguration options for the Watchlist Screening capability. Possible values: watchlistScreening.additionalProperties
watchlistScreening.additionalPropertiesstringProvide request options for the Watchlist Screening capability.

Request userConsent

ParameterTypeMax. LengthNotes
userIpstringCurrent IP address of the end-user used during the verification.
userLocationobjectEnd-user location details. Possible values: userLocation.country, userLocation.state.
userLocation.countrystring3Current country based on the end-user’s location during verification. Possible values: ISO 3166-1 alpha-3 country codes.
userLocation.statestring100Current state/province as per end-user location. Applicable only in countries with states (e.g., USA, CAN, AUS). For USA, CAN, AUS: provide alpha-2 state code (without country & hyphen), e.g., IL (Illinois), NSW (New South Wales). For other countries, any string if applicable.
consentobjectEnd-user consent details. Possible values: consent.obtained, consent.obtainedAt.
consent.obtainedstringIndicates whether end-user consent was obtained. Possible values: yes (consent given), no (consent not given), na (not applicable). Mandatory if userLocation.country = USA.
consent.obtainedAtstringUTC timestamp when consent was obtained. Format: YYYY-MM-DDThh:mm:ss.SSSZ. Mandatory if consent.obtained = yes.

1 Mandatory for End-User Consent even if the user is not based in USA. 2 Mandatory for End-User Consent if userLocation.country = USA / consent.obtained = yes

Response

Unsuccessful requests will return HTTP status code 400 Bad Request, 401 Unauthorized, 403 Forbidden or 404 Not Found (in case of a failed update scenario) if the scan is not available.

Successful requests will return HTTP status code 200 OK along with a JSON object containing the information described below.

ParameterTypeNotes
timestampstringUTC timestamp of the response. Format: YYYY-MM-DDThh:mm:ss.SSSZ.
accountobjectAccount details. Possible values: account.id.
account.idstringUUID of the account.
sdkobjectSDK parameters (only relevant for SDK channel). Possible values: sdk.token.
sdk.tokenstringJWT token for performing any SDK action.
workflowExecutionobjectWorkflow execution details. Possible values: workflowExecution.id, workflowExecution.credentials.
workflowExecution.idstringUUID of the workflow.
workflowExecution.credentialsarray (object)Credential response objects. See workflowExecution.credentials.
webobjectWeb parameters (only relevant for WEB channel). Possible values: web.href, web.successUrl, web.errorUrl.
web.hrefstringURL for accessing the workflow in the browser.
web.successUrlstringURL where the browser redirects the user after a successful web acquisition journey (defined in Customer Portal or overwritten in initiate call).
web.errorUrlstringURL where the browser redirects the user after a failed web acquisition journey (defined in Customer Portal or overwritten in initiate call).

esponse workflowExecution.credentials

ParameterTypeNotes
idstringUUID of the credential.
categorystringPossible values: ID, FACEMAP, DOCUMENT, SELFIE.
countryobjectDefine at least one ISO 3166-1 alpha-3 country code for the workflow definition. Possible values: ISO 3166-1 alpha-3 country code.
typeobjectDefine the credential type codes. Possible values: ID_CARD, DRIVING_LICENSE, PASSPORT, VISA.
allowedChannelsarrayChannels supported to upload this credential. Possible values: WEB, API, SDK.
apiobjectAvailable actions for API calls (some actions may be unavailable). Only relevant for the API channel. Possible values: api.token, api.parts, api.workflowExecution.
api.tokenstringJWT token for performing any API action. Only relevant for the API channel.
api.partsobjectHref to manage parts of the credential. Possible values: FRONT, BACK, FACE, FACEMAP. Only relevant for the API channel.
api.workflowExecutionstringHref to manage the acquisition and workflow processing. Only relevant for the API channel.

Examples

Initiate Account

curl --location --request POST 'https://account.amer-1.jumio.ai/api/v1/accounts' \
    --header 'Content-Type: application/json' \
    --header 'User-Agent: User Demo' \
    --header 'Authorization: Bearer
    YOUR_ACCESS_TOKEN' \
    --data-raw '{
        "customerInternalReference": "CUSTOMER_REFERENCE",
        "workflowDefinition": {
            "key": 2,
            "credentials": [
                {
                  "category": "ID",
                  "country": {
                    "predefinedType": "DEFINED",
                    "values": ["USA", "CAN", "AUT", "GBR"]
                  },
                  "type": {
                    "predefinedType": "DEFINED",
                    "values": ["DRIVING_LICENSE", "ID_CARD"]
                  }  
                }
            ],
            "capabilities": {
              "watchlistScreening": {
                "additionalProperties": "string"
              }
            }
        },
        "callbackUrl": "YOUR_CALLBACK_URL",
        "userReference": "YOUR_USER_REFERENCE",
        "userConsent": {
            "userIp": "226.80.211.232",                    
            "userLocation": {
                "country": "USA",                       
                "state": "IL"                           
            },
             "consent": {
              "obtained": "yes",                        
              "obtainedAt": "2022-07-20T17:20:35.000Z"  

            }
        }
    }'

Account Update

After you have created an account for an end user, you can use this API to update that account. You will use this API endpoint for every new workflow (transaction) you need to initialize for that end user.

Updating an account is very similar to creating one; the request headers and body are the same in both cases. The difference is that you pass the accountId to the endpoint and use PUT instead of POST.

Request

HTTP Request Method: PUT

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>

Request Headers Please refer to Account Create section above.

Request Body Please refer to Account Create section above.

Response Please refer to Account Create section above.

Examples

Request

curl --location --request PUT 'https://account.amer-1.jumio.ai/api/v1/accounts/<accountId>' \
--header 'Content-Type: application/json' \
--header 'User-Agent: User Demo' \
--header 'Authorization: Bearer
YOUR_ACCESS_TOKEN' \
--data-raw '{
"customerInternalReference": "CUSTOMER_INTERNAL_REFERENCE",
"workflowDefinition": {
"key": 2,
"credentials": [
{
"category": "FACEMAP",
"type": {
"values": ["IPROOV_STANDARD", "JUMIO_STANDARD"]
}
},
{
"category": "ID",
"type": {
"values": ["DRIVING_LICENSE", "ID_CARD", "PASSPORT"]
},
"country": {
"values": ["USA", "CAN", "AUT"]
}
}
]
},
"userConsent": {
"userIp": "226.80.211.232",
"userLocation": {
"country": "AUT"
}
}
}

Response

{
"timestamp": "2021-05-28T09:17:50.240Z",
"account": {
"id": "11111111-1111-1111-1111-aaaaaaaaaaaa"
},
"web": {
"href": "https://mycompany.web.amer-1.jumio.ai/web/v4/app?authorizationTokenxxx&locale=es",
"successUrl": "https://www.yourcompany.com/success",
"errorUrl": "https://www.yourcompany.com/error"
},
"sdk": {
"token": "xxx"
},
"workflowExecution": {
"id": "22222222-2222-2222-2222-aaaaaaaaaaaa",
"credentials": [
{
"id": "33333333-3333-3333-aaaaaaaaaaaa",
"category": "ID",
"allowedChannels": [
"WEB",
"API",
"SDK"
],
"api": {
"token": "xxx",
"parts": {
"front": "https://api.amer-1.jumio.ai/api/v1/accounts/11111111-1111-1111-1111-aaaaaaaaaaaa/workflow-executions/22222222-2222-2222-2222-aaaaaaaaaaaa/credentials/33333333-3333-3333-aaaaaaaaaaaa/parts/FRONT",
"back": "https://api.amer-1.jumio.ai/api/v1/accounts/11111111-1111-1111-1111-aaaaaaaaaaaa/workflow-executions/22222222-2222-2222-2222-aaaaaaaaaaaa/credentials/33333333-3333-3333-aaaaaaaaaaaa/parts/BACK"
},
"workflowExecution": "https://api.amer-1.jumio.ai/api/v1/accounts/11111111-1111-1111-1111-aaaaaaaaaaaa/workflow-executions/22222222-2222-2222-2222-aaaaaaaaaaaa"
}
}
]
}
}

Implementation Steps: Sequence Diagram

Workflow Descriptions

Workflow Definition Keys

Definition KeyNameDescription
1ID Capture and StorageCaptures a government-issued ID document and stores the extracted data.
2ID VerificationVerifies a government-issued ID document and returns: (a) whether the document is valid, and (b) the data extracted from the document.
3ID and Identity VerificationVerifies a photo ID document and returns: (a) whether the document is valid, and (b) the extracted data. Also compares the user’s face with the ID photo and performs a liveness check to confirm the person is physically present.
5Similarity to Existing IDMatches a user’s selfie to the face from a previously verified and stored ID document.
6Standalone LivenessCaptures a user’s face to verify that the person is physically present and not presenting a photo or other spoofed image.
9AuthenticationCompares a user’s facemap to an existing facemap captured during a previous workflow (for example, Workflow 3 or Workflow 6).
16Authentication on PremiseCompares a user’s facemap to an existing facemap stored on the customer side. The facemap must have been captured during a previous workflow (for example, Workflow 3 or Workflow 6) and can be retrieved using the Retrieval API with the validFaceMapForAuthentication parameter.
20Similarity of Two ImagesMatches user photos across two IDs, two selfies, or a selfie and an ID photo to verify they belong to the same person.
32ID Verification, Identity Verification, ScreeningVerifies a photo ID document and returns: (a) whether the document is valid, and (b) extracted data. Also performs face comparison, liveness detection, and checks whether the user appears on any sanctions lists.

Workflows are specified using the key attribute in the workflowDefinition object:

"workflowDefinition": {
    "key": DEFINITION_KEY,
    "credentials": []
}

To collect consent on Jumio’s behalf, you will need to incorporate certain explicit consent collection language and a link to Jumio’s Privacy Notice within your user consent flow before collection of end-user biometric data, if the end-user is located inside the United States.

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:

“By clicking “Start” you consent to Jumio collecting, processing, and sharing your personal information, which may include biometric data, pursuant to its Privacy Notice.”

Every transaction which includes any product/workflow step in which biometrics are collected needs to have consent parameters adapted and populated. This means if Face match is enabled for your account, Liveness, or Authentication is used you will need to share consent parameters.

If your Privacy Policy and Terms & Conditions allowing continuous use of consent obtained from end-user on biometric data collection and processing the timestamp (consent.obtainedAt) should be when the original/updated consent was obtained.

If consent is not provided or other scenarios where consent needs to be resubmitted use our Account Update API to add the needed consent parameters.

⚠️ If the continuous consent applies, the consent is valid for a period of maximum 3 years (between the consent timestamp and current timestamp). A new consent needs to be obtained from the end-user before continuous consent expires. The consent timestamp (consent.obtainedAt) has to be updated accordingly. Note: Until further notice Jumio will not perform any treatment based on the consent parameters. After a notice period business validation will be performed which could also lead to a rejection of the transaction, also providing additional consent specific error codes. The rejection will happen at the data acquisition step and not at the Account Create or Account Update stage. We will inform you separately on a specific date.

Which Jumio products collect biometrics?

Jumio Product / Workflow StepBiometric Component
Jumio Identity VerificationIncludes liveness detection and face matching. May also serve as the base facemap creation for future authentication workflows.
Jumio GoIncludes liveness detection and face matching.
AuthenticationCreates a new facemap and compares it against an existing stored facemap.
ID VerificationIncludes face matching (if enabled for the account).
Jumio Video VerificationIncludes liveness detection and face matching.
Jumio ScreeningID Verification: Includes face matching (if 1:n face match is enabled for the account). Identity Verification: Includes liveness detection and face matching.

Within the consent area in the API request body.

Always mandatory: Populate the end-user IP address and end-user current location (userLocation.userIp,userLocation.country) Mandatory if userLocation.country = USA: Populate the consent parameters (i.e., status, timestamp) See examples for a sample request including the user consent parameters.

Data Acquisition

SDK This section illustrates how to implement the SDK.

After creating/updating a new account you will receive a sdk.token (JWT) for initializing the SDK. Use this token with your Android or iOS code.

Android

try {
  sdk = JumioSDK(this)

  // Set your access token
  sdk.token = "yourAccessToken"

  // Set the dataCenter, default is US
  sdk.dataCenter = jumioDataCenter

} catch (e1: PlatformNotSupportedException) {
    // Handle exceptions here
  } catch (e2: NullPointerException) {
    // Handle exceptions here
}
iOS
sdk = Jumio.SDK()

// Set your access token
sdk.token = "yourAccesToken"

// Set the dataCenter, default is US
sdk.dataCenter = jumioDataCenter

For more information on how to use the Jumio Mobile SDK please refer to our mobile guides for iOS and Android.

API

This section illustrates how to implement the API.

After creating/updating a new account, you receive one or more specific redirect URL(s) to upload needed credentials (ID, facemap, document, selfie).

Request

Request Headers The following fields are required in the header section of your Request

Accept: application/json
Content-Type: multipart/form-data
Content-Length: see RFC-7230
Authorization: see RFC6749
User-Agent: YourCompany YourApp/v1.0

⚠️ Jumio requires the User-Agent value to reflect your business or entity name for API troubleshooting. ℹ️ Calls with missing or suspicious headers, suspicious parameter values, or without OAuth2 will result in HTTP status code 403 Forbidden Request URL

Request URL HTTP Request Method: POST

US: https://api.amer-1.jumio.ai/api/v1/accounts/<accountId>/workflow-executions/<workflowExecutionId>/credentials/<credentialsId>/parts/<classifier> EU: https://api.emea-1.jumio.ai/api/v1/accounts/<accountId>/workflow-executions/<workflowExecutionId>/credentials/<credentialsId>/parts/<classifier> SG: https://api.apac-1.jumio.ai/api/v1/accounts/<accountId>/workflow-executions/<workflowExecutionId>/credentials/<credentialsId>/parts/<classifier>

Request Path Parameters

ParameterTypeNotes
accountIdstringUUID of the account.
workflowExecutionIdstringUUID of the workflow execution.
credentialsIdstringUUID of the credential.
classifierstringDefines the type of image being uploaded. Possible values: FRONT, BACK, FACE, FACEMAP.

Request Body

KeyValue
fileSupported formats: JPEG, PNG. Maximum file size: 5 MB. Maximum resolution: 8000 × 8000 pixels.

Response

Unsuccessful requests will return HTTP status code 401 Unauthorized, 403 Forbidden or 404 Not Found if the scan is not available.

Successful requests will return HTTP status code 200 OK along with a JSON object containing the information described below.

Response Body

ParameterTypeNotes
timestampstringTimestamp (UTC) of the response. Format: YYYY-MM-DDThh:mm:ss.SSSZ
accountobjectPossible values: account.id
account.idstringUUID of the account
workflowExecutionobjectPossible values: workflowExecution.id, workflowExecution.credentials
workflowExecution.idstringUUID of the workflow
workflowExecution.credentialsarray (object)Credential response. See workflowExecution.credentials
apiobjectAvailable actions for the API calls, actions can be omitted due to unavailability. Possible values: api.token, api.parts, api.workflowExecution
api.tokenstringJWT token for performing any action for API
api.partsobjecthref to manage parts for the account credential. Possible values: FRONT, BACK, FACE, FACEMAP
api.workflowExecutionstringhref to manage the acquisition and workflow processing

Examples

{
"timestamp": "2021-03-05T13:17:49.042Z",
"account": {
"id": "11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"workflowExecution": {
"id": "22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"api": {
"token": "xxx",
"parts": {
"front": "https://api.apac-1.jumio.ai/api/v1/accounts/11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx/workflow-executions/22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx/credentials/33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx/parts/FRONT",
"back": "https://api.apac-1.jumio.ai/api/v1/accounts/22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx/workflow-executions/22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx/credentials/33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx/parts/BACK"
},
"workflowExecution": "https://api.apac-1.jumio.ai/api/v1/accounts/22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx/workflow-executions/33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}

When all data has been uploaded, be sure to finalize the workflow as described below.

Finalization

Once the user has provided their data, the workflow needs to be finalized. Finalization sends the data to Jumio for processing and cleans up the workflow. If no finalization call happens, the workflow will be cleaned up after the token or session expires (workflowExecution.status = SESSION_EXPIRED / TOKEN_EXPIRED).

HTTP Request Method: PUT

US: https://api.amer-1.jumio.ai/api/v1/accounts/<accountId>/workflow-executions/<workflowExecutionId> EU: https://api.emea-1.jumio.ai/api/v1/accounts/<accountId>/workflow-executions/<workflowExecutionId> SG: https://api.apac-1.jumio.ai/api/v1/accounts/<accountId>/workflow-executions/<workflowExecutionId>

Request Headers

The following fields are required in the header section of your Request

Accept: application/json
Content-Type: application/json
Content-Length: see RFC-7230
Authorization: see RFC6749
User-Agent: YourCompany YourApp/v1.0

⚠️ Jumio requires the User-Agent value to reflect your business or entity name for API troubleshooting. ℹ️ Calls with missing or suspicious headers, suspicious parameter values, or without OAuth2 will result in HTTP status code 403 Forbidden

Request Path Parameters

ParameterTypeNote
accountIdstringUUID of the account
workflowExecutionIdstringUUID of the workflow

Response

Unsuccessful requests will return HTTP status code 401 Unauthorized, 403 Forbidden or 404 Not Found if the scan is not available.

Successful requests will return HTTP status code 200 OK along with a JSON object containing the information described below.

ParameterTypeNote
timestampstringTimestamp (UTC) of the response. Format: YYYY-MM-DDThh:mm:ss.SSSZ
accountobjectPossible values: account.id
account.idstringUUID of the account
workflowExecutionobjectPossible values: workflowExectuion.id
workflowExecution.idstringUUID of the workflow

Examples

Request

PUT
/api/v1/accounts/11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx/workflow-executions/22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx HTTP/1.1
Host: api.apac-1.jumio.ai
Authorization: Bearer xxx
Content-Length: 38
Content-Type: multipart/form-data;

Response

{
"timestamp": "2021-02-25T11:55:41.347Z",
"account": {
"id": "11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"workflowExecution": {
"id": "22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}

Web

This section illustrates how to implement the Web client.

Initiating

Use the Account Creation or Account Update API to initiate a Web workflow.

The following optional web-specific parameters can be included in the body of the initiate request.

ℹ️ You need to define a subdomain in your Customer Portal under Settings > Application Settings > Redirect > Domain Name Prefix in order to successfully generate a web.href.

Redirect pages

Use web.successUrl and web.errorUrl to specify how the end user will be redirected by the browser at the end of the web acquisition user journey.

If these parameters are not provided, and the values are not present in the Customer Portal settings, the end user will be shown a success or error page instead.

Languages

Parameter web.locale can be used to render the content of the client in the specified language.

Hyphenated combination of ISO 639-1:2002 alpha-2 language code plus ISO 3166-1 alpha-2 country (where applicable).

ValueLocale
arArabic
bgBulgarian
csCzech
daDanish
deGerman
elGreek
enAmerican English (default)
en-GBBritish English
esSpanish
es-MXMexican Spanish
etEstonian
fiFinnish
frFrench
heHebrew
hrCroatian
huHungarian
hyArmenian
idIndonesian
itItalian
jaJapanese
kaGeorgian
kmKhmer
koKorean
ltLithuanian
msMalay
nlDutch
noNorwegian
plPolish
ptPortuguese
pt-BRBrazilian Portuguese
roRomanian
ruRussian
skSlovak
svSwedish
thThai
trTurkish
viVietnamese
zh-CNSimplified Chinese
zh-HKTraditional Chinese

Displaying the Web Client

When you initiate the web client, the API returns the web.href that you use to display the web client to the end user. You can provide this URL in several ways:

Within an iFrame on your web page As a link on your web page that opens a new browser tab or window As a link shared securely with the end user In a native webview

Embedding in an iFrame

If you want to embed ID Verification on your web page, place the iFrame tag in your HTML code where you want the client to appear. Use web.href as the value of the iFrame src attribute.

⚠️ The allow="camera" attribute must be included to enable the camera for image capture in supported browsers. ⚠️ If you are nesting the iFrame in another iFrame, the allow="camera" attribute must be added to every iFrame. ⚠️ Do not add the iFrame element and its attributes with javascript dynamically at runtime. The iFrame must be present when the page loads. ⚠️ Camera capture is only possible within an iFrame when the containing page is served securely over https.

Width and Height We recommend adhering to the responsive breaking points in the table below.

Size classWidthHeight
Large≥ 900 px≥ 710 px
Medium640 px660 px
Small560 px600 px
X-Small≤ 480 px≤ 535 px

When specifying the width and height of your iFrame, you may prefer to use percentage values so that the iFrame behaves responsively on your page.

⚠️ The ID Verification Web client itself will responsively fill the iFrame that it is loaded into.

Biometric Face Capture ⚠️ The allow="camera;fullscreen;accelerometer;gyroscope;magnetometer" allowfullscreen iFrame attributes must be included to enable biometric face capture in supported browsers. ⚠️ If you are nesting the iFrame in another iFrame, the allow="camera;fullscreen;accelerometer;gyroscope;magnetometer" allowfullscreen attribute must be added to every iFrame. ⚠️ Do not add the iFrame element and its attributes with javascript dynamically at runtime. The iFrame must be present when the page loads. ⚠️ Camera capture is only possible within an iFrame when the containing page is served securely over https. ⚠️ Biometric Face Capture is not possible within an iFrame on incognito mode.

Example HTML

Absolute sizing example

<iframe src="https://yourcompany.netverify.com/web/v4/app?locale=en-GB&authorizationToken=xxx" width="930" height="750" allow="camera;fullscreen;accelerometer;gyroscope;magnetometer" allowfullscreen></iframe>

Responsive sizing example

<iframe src="https://yourcompany.netverify.com/web/v4/app?locale=en-GB&authorizationToken=xxx" width="70%" height="80%" allow="camera;fullscreen;accelerometer;gyroscope;magnetometer" allowfullscreen></iframe>

Biometric face capture example

<iframe src="https://yourcompany.netverify.com/web/v4/app?locale=en-GB&authorizationToken=xxx" width="70%" height="80%" allow="camera;fullscreen;accelerometer;gyroscope;magnetometer" allowfullscreen></iframe>

Optional iFrame logging

When the ID Verification client is embedded in an iFrame1, it will communicate with the containing page using the JavaScript window.postMessage() method to send events containing pre-defined data. This allows the containing page to react to events as they occur (e.g., by directing to a new page once the success event is received).

Events include data that allows the containing page to identify which ID Verification transaction triggered the event. Events are generated in a stateless way, so that each event contains general contextual information about the transaction (e.g., transaction reference, authorization token, etc.) in addition to data about the specific event that occurred.

Using JavaScript, the containing page can receive the notification and consume the data it contains by listening for the message event on the global window object and reacting to it as needed. The data passed by the ID Verification Web client in this notification is represented as JSON in the data string property of the listener method's event argument. Parsing this JSON string results in an object with the properties described below.

All data is encoded with UTF-8.

1 This functionality is not available for instances of ID Verification running in a standalone window or tab.

event.data object

Required items appear in bold type.

PropertyTypeDescription
accountIdstringUUID of the account
authorizationTokenstringAuthorization token, valid for a specified duration
workflowExecutionIdstringUUID of the workflow
customerInternalReference1stringInternal reference for a request to link it in the customer backend. It must not contain Personally Identifiable Information (PII) or sensitive data such as e-mail addresses
eventTypeintegerType of event that has occurred. Possible values: 510 (application state-change)
dateTimestringUTC timestamp of the event in the browser. Format: YYYY-MM-DDThh:mm:ss.SSSZ
payloadJSON objectInformation specific to the event generated (see event.data.payload object)
event.data.payload object

Required items appear in bold type.

NameTypeDescription
valuestringPossible values: loaded (ID Verification loaded in the user's browser), success (Images were accepted for verification), error (Verification could not be completed due to an error)
metainfoJSON objectAdditional meta-information for error events (see metainfo object)
event.data.payload.metainfo object

Required items appear in bold type.

PropertyTypeDescription
codeintegerOnly present if payload.value = error. See errorCode values
Example iFrame logging code
function receiveMessage(event) {
    var data = window.JSON.parse(event.data);
  console.log('ID Verification Web was loaded in an iframe.');
  console.log('auth-token:', data.authorizationToken);
  console.log('event-type:', data.eventType);
  console.log('date-time:', data.dateTime);
  console.log('workflow-execution-id:', data.workflowExecutionId);
  console.log('account-id:', data.accountId);
  console.log('customer-internal-reference:', data.customerInternalReference);
  console.log('value:', data.payload.value);
  console.log('metainfo:', data.payload.metainfo);
}
window.addEventListener("message", receiveMessage, false);

Using a Native WebView ID Verification Web can be embedded within a WebView in your native mobile application.

See Supported Environments > Native WebView for information about support on Android and iOS.

Android

This sections illustrates how to embed ID Verification Web in a native Android WebView.

Permissions and Settings

Make sure that the required permissions are granted.

  • android.permission.INTERNET - for remote resources access
  • android.permission.CAMERA - for camera capture
  • android.permission.READ_EXTERNAL_STORAGE - for upload functionality The following settings are required for the native WebView for Android.

Enable javaScriptEnabled - tells the WebView to enable JavaScript execution

  • Allow allowFileAccess - enables file access within WebView
  • Allow allowFileAccessFromFileUrls - sets whether JavaScript running in the context of a file scheme URL should be allowed to access content from other file scheme URLs
  • Allow allowUniversalAccessFromFileUrls - sets whether JavaScript running in the context of a file scheme URL should be allowed to access content from any origin
  • Allow allowContentAccess - enables content URL access within WebView
  • Allow javaScriptCanOpenWindowsAutomatically - tells JavaScript to open windows automatically
  • Enable domStorageEnabled - sets whether the DOM storage API is enabled
  • Do not allow mediaPlaybackRequiresUserGesture - sets whether the WebView requires a user gesture to play media
Embedding the Required Script

To allow Jumio to identify the user runtime environment, you will need to embed a required script that sets flag NVW_WEBVIEW to true to interact with the webview window object. For details, see the sample code below.

Optional postMessage communication

You can handle messages from the ID Verification Web Client using the same method as described in Optional iFrame Logging.

You will need to register a postMessage handler and put the relevant code sections in the PostMessageHandler class as in the example below.

Sample code

AndroidManifest.xml example

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jumio.nvw4">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
...
</manifest>

build.gradle example

dependencies {
implementation 'androidx.appcompat:appcompat:1.2.0-beta01'
implementation 'androidx.webkit:webkit:1.2.0'
...
}

WebViewFragment.kt example

class WebviewFragment : Fragment() {

    companion object {
        var TAG: String = "NVW4"
        var PERMISSION_REQUEST_CODE: Int = 1000
        private var mUploadMessage: ValueCallback<Uri?>? = null
        var uploadMessage: ValueCallback<Array<Uri>>? = null
        const val REQUEST_SELECT_FILE = 1002
        private const val FILECHOOSER_RESULTCODE = 1003

        private var _binding: FragmentWebviewBinding? = null
        private val binding get() = _binding!!


        //Inject javascript code here that is executed after the page is loaded
        val injectFunction = """
        function () {
            window['__NVW_WEBVIEW__'] = {
            isAndroid: true
            }
        }
        """.trimIndent()

        private var mFilePathCallback: ValueCallback<Array<Uri>>? = null

        fun newInstance(url: String): WebviewFragment {
            val fragment = WebviewFragment()

            val args = Bundle()
            args.putString("url", url)
            fragment.arguments = args

            return fragment
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentWebviewBinding.inflate(inflater, container, false)
        return binding.root
    }

    @SuppressLint("SetJavaScriptEnabled")
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        WebView.setWebContentsDebuggingEnabled(true)

        binding.webview.settings.javaScriptEnabled = true
        binding.webview.settings.allowFileAccessFromFileURLs = true
        binding.webview.settings.allowFileAccess = true
        binding.webview.settings.allowContentAccess = true
        binding.webview.settings.allowUniversalAccessFromFileURLs = true
        binding.webview.settings.javaScriptCanOpenWindowsAutomatically = true
        binding.webview.settings.mediaPlaybackRequiresUserGesture = false
        binding.webview.settings.domStorageEnabled = true

        binding.webview.addJavascriptInterface(PostMessageHandler(), "__NVW_WEBVIEW_HANDLER__")

        binding.webview.webChromeClient = object : WebChromeClientFullScreen() {

            // Grant permissions for cam
            @TargetApi(Build.VERSION_CODES.M)
            override fun onPermissionRequest(request: PermissionRequest) {
                activity?.runOnUiThread {
                    if ("android.webkit.resource.VIDEO_CAPTURE" == request.resources[0]) {
                        if (ContextCompat.checkSelfPermission(
                                activity!!,
                                Manifest.permission.CAMERA
                            ) == PackageManager.PERMISSION_GRANTED
                        ) {
                            Log.d(
                                TAG,
                                String.format(
                                    "PERMISSION REQUEST %s GRANTED",
                                    request.origin.toString()
                                )
                            )
                            request.grant(request.resources)
                        } else {
                            ActivityCompat.requestPermissions(
                                activity!!,
                                arrayOf(
                                    Manifest.permission.CAMERA,
                                    Manifest.permission.READ_EXTERNAL_STORAGE
                                ),
                                PERMISSION_REQUEST_CODE
                            )
                        }
                    }
                }
            }

            // For Lollipop 5.0+ Devices
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            override fun onShowFileChooser(
                mWebView: WebView?,
                filePathCallback: ValueCallback<Array<Uri>>?,
                fileChooserParams: FileChooserParams
            ): Boolean {
                if (uploadMessage != null) {
                    uploadMessage!!.onReceiveValue(null)
                    uploadMessage = null
                }
                try {
                    uploadMessage = filePathCallback
                    val intent = fileChooserParams.createIntent()
                    intent.type = "image/*"
                    try {
                        startActivityForResult(intent, REQUEST_SELECT_FILE)
                    } catch (e: ActivityNotFoundException) {
                        uploadMessage = null
                        Toast.makeText(
                            activity?.applicationContext,
                            "Cannot Open File Chooser",
                            Toast.LENGTH_LONG
                        ).show()
                        return false
                    }
                    return true
                } catch (e: ActivityNotFoundException) {
                    uploadMessage = null
                    Toast.makeText(
                        activity?.applicationContext,
                        "Cannot Open File Chooser",
                        Toast.LENGTH_LONG
                    ).show()
                    return false
                }
            }

            private fun openFileChooser(uploadMsg: ValueCallback<Uri?>) {
                mUploadMessage = uploadMsg
                val i = Intent(Intent.ACTION_GET_CONTENT)
                i.addCategory(Intent.CATEGORY_OPENABLE)
                i.type = "image/*"
                startActivityForResult(
                    Intent.createChooser(i, "File Chooser"),
                    FILECHOOSER_RESULTCODE
                )
            }

            override fun onConsoleMessage(consoleMessage: ConsoleMessage): Boolean {
                Log.d(TAG, consoleMessage.message())
                return true
            }

            override fun getDefaultVideoPoster(): Bitmap {
                return Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888)
            }
        }

        binding.webview.webViewClient = object : WebViewClient() {

            override fun onReceivedError(
                view: WebView?,
                errorCode: Int,
                description: String?,
                failingUrl: String?
            ) {
                Toast.makeText(activity, description, Toast.LENGTH_SHORT).show()
            }

            override fun onReceivedSslError(
                view: WebView?,
                handler: SslErrorHandler?,
                error: SslError?
            ) {
                handler?.proceed()
            }

            override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                // Put your javascript function that you want to execute here
                binding.webview.loadUrl("javascript:($injectFunction)()")
            }
        }

        binding.webview.loadUrl(arguments?.get("url") as String)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (requestCode == REQUEST_SELECT_FILE) {
                if (uploadMessage == null)
                    return
                uploadMessage!!.onReceiveValue(
                    WebChromeClient.FileChooserParams.parseResult(
                        resultCode,
                        intent
                    )
                )
                uploadMessage = null
            }
        } else if (requestCode == FILECHOOSER_RESULTCODE) {
            if (null == mUploadMessage)
                return
            val result =
                if (intent == null || resultCode != AppCompatActivity.RESULT_OK) null else intent.data
            mUploadMessage!!.onReceiveValue(result)
            mUploadMessage = null
        } else {
            Toast.makeText(
                activity?.applicationContext,
                "Failed to Upload Image",
                Toast.LENGTH_LONG
            ).show()
        }
        super.onActivityResult(requestCode, resultCode, intent)
    }

    class PostMessageHandler {
        @JavascriptInterface
        fun postMessage(json: String?, transferList: String?): Boolean {
            /*
                There we're handling messages from NVW4 client, its the same as for iFrame logging;
                More details can be found here:
                https://github.com/Jumio/implementation-guides/blob/master/netverify/netverify-web-v4.md#optional-iframe-logging
            */
            Log.d(TAG, "postMessage triggered, json: " + json.toString())
            return true
        }
    }

        /**
         * Custom WebChromClient to handle iProov full screen requirement
         * More details can be found here:
         * https://github.com/iProov/android/wiki/Java-WebView
         */
    open inner class WebChromeClientFullScreen : WebChromeClient() {
        private var customView: View? = null
        private var customViewCallback: CustomViewCallback? = null
        private var originalOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED
        private var originalVisibility = View.INVISIBLE

        /**
         * Callback will tell the host application that the current page would
         * like to show a custom View in a particular orientation
         */
        override fun onShowCustomView(view: View, callback: CustomViewCallback) {
            //If we have custom view, that means that we are already in full screen, and need to go to original state
            if (customView != null) {
                onHideCustomView()
                return
            }
            //going full screen
            customView = view
            //We need to store there parameters, so we can restore app state, after we exit full screen mode
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                originalVisibility = activity?.window?.decorView?.visibility!!
                (activity?.window?.decorView as FrameLayout).addView(
                    customView,
                    FrameLayout.LayoutParams(-1, -1)
                )
                activity?.window?.setDecorFitsSystemWindows(false)
            } else {
                originalVisibility = activity?.window?.decorView?.windowSystemUiVisibility!!
                (activity?.window?.decorView as FrameLayout).addView(
                    customView,
                    FrameLayout.LayoutParams(-1, -1)
                )
                activity?.window?.decorView?.systemUiVisibility =
                    3846 or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            }
            originalOrientation = activity?.requestedOrientation!!
        }

        /**
         * Callback will tell the host application that the current page exited full screen mode,
         * and the app has to hide custom view.
         */
        override fun onHideCustomView() {
            (activity?.window?.decorView as FrameLayout).removeView(
                customView
            )
            customView = null
            //Restoring app state, as it was before we go to full screen
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
                activity?.window?.setDecorFitsSystemWindows(true)
            } else {
                activity?.window?.decorView?.systemUiVisibility = originalVisibility
            }
            activity?.requestedOrientation = originalOrientation
            if (customViewCallback != null) customViewCallback!!.onCustomViewHidden()
            customViewCallback = null
        }
    }

Use of iProov

Please be aware that if iProov is included in your workflow, it is necessary to extend WebChromeClient class to implement a custom view, in order to handle certain iProov full screen requirements.

See WebViewFragment.kt code sample above, specifically WebChromeClientFullScreen inner class.

Sample App

Check out our Sample App for the Native Android WebView

iOS

Jumio supports two types of webview for iOS:

Safari WebView

ProsCons
Access to the camera during ID and IdentityNo optional postMessage communication
Fewer integration stepsFewer options for troubleshooting

Native iOS WebView

ProsCons
Optional postMessage communicationImage upload only (no access to the camera)
Better options for troubleshootingMore integration steps

Safari WebView This section illustrates how to embed ID Verification Web in a Safari View Controller.

Permissions and Settings Make sure that camera permissions are granted.

Sample code ViewController.swift example

import AVFoundation
import SafariServices
import UIKit

class ViewController: UIViewController {

    @IBAction func loadButton(_ sender: Any) {
        checkCameraPermission()
        let url: String = "https://www.jumio.com/"
        showSafariVC(inputText)
    }

    // present SFSafariViewController
    private func showSafariVC(_ stringURL: String) {
        guard let URL = URL(string: stringURL) else {
            return
        }

        let safariVC = SFSafariViewController(url: URL)
        present(safariVC, animated: true)
    }

    func safariViewControllerDidFinish(_ safariVC: SFSafariViewController) {
        safariVC.dismiss(animated: true, completion: nil)
    }

    // ask for camera permissions
    func checkCameraPermission() {
        AVCaptureDevice.requestAccess(for: .video) { (granted) in
            if !granted {
                print("Camera permission denied")
            }
        }
    }
}
Sample App

Check out our Sample App for the iOS Safari WebView

Native iOS WebView

This section illustrates how to embed ID Verification Web in a native iOS WebView.

Permissions and Settings

No specific permissions are needed as we cannot access the camera due to native WebView limitations for iOS.

Embedding the Required Script

To allow Jumio to identify the user runtime environment, you will need to embed a required script that sets flag NVW_WEBVIEW to true to interact with the webview window object. For details, see the sample code below.

Optional postMessage communication

You can handle messages from the ID Verification Web Client using the same method as described in Optional iFrame Logging.

Register a postMessage handler and put the relevant code sections in the userContentController function as shown below.

Sample code

ViewController.swift example

class ViewController: UIViewController {
@IBOutlet weak var webView: WKWebView!

override func viewDidLoad() {
super.viewDidLoad()
webView.navigationDelegate = self;

/**
* Registering handler for postMessage communication (iFrame logging equivalent - optional)
*/
webView.configuration.userContentController.add(self, name: "__NVW_WEBVIEW_HANDLER__")

webView.load( URLRequest("<<NVW4 SCAN REF LINK>>"));
}
}

extension ViewController: WKNavigationDelegate {
/**
* Embedding script at very beginning, before NVW4 initialize (important)
*/
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
/**
* Necessary integration step - embedding script
*/
self.webView?.evaluteJavaScript("(function() { window['__NVW_WEBVIEW__'] = true })()") { _, error in
if let error = error {
print("ERROR while evaluating javascript \(error)") // error handling whenever executing script fails
}
print("executed injected javascript")
};
}
}

extension ViewController: WKScriptMessageHandler {
/**
* PostMessage handler for iframe logging equivalent (optional)
*/
func userContentController(_ userController: WKUserContentController, didReceive message: WKScriptMessage) {
if message.name == "__NVW_WEBVIEW_HANDLER__", let messageBody = message.body as? String {
/*
* See iFrame logging:
* https://github.com/Jumio/implementation-guides/blob/master/netverify/netverify-web-v4.md#optional-iframe-logging
*/
}
}
}

Sample App Check out our Sample App for the Native iOS WebView

After the User Journey

At the end of the web acquisition user journey, the following query parameters are appended by the web client to the success or error URL before the end user is redirected by the browser. Required items appear in bold type.

NameDescription
accountIdUUID of the account
workflowExecutionIdUUID of the workflow
acquisitionStatusPossible values: SUCCESS, ERROR
customerInternalReferenceCustomer internal reference for a request to link it in the customer backend
errorCodePredefined list of error codes, only appended to errorUrl when acquisitionStatus is ERROR. Possible values: 9100 (Error occurred on our server), 9200 (Authorization token missing, invalid, or expired), 9210 (Session expired after the user journey started), 9300 (Error occurred transmitting image to our server), 9400 (Error occurred during verification step), 9800 (User has no network connection), 9801 (Unexpected error occurred in the client), 9810 (Problem while communicating with our server), 9820 (File upload not enabled and camera unavailable), 9821 (The biometric face capture process failed, e.g. issue with iProov), 9822 (Browser does not support camera), 9835 (No acceptable submission in 3 attempts), 9836 (Authentication Failure)

Supported Environments

Jumio offers guaranteed support for ID Verification on the following browsers and the latest major version of each operating system.

Desktop
BrowserMajor versionOperating systemSupports image uploadSupports camera captureSupports biometric face capture
Google Chromecurrent + 1 previousWindows + MacXXX
Mozilla Firefoxcurrent + 1 previousWindows + MacXXX
Apple SafaricurrentMacXXX
Microsoft EdgecurrentWindowsXXX
Mobile
Browser nameMajor browser versionOperating systemSupports image uploadSupports camera captureSupports biometric face capture
Google ChromecurrentAndroidXXX
Samsung InternetcurrentAndroidXXX
Apple SafaricurrentiOSXX

1Fullscreen functionality during capture only supported for iPads. iPhone process works, but fullscreen is limited and capture may be less accurate.

Native WebView
Operating systemMajor versionSupports image uploadSupports camera captureSupports biometric face capture
Native Android WebViewcurrent + 1 previousXXX
Native iOS WebView¹current + 1 previousX
iOS Safari WebViewcurrent + 1 previousXXX

1If you are using a native WebView for iOS you will need to enable image upload to allow the end user to finish the user journey.

Callback

The callback is the authoritative answer from Jumio. Specify a callback URL (for constraints see Configuring Settings in the Customer Portal) to automatically receive the result for each transaction.

To specify a global callback URL in the Customer Portal, see Configuring Settings in the Customer Portal.

A callback URL can also be specified per account, see instructions in sections Account Creation and Account Update.

Best Practices

Use callbacks to check if a workflow has finished processing. Once Jumio has sent the callback, save it on your side and send back a 200 OK response. Afterwards, to retrieve transaction details or images, use the Retrieval API.

Jumio Callback IP Addresses

Allowlist the following IP addresses for callbacks, and use them to verify that the callback originated from Jumio.

US Data Center:

34.202.241.227 34.226.103.119 34.226.254.127 52.52.51.178 52.53.95.123 54.67.101.173 Use the hostname callback.jumio.com to look up the most current IP addresses.

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 Use the hostname callback.lon.jumio.com to look up the most current IP addresses.

SGP Data Center:

3.0.109.121 52.76.184.73 52.77.102.92 Use the hostname callback.core-sgp.jumio.com to look up the most current IP addresses.

Callback Parameters

An HTTP POST request is sent to your specified callback URL containing an application/json formatted string with the transaction result.

ParameterTypeNotes
callbackSentAtstringTimestamp of the callback in the format: YYYY-MM-DDThh:mm:ss.SSSZ
userReferencestringUser reference (if set in initiate call)
workflowExecutionobjectPossible values: workflowExecution.id, workflowExecution.href
workflowExecution.idstringUUID of the workflow
workflowExecution.hrefstingURL to retrieve workflow details
workflowExecution.definitionKeystringKey of the workflow definition you executed. See supported keys
workflowExecution.statusstringPossible values: PROCESSED, SESSION_EXPIRED, TOKEN_EXPIRED
accountobjectPossible values: account.id, account.href
account.idUUID of the account
account.hrefURL to retrieve account details

Examples

{
"callbackSentAt":"2021-01-21T14:55:01.917Z",
"workflowExecution":{
"id":"22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"href":"https://retrieval.apac-1.jumio.ai/api/v1/accounts/11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx/workflow-executions/22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"definitionKey":"3",
"status":"PROCESSED"
},
"account":{
"id":"11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"href":"https://retrieval.apac-1.jumio.ai/api/v1/accounts/11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}
}

Retrieval

The Retrieval API allows you to get information from a transaction, including the transaction status, workflow details, and images.

Best Practices

Before retrieving transaction data, make sure the transaction is complete. Waiting for the callback using the Callback API is recommended. Alternatively, transaction status can also be retrieved using the Retrieval Status API. If the transaction status is PROCESSED, retrieve details and image(s) once. If the transaction status is SESSION_EXPIRED or TOKEN_EXPIRED, the transaction has been unsuccessful. Maximum of 10 consecutive retrieval attempts after successful image acquisition. Request timings recommendations: 40, 60, 100, 160, 240, 340, 460, 600, 760, 940 seconds You are also allowed to set your own definition.

Request

Request Headers The following fields are required in the header section of your request:

Accept: application/json Content-Type: application/json Content-Length: see RFC-7230 Authorization: see RFC6749 User-Agent: YourCompany YourApp/v1.0

⚠️ Jumio requires the User-Agent value to reflect your business or entity name for API troubleshooting. ℹ️ Calls with missing or suspicious headers, suspicious parameter values, or without OAuth2 will result in HTTP status code 403 Forbidden

Available Retrieval APIs

This section describes the Retrieval APIs: Status, Workflow Details, and Images.

Get Status

HTTP Request Method: GET

US: https://retrieval.amer-1.jumio.ai/api/v1/accounts/<accountId>/workflow-executions/<workflowExecutionId>/status EU: https://retrieval.emea-1.jumio.ai/api/v1/accounts/<accountId>/workflow-executions/<workflowExecutionId>/status SG: https://retrieval.apac-1.jumio.ai/api/v1/accounts/<accountId>/workflow-executions/<workflowExecutionId>/status

Status Request Path Parameters

ParameterTypeNote
accountIdstringUUID of the account
workflowExecutionIdstringUUID of the workflow

Status Response

Unsuccessful requests will return HTTP status code 401 Unauthorized, 403 Forbidden or 404 Not Found if the scan is not available.

Successful requests will return HTTP status code 200 OK along with a JSON object containing the information described below.

ParameterTypeNote
accountobjectPossible values: account.id, account.href
account.idstringUUID of the account
account.hrefstringURL to retrieve account details
workflowExecutionobjectPossible values: workflowExecution.id, workflowExecution.href, workflowExecution.definitionKey, workflowExecution.status
workflowExecution.idstringUUID of the workflow
workflowExecution.hrefstringURL to retrieve workflow details
workflowExecution.definitionKeystringKey of the workflow definition which you executed. See supported keys
workflowExecution.statusstringPossible values: INITIATED, ACQUIRED, PROCESSED, SESSION_EXPIRED, TOKEN_EXPIRED

Examples

{
"account": {
"id": "11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"href": "https://retrieval.apac-1.jumio.ai/api/v1/accounts/11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"workflowExecution": {
"id": "22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"href": "https://retrieval.apac-1.jumio.ai/api/v1/workflow-executions/22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"definitionKey": "2",
"status": "PROCESSED"
}
}

Get Workflow Details

HTTP Request Method: GET

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>

Workflow Request Path Parameters

ParameterTypeNote
accountIdstringUUID of the account
workflowExecutionIdstringUUID of the workflow

Workflow Execution Response Unsuccessful requests will return HTTP status code 401 Unauthorized, 403 Forbidden or 404 Not Found if the scan is not available.

Successful requests will return HTTP status code 200 OK along with a JSON object containing the information described below.

ParameterTypeNote
createdAtstringTimestamp (UTC) of the creation. Format: YYYY-MM-DDThh:mm:ss.SSSZ
startedAtstringTimestamp (UTC) of the start. Format: YYYY-MM-DDThh:mm:ss.SSSZ
completedAtstringTimestamp (UTC) of the completion. Format: YYYY-MM-DDThh:mm:ss.SSSZ
accountobjectPossible values: account.id
account.idstringUUID of the account
workflowobjectPossible values: workflow.id, workflow.status, workflow.definitionKey, workflow.userReference, workflow.customerInternalReference
workflow.idstringUUID of the workflow
workflow.statusstringPossible values: INITIATED, ACQUIRED, PROCESSED, SESSION_EXPIRED, TOKEN_EXPIRED
workflow.definitionKeystringSee supported keys
workflow.userReferencestringCustomer internal reference for a request to link it in the customer backend (must not contain any PII)
workflow.customerInternalReferencestringReference for the end user in the customer backend (must not contain any PII)
credentialsarray (object)See credentials
capabilitiesobjectSee capabilities

credentials

ParameterTypeNote
idstringUUID of the credentials
categorystringID
partsobjectPossible values: parts.classifier, parts.href
parts.classifierstringPossible values: FRONT, BACK, FACE
parts.hrefstringhref to manage parts for the account credentials

capabilities Since workflow execution consists of a chain of multiple capability executions (usability, extraction, liveness, ...), some have dependencies between them and need the result of previous executions.

This means that some capabilities should not be executed if any of the previous capabilities were not successful because they were REJECTED or NOT_EXECUTED. If, for example, usability has passed, but imageChecks got rejected with the reason DIGITAL_COPY, the consequent extraction and dataChecks cannot be executed because of PRECONDITION_NOT_FULFILLED. The precondition in this case would be to successfully pass imageChecks.

Capability execution dependencies

usability --> imageChecks --> extraction --> dataChecks usability --> liveness usability --> similarity usability --> authentication usability --> imageChecks --> extraction --> watchlistScreening usability --> imageChecks --> extraction --> addressValidation usability --> imageChecks --> extraction --> proofOfResidency usability --> imageChecks --> extraction --> drivingLicenseVerification

ParameterTypeNoteDependency
usabilityarray (object)See usabilitynone
livenessarray (object)See livenessusability
similarityarray (object)See similarityusability
authenticationarray (object)See authenticationusability
imageChecksarray (object)See imageChecksusability
extractionarray (object)See extractionusability, imageChecks
dataChecksarray (object)See dataChecksusability, imageChecks, extraction
watchlistScreeningarray (object)See watchlistScreeningusability, imageChecks, extraction
addressValidationarray (object)See addressValidationusability, imageChecks, extraction
proofOfResidencyarray (object)See proofOfResidencyusability, imageChecks, extraction
drivingLicenseVerificationarray (object)See drivingLicenseVerificationusability, imageChecks, extraction
capabilities.usability

Dependency: none

ParameterTypeNote
idstringUUID of the capability
credentialsobject
credentials.idstringUUID of the credentials
credentials.categorystringPossible values: ID, FACEMAP, DOCUMENT, SELFIE
decisionobject
decision.typestringPossible values: NOT_EXECUTED, PASSED, REJECTED, WARNING
decision.detailsobject
decision.details.labelstringif decision.type = NOT_EXECUTED: TECHNICAL_ERROR, NOT_UPLOADED. if decision.type = PASSED: OK. if decision.type = REJECTED: BAD_QUALITY, BLURRED1, BAD_QUALITY_IMAGE1, PART_OF_DOCUMENT_MISSING1, PART_OF_DOCUMENT_HIDDEN1, DAMAGED_DOCUMENT1, GLARE1, MISSING_MANDATORY_DATAPOINTS1, BLACK_WHITE, MISSING_PAGE, MISSING_SIGNATURE, NOT_A_DOCUMENT, PHOTOCOPY. if decision.type = WARNING: LIVENESS_UNDETERMINED, UNSUPPORTED_COUNTRY, UNSUPPORTED_DOCUMENT_TYPE

. 1 Will be added in the week of January 30, 2023.

capabilities.similarity

Dependency:usability

ParameterTypeNote
idstringUUID of the capability
credentialsobject
credentials.idstringUUID of the credentials
credentials.categorystringPossible values: ID, FACEMAP, DOCUMENT, SELFIE
decisionobject
decision.typestringPossible values: NOT_EXECUTED, PASSED, REJECTED, WARNING
decision.detailsobject
decision.details.labelstringIf decision.type = REJECTED: LIVENESS_UNDETERMINED, ID_USED_AS_SELFIE, MULTIPLE_PEOPLE, DIGITAL_COPY, PHOTOCOPY, MANIPULATED, NO_FACE_PRESENT, FACE_NOT_FULLY_VISIBLE, BLACK_WHITE. If decision.type = PASSED: OK. If decision.type = WARNING: AGE_DIFFERENCE, BAD_QUALITY. If decision.type = NOT_EXECUTED: PRECONDITION_NOT_FULFILLED, TECHNICAL_ERROR.
dataobject
data.typestringPossible values: IPROOV_STANDARD (Web + SDK channel only), IPROOV_PREMIUM (Workflow 3: ID and Identity Verification – Web + SDK channel only; Workflow 9: Authentication – SDK only; Workflow 16: Authentication on Premise – SDK only), JUMIO_STANDARD
data.predictedAgeintegerPredicted age according to the selfie. Example: 28
data.ageConfidenceRangestringAge range we are confident the selfie age is within. Example: 25-34
validFaceMapForAuthenticationstringHref to manage facemap
capabilities.authentication

Dependency:usability

ParameterTypeNote
idstringUUID of the capability
credentialsobject
credentials.idstringUUID of the credentials
credentials.categorystringPossible values: ID, FACEMAP, DOCUMENT, SELFIE
decisionobject
decision.typestringPossible values: NOT_EXECUTED, PASSED, REJECTED, WARNING
decision.detailsobject
decision.details.labelstringIf decision.type = REJECTED: LIVENESS_UNDETERMINED, ID_USED_AS_SELFIE, MULTIPLE_PEOPLE, DIGITAL_COPY, PHOTOCOPY, MANIPULATED, NO_FACE_PRESENT, FACE_NOT_FULLY_VISIBLE, BLACK_WHITE. If decision.type = PASSED: OK. If decision.type = WARNING: AGE_DIFFERENCE, BAD_QUALITY. If decision.type = NOT_EXECUTED: PRECONDITION_NOT_FULFILLED, TECHNICAL_ERROR.
dataobject
data.typestringPossible values: IPROOV_STANDARD (Web + SDK channel only), IPROOV_PREMIUM (Workflow 3: ID and Identity Verification – Web + SDK channel only; Workflow 9: Authentication – SDK only; Workflow 16: Authentication on Premise – SDK only), JUMIO_STANDARD
data.predictedAgeintegerPredicted age according to the selfie. Example: 28
data.ageConfidenceRangestringAge range we are confident the selfie age is within. Example: 25-34
validFaceMapForAuthenticationstringHref to manage facemap
capabilities.imageChecks

Dependency:usability

ParameterTypeDescription
idstringUUID of the capability.
credentialsobjectInformation about the credentials used for this capability.
credentials.idstringUUID of the credentials.
credentials.categorystringCategory of the credential. Possible values: ID, FACEMAP, DOCUMENT, SELFIE.
decisionobjectContains the result of the capability evaluation.
decision.typestringOverall decision outcome. Possible values: NOT_EXECUTED, PASSED, REJECTED, WARNING.
decision.detailsobjectProvides additional details about the decision.
decision.details.labelstringDetailed decision reason based on decision.type (see below).
dataobjectAdditional capability-specific data. See imageChecks.data for structure.

Decision Details Mapping

If decision.type = NOT_EXECUTED

Possible decision.details.label values:

  • PRECONDITION_NOT_FULFILLED
  • TECHNICAL_ERROR

If decision.type = PASSED

  • OK

If decision.type = REJECTED

  • DIGITAL_COPY
  • WATERMARK
  • MANIPULATED_DOCUMENT
  • MANIPULATED_DOCUMENT_PHOTO1
  • MANIPULATED_DOCUMENT_EXPIRY1
  • MANIPULATED_DOCUMENT_NAME1
  • MANIPULATED_DOCUMENT_ADDRESS1
  • MANIPULATED_DOCUMENT_SECURITY_CHECKS1
  • MANIPULATED_DOCUMENT_SIGNATURE1
  • MANIPULATED_DOCUMENT_PERSONAL_NUMBER1
  • MANIPULATED_DOCUMENT_PLACE_OF_BIRTH1
  • MANIPULATED_DOCUMENT_GENDER1
  • MANIPULATED_DOCUMENT_ISSUING_DATE1
  • OTHER_REJECTION
  • GHOST_IMAGE_DIFFERENT
  • PUNCHED
  • SAMPLE
  • FAKE
  • CHIP_MISSING
  • DIGITAL_MANIPULATION
  • MISMATCH_FRONT_BACK

If decision.type = WARNING

  • DIFFERENT_PERSON
  • REPEATED_FACE (Same face with same data occurs multiple times — potential opening of multiple accounts.)

. 1 Will be added in the week of January 30, 2023.

capabilities.imageChecks.data
ParameterTypeDescription
data.faceSearchFindingsobjectResult of the 1:N face search performed against faces from previous transactions.
data.faceSearchFindings.statusstringStatus of the face search execution. Possible values: DONE, PENDING, ERROR.
data.faceSearchFindings.findingsarray (string)List of workflow IDs where a face (from the ID document or Selfie) matches a face from a previous transaction.
data.faceSearchFindings.findings[]stringUUID of the matching workflow.
capabilities.extraction

Dependencies:usability, imageChecks

ParameterTypeDescription
idstringUUID of the capability.
credentialsobjectCredential information related to the capability execution.
credentials.idstringUUID of the credentials.
credentials.categorystringType of credential used. Possible values: ID, FACEMAP, DOCUMENT, SELFIE.
decisionobjectResult of the capability evaluation.
decision.typestringOverall decision outcome. Possible values: NOT_EXECUTED, PASSED.
decision.detailsobjectAdditional information about the decision outcome.
decision.details.labelstringDetailed decision label.

If decision.type = NOT_EXECUTED: PRECONDITION_NOT_FULFILLED, TECHNICAL_ERROR.
If decision.type = PASSED: OK.
dataobjectContains capability-specific result data. See extraction.data section for details.
capabilities.extraction.data
ParameterTypeDescription
data.typestringDocument type. Possible values:
  • PASSPORT
  • DRIVING_LICENSE
  • ID_CARD
  • VISA
  • UNSUPPORTED
data.subTypestringDocument subtype.
  • If data.type = ID_CARD:
    • NATIONAL_ID
    • CONSULAR_ID
    • ELECTORAL_ID
    • RESIDENT_PERMIT_ID
    • TAX_ID
    • STUDENT_ID
    • PASSPORT_CARD_ID
    • MILITARY_ID
    • PUBLIC_SAFETY_ID
    • HEALTH_ID
    • OTHER_ID
    • VISA
    • UNKNOWN
  • If data.type = DRIVING_LICENSE:
    • REGULAR_DRIVING_LICENSE
    • LEARNING_DRIVING_LICENSE
  • If data.type = PASSPORT:
    • E_PASSPORT (mobile only)
data.issuingCountrystringCountry code in ISO 3166-1 alpha-3 format.
data.firstNamestringFirst name as shown on the ID (if enabled), otherwise as provided.
data.lastNamestringLast name as shown on the ID (if enabled), otherwise as provided.
data.dateOfBirthstringDate of birth in format YYYY-MM-DD (if enabled), otherwise as provided.
data.expiryDatestringExpiry date in format YYYY-MM-DD (if enabled), otherwise as provided.
data.issuingDatestringIssuing date in format YYYY-MM-DD (if enabled), otherwise as provided.
data.statestringState or region code.
  • US: last two characters of ISO 3166-2
  • AU: last 2–3 characters of ISO 3166-2
  • CA: last two characters of ISO 3166-2
  • ISO 3166-1 country name
  • XKX (Kosovo)
  • Free text if mapping is not possible
data.personalNumberstringPersonal number (if type = PASSPORT and available). Activation required.
data.optionalMrzField1stringOptional MRZ field (line 1).
data.optionalMrzField2stringOptional MRZ field (line 2).
data.addressobjectExtracted address information. Activation required.
data.issuingAuthoritystringIssuing authority of the document. Activation required.
data.issuingPlacestringIssuing place of the document. Activation required.
data.curpstringCURP (Mexico). Activation required.
data.genderstringGender. Possible values:
  • M
  • F
  • X
data.nationalitystringNationality (ISO 3166-1 alpha-3). Activation required.
data.placeOfBirthstringPlace of birth of the document holder.
data.taxNumberstringTax number.
  • If country = ITA and subtype = HEALTH_ID or TAX_ID
  • Activation required
data.cpfstringCPF number. Activation required.
data.registrationNumberstringRegistration number. Activation required.
data.mothersNamestringMother’s name. Activation required.
data.fathersNamestringFather’s name. Activation required.
data.personalIdentificationNumberstringPersonal identification number. Activation required.
  • GEO + PASSPORT
  • COL + ID_CARD
  • LTU + DRIVING_LICENSE
  • TUR + ID_CARD, DRIVING_LICENSE
  • ROU + ID_CARD, DRIVING_LICENSE
data.rgNumberstring“General Registration” number.
  • If country = BRA
  • Activation required
data.dlCategoriesarrayDriving license categories.
data.voterIdNumberstringVoter ID number.
  • If country = MEX
  • Activation required
data.issuingNumberstringIssuing number.
  • If country = MEX
  • Activation required
data.passportNumberstringPassport number.
  • If type = VISA
  • Activation required
data.durationOfStaystringDuration of stay.
  • If type = VISA
  • Activation required
data.numberOfEntriesstringNumber of entries.
  • If type = VISA
  • Activation required
data.visaCategorystringVisa category.
  • If type = VISA
  • Activation required
data.dnistringDNI number.
  • If country = ESP and subtype = NATIONAL_ID
  • Activation required
data.peselstringPESEL number.
  • If country = POL
  • Activation required
data.expiryDatePartsobjectStructured expiry date.
  • year (YYYY)
  • month (MM)
  • day (DD)
Example: {"year":"2022","month":"08","day":"31"}
data.dateOfBirthPartsobjectStructured date of birth.
  • year (YYYY)
  • month (MM)
  • day (DD)
Example: {"year":"2022","month":"08","day":"31"}
data.issuingDatePartsobjectStructured issuing date.
  • year (YYYY)
  • month (MM)
  • day (DD)
Example: {"year":"2022","month":"08","day":"31"}
data.laborIdentificationNumberstringCUIL number.
  • If country = ARG
  • Activation required
data.documentCopystringEjemplar number.
  • If country = ARG
  • Activation required
data.residentPermitTypestringPermit type related to “Golden Visas”.
  • If country = GBR
  • Activation required
data.residentPermitRemarksstringPermit remarks related to “Golden Visas”.
  • If country = GBR
  • Activation required
data.documentIdentificationNumberstringDocument Identification Number. Activation required.
data.citizenshipstringCitizenship.
  • If country = IDN
  • Activation required
data.maritalStatusstringMarital status.
  • If country = IDN
  • Activation required
data.religionstringReligion.
  • If country = IDN, MYS
  • Activation required
data.currentAgeintegerCalculated age (current date − extracted date of birth). Example: 30.
data.lastNameAtBirthstringLast name at birth.
  • If country = SLO
  • Activation required
data.remarksstringSpecial remarks or titles.
  • If country = SLO
  • Example: "Mgr"
  • Activation required
data.disabilitystringIndicates whether at least one disability icon is present.
  • If country = BHR
  • Possible values: YES, NO
  • Activation required

1 If one of the values such as "day" is not included in the document it will also not be returned in the object. For examples and additional details, refer to our Knowledge Base.

capabilities.extraction.data.address
ParameterTypeDescription
line1stringLine item 1.
line2stringLine item 2.
line3stringLine item 3.
line4stringLine item 4.
line5stringLine item 5.
countrystringCountry code.
  • ISO 3166-1 alpha-3 country code
  • XKX (Kosovo)
postalCodestringPostal code.
subdivisionstringSubdivision (Region, State, Province, Emirate, Department, etc.).
citystringCity.
formattedAddressstringComplete formatted address.
capabilities.dataChecks

Dependencies:usability, imageChecks, extraction

ParameterTypeDescription
idstringUUID of the capability.
credentialsobjectCredential information related to the capability execution.
credentials.idstringUUID of the credentials.
credentials.categorystringCredential category.
  • ID
  • FACEMAP
  • DOCUMENT
  • SELFIE
decisionobjectResult of the capability evaluation.
decision.typestringOverall decision outcome.
  • NOT_EXECUTED
  • PASSED
  • REJECTED
decision.detailsobjectAdditional information about the decision outcome.
decision.details.labelstringDetailed decision label.
  • If decision.type = NOT_EXECUTED:
    • PRECONDITION_NOT_FULFILLED
    • TECHNICAL_ERROR
  • If decision.type = PASSED:
    • OK
  • If decision.type = REJECTED:
    • NFC_CERTIFICATE
    • MISMATCHING_DATAPOINTS
    • MRZ_CHECKSUM
    • MISMATCHING_DATA_REPEATED_FACE (same face occurs multiple times with different data – high possibility of fraud attempt)
    • MISMATCH_HRZ_MRZ_DATA
capabilities.watchlistScreening

Dependencies:usability, imageChecks, extraction

ParameterTypeDescription
idstringUUID of the capability
credentialsobjectCredential information
credentials.idstringUUID of the credentials
credentials.categorystringPossible values:
  • ID
  • FACEMAP
  • DOCUMENT
  • SELFIE
decisionobjectDecision result
decision.typestringPossible values:
  • NOT_EXECUTED
  • PASSED
  • WARNING
decision.detailsobjectAdditional decision details
decision.details.labelstring
  • If decision.type = NOT_EXECUTED:
    • NOT_ENOUGH_DATA
    • VALIDATION_FAILED
    • INVALID_MERCHANT_SETTINGS
    • TECHNICAL_ERROR
    • EXTRACTION_NOT_DONE
    • NO_VALID_ID_CREDENTIAL
    • PRECONDITION_NOT_FULFILLED
  • If decision.type = PASSED:
    • OK
  • If decision.type = WARNING:
    • ALERT
dataobjectSee watchlistScreening.data
capabilities.watchlistScreening.data

Dependencies:usability, imageChecks, extraction

ParameterTypeDescription
searchDatestringTimestamp (UTC) of the response.
  • Format: YYYY-MM-DDThh:mm:ss.SSSZ
searchStatusstringPossible values:
  • DONE
  • NOT_DONE
  • ERROR
searchIdstringReturned only if searchStatus = DONE
searchReferencestringReturned only if searchStatus = DONE
searchResultUrlstringReturned only if searchStatus = DONE
searchResultsintegerReturned only if searchStatus = DONE
capabilities.addressValidation
ParameterTypeDescription
idstringUUID of the capability
credentialsobjectCredential information
credentials.idstringUUID of the credentials
credentials.categorystringPossible values:
  • ID
  • FACEMAP
  • DOCUMENT
  • SELFIE
decisionobjectDecision result
decision.typestringPossible values:
  • NOT_EXECUTED
  • PASSED
  • REJECTED
  • WARNING
decision.detailsobjectAdditional decision details
decision.details.labelstring
  • If decision.type = NOT_EXECUTED:
    • NOT_ENOUGH_DATA
    • TECHNICAL_ERROR
    • UNSUPPORTED_COUNTRY
    • PRECONDITION_NOT_FULFILLED
  • If decision.type = PASSED:
    • OK
  • If decision.type = REJECTED:
    • DENY
  • If decision.type = WARNING:
    • ALERT
capabilities.proofOfResidency

Dependencies: usability, imageChecks, extraction

ParameterTypeDescription
idstringUUID of the capability
credentialsobjectCredential information
credentials.idstringUUID of the credentials
credentials.categorystringPossible values:
  • ID
  • FACEMAP
  • DOCUMENT
  • SELFIE
decisionobjectDecision result
decision.typestringPossible values:
  • NOT_EXECUTED
  • PASSED
  • REJECTED
  • WARNING
decision.detailsobjectAdditional decision details
decision.details.labelstring
  • If decision.type = NOT_EXECUTED:
    • NOT_ENOUGH_DATA
    • TECHNICAL_ERROR
    • UNSUPPORTED_COUNTRY
    • PRECONDITION_NOT_FULFILLED
  • If decision.type = PASSED:
    • OK
  • If decision.type = REJECTED:
    • DENY
  • If decision.type = WARNING:
    • ALERT
capabilities.drivingLicenseVerification

Dependencies:usability, imageChecks, extraction

ParameterTypeDescription
idstringUUID of the capability
credentialsobjectCredential information
credentials.idstringUUID of the credentials
credentials.categorystringPossible values:
  • ID
  • FACEMAP
  • DOCUMENT
  • SELFIE
decisionobjectDecision result
decision.typestringPossible values:
  • NOT_EXECUTED
  • PASSED
  • REJECTED
  • WARNING
decision.detailsobjectAdditional decision details
decision.details.labelstring
  • If decision.type = NOT_EXECUTED:
    • TECHNICAL_ERROR
    • UNSUPPORTED_COUNTRY
    • UNSUPPORTED_STATE
    • PRECONDITION_NOT_FULFILLED
    • VALIDATION_FAILED
  • If decision.type = PASSED:
    • OK
  • If decision.type = REJECTED:
    • DENY
  • If decision.type = WARNING:
    • ALERT
Examples

Request

GET
/api/v1/accounts/11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx/workflow-executions/22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx HTTP/1.1
Host: retrieval.apac-1.jumio.ai
User-Agent: User Demo
Authorization: Bearer xxx

Response

{
"workflow": {
"id": "22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"status": "PROCESSED",
"definitionKey": "10003"
},
"account": {
"id": "11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
},
"createdAt": "2021-03-12T15:47:17.234Z",
"startedAt": "2021-03-12T15:49:32.202Z",
"completedAt": "2021-03-12T15:49:33.421Z",
"credentials": [
{
"id": "33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"category": "ID",
"parts": [
{
"classifier": "FRONT",
"href": "https://retrieval.amer-1.jumio.ai/api/v1/accounts/11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx/credentials/33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx/parts/FRONT"
}
]
}
],
"capabilities": {
"extraction": [
{
"id": "1a11111-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"credentials": [
{
"id": "33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"category": "ID"
}
],
"decision": {
"type": "PASSED",
"details": {
"label": "OK"
}
},
"data": {
"type": "PASSPORT",
"subType": "E_PASSPORT",
"firstName": "JANE",
"lastName": "DOE",
"dateOfBirth": "1990-01-01",
"expiryDate": "2023-12-01",
"issuingDate": "2014-01-01",
"documentNumber": "xxxxxxxx",
"personalNumber": "<<<<<<<<<<<<<<",
"address": {
"country": "AUT",
"formattedAddress": "AUT"
}
}
}
],
"dataChecks": [
{
"id": "1b11111-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"credentials": [
{
"id": "33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"category": "ID"
}
],
"decision": {
"type": "PASSED",
"details": {
"label": "OK"
}
}
}
],
"imageChecks": [
{
"id": "1c11111-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"credentials": [
{
"id": "33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"category": "ID"
}
],
"decision": {
"type": "PASSED",
"details": {
"label": "OK"
}
}
}
],
"usability": [
{
"id": "1d11111-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"credentials": [
{
"id": "33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"category": "ID"
}
],
"decision": {
"type": "PASSED",
"details": {
"label": "OK"
}
}
}
{
"id": "1f11111-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"credentials": [
{
"id": "44444444-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"category": "SELFIE"
}
],
"decision": {
"type": "PASSED",
"details": {
"label": "OK"
}
}
},
{
"id": "1g11111-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"credentials": [
{
"id": "55555555-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"category": "FACEMAP"
}
],
"decision": {
"type": "PASSED",
"details": {
"label": "OK"
}
}
}
]
"watchlistScreening": [
{
"id": "1411111-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"credentials": [
{
"id": "33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"category": "ID"
}
],
"decision": {
"type": "PASSED",
"details": {
"label": "OK"
}
},
"data": {
"searchDate": "2021-07-15T10:44:11.000Z",
"searchId": "12345678",
"searchReference": "1626345851-xxxxxx",
"searchResultUrl": "https://app.xxx.com/public/search/123456XXC-xxxx/xxxccc",
"searchResults": 0,
"searchStatus": "SUCCESS"
}
}
],
“addressValidation”: [
{
"id": "1511111-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"credentials": [
{
"id": "33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"category": "ID"
}
],
"decision": {
"type": "PASSED",
"details": {
"label": "OK"
}
},
}
],
“proofOfResidency”: [
{
"id": "1611111-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"credentials": [
{
"id": "33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"category": "ID"
}
],
"decision": {
"type": "PASSED",
"details": {
"label": "OK"
}
},
}
],
"drivingLicenseVerification": [
{
"id": "1711111-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"credentials": [
{
"id": "33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"category": "ID"
}
],
"decision": {
"type": "PASSED",
"details": {
"label": "OK"
}
},
}
]
}
}

Get Images

HTTP Request Method: GET

US: https://retrieval.amer-1.jumio.ai/api/v1/accounts/<accountId>/credentials/<credentialId>/parts/<classifier> EU: https://retrieval.emea-1.jumio.ai/api/v1/accounts/<accountId>/credentials/<credentialId>/parts/<classifier> SG: https://retrieval.apac-1.jumio.ai/api/v1/accounts/<accountId>/credentials/<credentialId>/parts/<classifier>

Request

Image Request Path Parameters

ParameterTypeDescription
accountIdstringUUID of the account
credentialIdstringUUID of the credential
classifierstringPossible values:
  • FRONT
  • BACK
  • FACE
  • FACEMAP

Image Response

Unsuccessful requests will return the relevant HTTP status code and information about the cause of the error. HTTP status code 404 Not Found will be returned if the transaction is not available, has been deleted, or does not contain the image you requested. Successful requests will return HTTP status code 200 OK along with a JPG or PNG image and the appropriate header (e.g. Content-Type: image/jpeg).

Examples

Request

GET
/api/v1/accounts/11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx/credentialsId/33333333-xxxx-xxxx-xxxx-xxxxxxxxxxxx HTTP/1.1
Host: retrieval.apac-1.jumio.ai
User-Agent: User Demo
Authorization: Bearer xxx

Health Check

Use this API to check the status of the Jumio services.

Request

Request Headers The following fields are required in the header section of your request:

Accept: application/json User-Agent: YourCompany YourApp/v1.0

⚠️ Jumio requires the User-Agent value to reflect your business or entity name for API troubleshooting. ℹ️ Calls with missing or suspicious headers, suspicious parameter values, or without OAuth2 will result in HTTP status code 403 Forbidden

Get Health Check

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 Check Response Parameters
ParameterTypeDescription
statusstringOverall system status.
  • UP
  • DEGRADED
  • DOWN
detailsobjectComponent-level status details.
  • details.api
  • details.callback
  • details.mobile
  • details.processing
  • details.retrieval
  • details.web
details.apistringPossible values:
  • UP
  • DEGRADED
  • DOWN
details.callbackstringPossible values:
  • UP
  • DEGRADED
  • DOWN
details.mobilestringPossible values:
  • UP
  • DEGRADED
  • DOWN
details.processingstringPossible values:
  • UP
  • DEGRADED
  • DOWN
details.retrievalstringPossible values:
  • UP
  • DEGRADED
  • DOWN
details.webstringPossible values:
  • UP
  • DEGRADED
  • DOWN

Examples

Request

> curl https://status.apac-1.jumio.ai
Response
{
"status":"UP"
}

//

{
"status":"DEGRADED",
"details": {
"mobile":"DEGRADED",
"callback":"DEGRADED"
}
}

//

{
"status":"DOWN",
"details": {
"retrieval": "DOWN",
"callback": "DOWN",
"api":"DOWN"
}
}

Deletion

Use this API to delete accounts or workflows.

Usage

Request Request Headers The following fields are required in the header section of your request:

Accept: application/json Authorization: see RFC6749 User-Agent: YourCompany YourApp/v1.0

⚠️ Jumio requires the User-Agent value to reflect your business or entity name for API troubleshooting. ℹ️ Calls with missing or suspicious headers, suspicious parameter values, or without OAuth2 will result in HTTP status code 403 Forbidden

Available Deletion APIs

Account Deletion Deletes the account and all related workflows to the account specified by accountId.

HTTP Request Method: DELETE

US: https://retrieval.amer-1.jumio.ai/api/v1/accounts/<accountId>
EU: https://retrieval.emea-1.jumio.ai/api/v1/accounts/<accountId>
SG: https://retrieval.apac-1.jumio.ai/api/v1/accounts/<accountId>
Account Deletion Request Path Parameter
ParameterTypeDescription
accountIdstringUUID of the account

Response

Unsuccessful requests will return the relevant HTTP status code and information about the cause of the error.

Successful requests will return HTTP status code 200 OK as confirmation that you have successfully deleted the image(s) and extracted data from the specified transaction record.

Workflow Deletion

Deletes the workflow specified by workflowExecutionId.

HTTP Request Method: DELETE

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>
Workflow Deletion Request Path Parameters
ParameterTypeDescription
accountIdstringUUID of the account
workflowExecutionIdstringUUID of the workflow execution

Response

Unsuccessful requests will return the relevant HTTP status code and information about the cause of the error.

Successful requests will return HTTP status code 200 OK as confirmation that you have successfully deleted the image(s) and extracted data from the specified transaction workflow.

Example

Request

DELETE
/api/v1/accounts/11111111-xxxx-xxxx-xxxx-xxxxxxxxxxxx/workflow-executions/22222222-xxxx-xxxx-xxxx-xxxxxxxxxxxx HTTP/1.1
Host: retrieval.apac-1.jumio.ai
User-Agent: User Demo
Authorization: Bearer xxx

Table of Contents