NAV

Introduction

IDmission provides best-in-class IDentity Solutions through our APIs and SDKs which integrate directly into your existing workflows. Whether you're looking for document verification, identity authentication, frictionless liveness detection, or biometric deduplication services, IDentity Solutions is your all-in-one toolkit.

For more information please visit: IDmission IDentity Solutions

Getting Started with API

STEP 1: Obtain access to our IDentity Portal

STEP 2: Generate Sandbox Testing Credentials

STEP 3: Review the API Services Documentation

API Overview

Although IDmission’s recommendation is to utilize our Mobile & Web SDKs for ID Capture and Passive Liveness Detection, if you already have those capture functions in place, our APIs are available to accept this information. There are several services that are available to submit input data and images based on your business need. The core services utilized by the majority of our customers are as follows:

General API Guidelines and Examples

With the Validate ID based services, there are several request options that provide flexibility in controlling the flow of the service. One of the main options is to elect to have IDmission’s Team of identity Experts perform a manual review. If this option is selected, it will be important to refer to the POST Processing API for the webhook that will provide the results. If this option is not utilized, the standard response will provide you with the results and extracted ID data.

Code Examples Python

import urllib.request
import ssl
ctx = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
requestString = "Your Request"
url = 'Your URL'
f = urllib.request.urlopen(url, data = bytes(requestString, 'utf-8'), context = ctx)
resp = f.read().decode('utf-8')
print("" + resp)

Code Examples Java

>"Note: Before using the preceding code, please verify that TLS1.2 support is already added
 to the JVM ( -Dhttps.protocols=TLSv1, TLSv1.1, TLSv1.2)."
 public static String submitRequest(String url, String requestJson) {
    String exceptionCode = "";
    String exceptionStatusMsg = "";
    String resp = "";
    SSLContext sslContext = null;
    HttpURLConnection httpConn = null;
try {
    URL urlObj = new URL(url);
    URLConnection conn = urlObj.openConnection();
    httpConn = (HttpURLConnection) conn;
    httpConn.setRequestMethod("POST");
    int readTimeout = 15 * 1000;
    int connTimeout = 1000;
    // logger.info(" ReadTimeout >>" + readTimeout +
    // "<< connTimeout >> " + connTimeout);
    httpConn.setConnectTimeout(connTimeout);
    httpConn.setReadTimeout(readTimeout);
    httpConn.setDoInput(true);
    // logger.info(" Host url >>" + url);
    httpConn.setDoOutput(true);
    httpConn.setRequestProperty("Content-Type", "application/json; charset=utf-8");
    OutputStream outStream = httpConn.getOutputStream();
    outStream.write(requestJson.getBytes());
    outStream.close();
    InputStream inStream = httpConn.getInputStream();
    ByteArrayOutputStream respBytes = new ByteArrayOutputStream();
    //use ioutil.transfer
    transfer(inStream, respBytes, false, 1024);
    resp = new String(respBytes.toByteArray());
} catch (Exception e) {
// logger.error("Error while using processing", respe);
    e.printStackTrace();
}
    return resp;
}

Code Examples csharp

 public static String postRequest(String url, String requestJson)
  {
        String resp = null;
          HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            byte[] requestBytes = System.Text.Encoding.UTF8.GetBytes(requestJson);
            request.ContentType = "application/json; encoding='utf-8'";
            request.ContentLength = requestBytes.Length;
            request.Method = "POST";
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(requestBytes, 0, requestBytes.Length);
            requestStream.Close();
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();;
            if (response.StatusCode == HttpStatusCode.OK)
             {
                   Stream responseStream = response.GetResponseStream();
                   string responseStr = new StreamReader(responseStream).ReadToEnd();
                   return responseStr;
             }
    return resp;
}

Certification

Certification URL for API: To submit the application, use the following link: https://identity.idmission.com/IDS/service/integ/idm/thirdparty/upsert

Note: Follow the examples in the subsequent sections as a guide to the IDentity API Services.

API Services

Swagger API


POST Processing API

The below JSON format can be sent via an API once processing is complete by IDmission. In order to receive this, a URL must be provided and the POST_Data_API_Required field in the original API request must be set to a value of ‘Y’. These URLs need to be defined in the dashboard for the Sandbox and Production environments through My Account > Account Settings.

Example: JSON POST Update API


{
    "Form_Status": "Approved",
    "Form_Id": "18169223",
    "Product_Id": "1523",
    "Form_Key": "IDM_051120231020_32303",
    "Form_Data":
    {
        "EmailID": "someonecompany.com",
        "Customer_Name": "John Doe",
        "CompanyID": "12345",
        "UniqueRequestId": "URID051120231020",
        "Client_Customer_Number": "string",
        "Expiration_Date": "DD/MM/YYYY",
        "Gender": "M",
        "ID_Number": "991111111",
        "content": 12345,
        "Name": "John Doe",
        "PlaceOfBirth": "CALIFORNIA USA",
        "First_Name": "JOHN",
        "Valid_ID_Number": "Y",
        "MRZValid": "Y",
        "API_resultCount_PEP": "0",
        "API_resultCount_WLS": "0",
        "API_resultCount_NM": "0",
        "Client_Request_ID": "CRID888888",
        "Issue_Date": "DD/NN/YYYY",
        "MRZData": "MRZDATA STRING",
        "CURRENT_FORM_STATE_FOR_CALL": "Approved",
        "LivenessScore": "1.0",
        "Date_of_Birth": "DD/MM/YYYY",
        "Date_of_Birth_Formatted": "DD/MM/YYYY",
        "Expiration_Date_Formatted": "DD/MM/YYYY",
        "DocumentType": "PP",
        "FaceVerificationStatus": "Verified",
        "ID_Country": "USA",
        "Face_Detected": "Y",
        "ID_Type": "PP",
        "IssuingAuthority": "U S D  D F   D  S",
        "Issuing_Country": "USA",
        "ServiceID": "12",
        "ID_Number_Match_Result": "Matched",
        "AddressLine2": "Company Name",
        "AddressLine1": "123 Main Street",
        "Unique_Customer_Number": "string",
        "Last_Name": "DOE",
        "Customer_Gender": "M",
        "FullName": "JOHN DOE",
        "Country": "USA",
        "Form_State_Code": "00",
        "PhoneNumber": "1234567890",
        "District": "CA",
        "Customer_DateOfBirth": "DD/MM/YYYY"
    }
}

Post API Element Dictionary

Field Name
Field Type
Response Description
Form_Status Text Final result of the ID Validation and Face Matching Processes.For a full list of values, please refer to the Appendix section of the document.
Form_Id Text Form ID that was generated by IDmission and provided in the original API response.
Product_Id Text Product ID for the environment, echo back from the request.
Form_Key Text Form_Key from the original request.

Form_Data Node

Note: These are all of the values that are extracted from the ID images themselves or are result fields from the ID Validation process.

Important: If a value is not present for a particular field for a request, it will not be included in this JSON response.

Field Name
Field Type
Response Description
ID_Type Text In most cases, this is an echo back from the request, unless it was updated by the ID Verification Team because it was incorrect.
ID_Country Text In most cases, this is an echo back from the request, unless it was updated by the ID Verification Team because it was incorrect.
ID_State Text In most cases, this is an echo back from the request, unless it was added/updated by the ID Verification Team because it was not provided or incorrect.
Name Text Full Name extracted from either barcode, MRZ, or front of the ID when MRZ/barcode are not present.
First_Name Text First Name extracted from either barcode, MRZ, or front of the ID when MRZ/barcode are not present.
Middle_Name Text Middle Name extracted from either barcode, MRZ, or front of the ID when MRZ/barcode are not present.
Last_Name Text Last Name extracted from either barcode, MRZ, or front of the ID when MRZ/barcode are not present
Last_Name_2 Text If there is a secondary last name, it will display as extracted from either the barcode, MRZ, or front of the ID when MRZ/barcode are not present.
Address Text Full Address extracted from either barcode, MRZ, or front of the ID when MRZ/barcode are not present.
Address1 Text Address Line 1 (usually the Street Number and Street Name) extracted from either barcode, MRZ, or front of the ID when MRZ/barcode are not presen.
Address2 Text Address Line 2 (e.g. Suite Number, Unit) extracted from either barcode, MRZ, or front of the ID when MRZ/barcode are not present.
Country Text City parsed from a barcode or MRZ, only when a one is present. In most cases the address will be in AddressLine1 / 2.
ID_Number Text ID Number extracted from either barcode, MRZ, or front of the ID when MRZ/barcode are not present.
IDNumber1 Text Additional IDNumber 1, extracted from barcode/MRZ data, or if neither are present, from the front of the ID. This will only be present if this additional ID Number component is defined in the matching ID template.
IDNumber2 Text Additional IDNumber 2, extracted from barcode/MRZ data, or if neither are present, from the front of the ID. This will only be present if this additional ID Number 2 component is defined in the matching ID template.
IDNumber3 Text Additional IDNumber 3, extracted from barcode/MRZ data, or if neither are present, from the front of the ID. This will only be present if this additional ID Number 3 component is defined in the matching ID template.
Valid_ID_Number Text

Flag that indicates of the format of the ID number matches what is defined in the matching ID template.

- Flag = Y if the ID Number extracts correctly and matches the format.

- Flag = N if the ID Number does not match the format.

- Flag = NA If there is no specific format defined

- Flag = D if it cannot be clearly determined (D = Doubtful)

Date_of_Birth Text Date of Birth extracted from either barcode, MRZ, or front of the ID when MRZ/barcode are not present. This is the text that is extracted directly, not always a formatted date.
Date_of_Birth_Formatted Date

Date of Birth extracted from either barcode, MRZ, or front of the ID when MRZ/barcode are not present. If the date cannot be formatted based on extraction (e.g. Odd format, not present in the MRZ and not corrected by manual review) then this field would be blank.

Format: DD/MM/YYYY

Expiration_Date Text Expiration Date extracted from either barcode, MRZ, or front of the ID when MRZ/barcode are not present. This is the text that is extracted directly, not always a formatted date.
Expiration_Date_Formatted Date

Expiration Date extracted from either barcode, MRZ, or front of the ID when MRZ/barcode are not present. If the date cannot be formatted based on extraction (e.g. Odd format, not present in the MRZ and not corrected by manual review) then this field would be blank.

Format: DD/MM/YYYY

Issue_Date Text Issue Date extracted from either barcode, MRZ, or front of the ID when MRZ/barcode are not present. In most cases this is not present in a machine-readable portion of the ID, so we often see many variations of formats. This will be sent as a Text field.
IssuingCountry Text This is the 3-digit ISO country code in which the identity document was issued, either extracted from the barcode/MRZ or as defined in the template.
Face_Detected Text This flag indicates whether or not a clear/visible face is found on the identity document. If a ‘Photo’ component is captured for the specific ID template matched, and a face is clearly detected, this flag will = Y. If a face is expected and is NOT clearly detected, this flag will = N. If there is no ‘Photo’ component captured for the template, this flag will be blank.
MRZ_Data Text This is the raw data extracted from the MRZ. There is a parsing tool (in the back-office portal) where you can copy and paste the extracted MRZ string, compare it to the image, and correct any errors that may have resulted during OCR. This way you can determine the validity of the MRZ without having to ask the customer to resubmit their identity documents.
MRZValid Text This flag indicates the validity of the MRZ data, this will = Y if it is valid (passes all of the check digits), otherwise this will = N. When flag = N, there are usually MRZ Error Messages associated with. When there is not an MRZ detected (MRZ Detected = N), this flag will be blank. NA when there is a template matched, but no MRZ expected.
FaceVerificationStatus Text This is the result of the Face Match – ‘Verified’ or ‘Not Verified’ will be the values. A verified face must have a score that equates to a 62% or higher match.
Manual_Review_Executed Text If a request was submitted with the ‘Manual_Review_Required’ parameter = Y, and a manual review was actually executed, this field will = Y. If not, it will = N or Blank.
NameNonEng Text This field is extracted from the front or back of the ID
FirstNameNonEng Text This field is extracted from the front or back of the ID
LastNameNonEng Text This field is extracted from the front or back of the ID
MiddleNameNonEng Text This field is extracted from the front or back of the ID
LastName2 Text

This field is extracted from:

- The barcode or MRZ (if present)

- The front or back of the ID, if both the MRZ and barcode are not present.

AddressNonEng Text This field is extracted from the front or back of the ID
AddressLine1NonEng Text This field is extracted from the front or back of the ID
AddressLine2NonEng Text This field is extracted from the front or back of the ID
IDNumberNonEng Text This field is extracted from the front or back of the ID
IDNumber2NonEng Text This field is extracted from the front or back of the ID
DateofBirthNonEng Text This field is extracted from the front or back of the ID
ExpiryDateNonEng Text This field is extracted from the front or back of the ID
IssueDateNonEng Text This field is extracted from the front or back of the ID
Gender Text

This field is extracted from:

- The barcode or MRZ

- The front or back of the ID, if both the MRZ and barcode are not present.

Unique_Customer_Number Text This field is an echo back from what is submitted in the request. This is not extracted from the ID or generated by IDmission. It is for the client to use to define a unique number associated with their customer.
API_resultCount_NM Text This field returns a count of matches found using the customer or employee name against a Negative Media database.
API_resultCount_PEP Text This field returns a count of matches found using the customer or employee name against Politically Exposed Persons (PEPs) lists.
API_resultCount_WLS Text This field returns a count of matches found using the customer or employee name against Global watchlists.
Client_Customer_Number Text This field contains the unique client customer number associated with the customer record from the original enrollment. This is also used for ongoing verification.
Customer_AddressLine1 Text This field contains Address Line 1 for the customer that was submitted as part of the request.
Customer_AddressLine2 Text This field contains Address Line 2 for the customer that was submitted as part of the request.
Customer_City Text This field contains the city for the customer that was submitted as part of the request.
Customer_Country Text This field contains the country code or country name for the customer that was submitted as part of the request.
Customer_DateOfBirth Text This field contains the date of birth for the customer that was submitted as part of the request.
Customer_District Text This field contains the district for the customer that was submitted as part of the request.
Customer_Email Text This field contains the email address for the customer that was submitted as part of the request.
Customer_Enrolled_Date Date This field indicates the date the customer was enrolled. Format: YYYY-MM-DD
Customer_FP_Data Image BLOB This field returns the fingerprint data associated with the original enrollment of the Customer that a verification submission is verified against.
Customer_Gender Text This field contains the gender code that was submitted as part of the request.
Customer_Name Text This field contains the Customer Name that was submitted as part of the request or the name that was extracted from the ID document if present.
Customer_PhoneNumber Text This field contains the phone number for the customer that was submitted as part of the request.
Customer_Search_Status Text This field returns the status of the search results for the Customer based on the biometric data that was sent. The valid values are “SUCCESS” and “FAIL”.
Customer_Signature Image BLOB This is an image of the customer’s signature that can be optionally collected during any service where customer data is supported.
Customer_verification_Result Text This field returns the results of the Verify Customer request. The valid values are “Verified” and “Verification Failed”.
CustomerCode Text This field contains the Customer Code that is auto-generated by the IDmission system during the enrollment process.
CustomerStatus Text This field is used for Customer Enrollment processing. This field indicates if a customer has been found and returns the current status of that customer. The field can return “SUCCESS” or “FAILED”.
CustomerVerification_Status Text This field indicates the current status of the customer in the IDmission database. The field can return “Verified” or “Unverified”.
DeDuplication_Status Text The field indicates the overall status of Deduplication processing. This field can return “SUCCESS” or “FAIL”.
Employee_AddresLine1 Text This field contains Address Line 1 for the employee that was submitted as part of the request.
Employee_AddresLine2 Text This field contains Address Line 2 for the employee that was submitted as part of the request.
Employee_City Text This field contains the city associated with the address of the employee submitted as part of the request.
EMPLOYEE_CODE Text This field contains the employee code submitted as part of the request.
Employee_Country Text This field contains the country associated with the address for the employee submitted as part of the request.
Employee_Email Text This field contains the email associated with the employee submitted as part of the request.
Employee_Gender Text This field contains the gender code that was submitted as part of the request.
Employee_ID Text The field contains the employee ID that was provided during the employee enrollment process as part of the request.
Employee_ID_State Text This field contains the State associated with the ID of the employee submitted as part of the original request.
Employee_LoginID Text This field contains the employee Login ID that was submitted as part of the request.
Employee_Name Text This field contains the name of the employee submitted as part of the request.
Employee_Phone Text This field contains the phone number associated with the employee submitted as part of the request.
Employee_PostalCode Text This field contains the postal/zip code associated with the address for the employee submitted as part of the request.
Employee_Type Text This field contains the type of employee that was specified during the employee enrollment process, as part of the request.
Employee_verification_Result Text This field returns the results of the Verify Employee request. The valid values are “Verified” and “Verification Failed”.
EmployeeCreateStatus Text This field indicates whether or not the Employee enrollment was successful. The field can return “SUCCESS” or “FAILED”.
EmployeeCreateStatusMessage Text This field is the message that is returned based on the employee enrollment processing. For example, “Employee already exists” or “User does not have required privileges.”
EmployeeID Text This field is the employee ID provided during any employee enrollment services.
EmployeeSignature Image BLOB This field contains a signature image captured during the original employee enrollment.
EmployeeVerification_Status Text This field indicates the current status of the employee in the IDmission database. The field can return “Verified” or “Unverified”.
ENROLLED_FACE_IMAGE Image BLOB This field returns the photograph associated with the original enrollment of the Customer or Employee that a verification submission is verified against.
FullName Text This field is the full name of the customer, with the First,Middle, and Last names combined into one field.
HOST_URL Text This field is the URL that is provided to IDmission to return the POST API to.
ID_Number_Match_Result Text This field indicates if the ID Number that was extracted from the ID matches the ID Number that was read from the MRZ or Barcode when applicable.
Name_Match_Result Text This field returns the result of the name submitted in request matches the name extracted from the ID during processing.
ServiceID Text This is an echo back of the ServiceID sent in the request for the SDK, or utilized when using the Swagger API. The ServiceID is associated with the service being performed (e.g., ID Validation, Customer Enrollment, Verification, etc.)
CompanyCode Text This is an echo back of the CompanyCode submitted in the original request that the form is processed under.
CustomerIDExpiryDate Date This is the expiration date from an ID document that has been enrolled for a customer. This will be provided back based on input parameters in the Verification requests. Format: dd/mm/yyyy.
DocumentType Text This is ID Type that is determined based on the template it was matched against. This will be the same list of values are in the input ID Type.
PlaceOfBirth Text This is a text-based field that will contain the place of birth if specified on the ID. (Currently only available for Italy IDs)
PlaceofIssue Text This is a text-based field that will contain the place in which the ID was issued if specified on the ID. (Currently only available for Italy IDs)
IssuingAuthority Text This is a text-based field that will contain the issuing authority of the ID. This will only be present if this is a text-based field on the ID, it will not be extracted from a stamp. (Currently only available for Italy IDs)
OCR_Signature Image BLOB This field is the signature that is extracted from the ID
PostalCode Text This field contains postal code for the customer that was submitted as part of the request.
Image_ProcessedFront Image BLOB This image is the processed version of the front image from the server after ID validation processing is completed. It will be cropped and de-skewed and have security features highlighted.
Image_ProcessedBack Image BLOB This image is the processed version of the back image from the server after ID validation processing is completed. It will be cropped and de-skewed and have security features highlighted.
Image_Front Image BLOB This image is the front image provided by the client.
Image_Back Image BLOB This image is the back image provided by the client.
Customer_Photo Image BLOB This image is the live selfie image provided by the client.
Form_State_Code Single Select

This is the two-digit code associated with the Form_Status.

For a full list of values, please refer to the Form Status and State Codes Section of this document.

Verification_Approval_Code Text 4 digit verification code when biometric verification is done through the IDentity as a Service (IDaaS) Web Application.
uniqueRequestId STRING This is the unique key that is echoed back from the request.

Deduplication fields

Note: These fields will appear if Deduplication_Required = Y and Deduplication processing finds multiple matches. If multiple duplicates are found, the field will repeat with an appended “_1”, “_2”, etc. in the POST.

For example, if the user’s name is found to have multiple matches, then the DeDuplicationData_Name will repeat as follows:

DeDuplicationData_Name

DeDuplicationData_Name_1

Field Name
Field Type
Response Description
DeDuplicationData_Client_Customer_Number Text This field returns the unique customer number associated with a duplicate found during biometric deduplication processing.
DeDuplicationData_Customer_ID Text This field returns the IDmission-generated customer code associated with a duplicate found during biometric deduplication processing.
DeDuplicationData_Name Text This field returns the customer or employee name associated with a duplicate found during biometric deduplication processing.
DeDuplicationData_Person_Type Text This field returns the categorization of the user type associated with any duplicates found during biometric deduplication processing. Valid values are: “Customer”, “Employee”.
DeDuplicationResult Text This field returns the response if the Deduplication_Required flag is set in the original request. The response will either be “Duplicates Found” or “No Duplicates Found”.
Duplicate_Employee_Type Text This field indicates the type of employee the system matched against while completing biometric deduplication processing.
Duplicate_Fingerprint_Data Image BLOB This field returns the fingerprint data that is associated with a duplicate found during biometric deduplication processing.
Duplicate_Found Text This is a Yes/No field that indicates whether or not a duplicate customer or employee has been found when completing biometric deduplication processing.
Duplicate_Photograph Image BLOB This field returns the photograph that is associated with a duplicate found during biometric deduplication processing.

Here is an example of Post Data API for Service ID 50, where three matches are found:

{
"Form_Status":"Duplicate Customer",
"Form_Id":"760716",
"Product_Id":"4130",
"Form_Key":"Test7363433222343232323243236323343453334343342e3343443434",
"Form_Data":
    {
    "Address":"123 Test Street, Anywhere, CA 90001",
    "DeDuplicationData_Client_Customer_Number":"AN22G001230",
    "DeDuplicationData_Client_Customer_Number_1":"AN22G00123012",
    "DeDuplicationData_Client_Customer_Number_2":"AN22G00123012233",
    "Client_Customer_Number":"AN22G001230122334455",
    "Expiration_Date":"25/06/2023",
    "DeDuplicationData_Name":"JOHN DOE",
    "DeDuplicationData_Name_1":"JOHN DOE",
    "DeDuplicationData_Name_2":"JOHN DOE",
    "Gender":"M",
    "ID_State":"CA",
    "ID_Number":"1234567",
    "content":"35309",
    "First_Name":"JOHN",
    "Valid_ID_Number":"Y",
    "MRZValid":"NA",
    "DeDuplicationResult":"Duplicates Found",
    "Issue_Date":"25/06/2017",
    "DeDuplicationData_Customer_ID":"52381",
    "DeDuplicationData_Customer_ID_1":"53188",
    "DeDuplicationData_Customer_ID_2":"53189",
    "Duplicate_Found":"Y",
    "PostalCode_Extracted":"9650000",
    "CURRENT_FORM_STATE_FOR_CALL":"Duplicate Customer",
    "IDNumber2":"04132013631RBBBFD12",
    "Date_of_Birth":"12/04/1950",
    "Date_of_Birth_Formatted":"12/04/1950",
    "Expiration_Date_Formatted":"25/06/2023",
    "Address2":"ANYWHERE CA 90001",
    "FaceVerificationStatus":"Verified",
    "Address1":"123 Test Street",
    "ID_Country":"USA",
    "Face_Detected":"Y",
    "ID_Type":"PP",
    "Issuing_Country":"USA",
    "DeDuplicationData_Person_Type":"CUSTOMER"
    "DeDuplicationData_Person_Type_1":"CUSTOMER",
    "DeDuplicationData_Person_Type_2":"CUSTOMER",
    "ID_Number_Match_Result":"Matched",
    "Unique_Customer_Number":"AN22G001230122334455",
    "Last_Name":"DOE",
    "FullName":"JOHN DOE",
    "Country":"USA",
    "Form_State_Code":"00",
    "DeDuplication_Status":"SUCCESS",
    }
}

Post API Expected Acknowledgement Response

The system who is accepting this POST API from the IDmission server should respond with a simple ‘200’ HTTPS successful acknowledgement response.

Example

HTTPS status code = 200

response json formatted as
{
  "status_code" : 0,
  "status_message" : "Success"
}

WebSDK

IDentity SDK 2.0

WebSDK

Android SDK

Android Expo Wrapper

Android Flutter Wrapper

Android Ionic Capacitor Wrapper

Android React Wrapper

iOS SDK

iOS Cordova Wrapper

iOS Expo Wrapper

iOS Flutter Wrapper

iOS Ionic Capacitor Wrapper

iOS React Wrapper

SDK 1.0 to 2.0 Migration

iOS SDK 1.0 to 2.0 Migration

Android SDK 1.0 to 2.0 Migration

Legacy SDK 1.0

WebSDK

Android SDK

Android React Wrapper

iOS SDK

Legacy SDK Cordova Wrapper

IDMission SDK Cordova Plugin

This plugin is a comprehensive toolkit that offers identity services (e.g. ID validation, live face detection, etc.) for positive identification.

Installation

If you download the plugin

ionic cordova plugin add PATH\IDMissionSDK_Cordova_Plugin

Loading it from the GitHub repository

ionic cordova plugin add https://github.com/idmission/pluginCordova.git

Configurations for Android

Platform

Prepare Android

File build.gradle

android 
{
    compileSdkVersion 27
    buildToolsVersion "27.0.3"
    defaultConfig 
    {
        applicationId "com.idmission.sdk.Client"
        minSdkVersion 23
        targetSdkVersion 26
        versionCode 20190816
        versionName "6.3.3.3"
        multiDexEnabled true
        ndk 
        {
        // Don't package arm64-v8a or x86_64, 'x86'
        abiFilters 'armeabi-v7a'
        }
    }
    dexOptions 
    {
    javaMaxHeapSize "4g"
    }
    aaptOptions 
    {
    noCompress "tflite"
    }
}
classpath 'com.google.gms:google-services:4.2.0'
implementation files ('libs/idm-imgproc-7.2.4.26.aar') 
implementation files ('libs/OpenCV_4.1.1.aar') 
implementation 'androidx.appcompat:appcompat:1.1.0' 
implementation 'io.fotoapparat:fotoapparat:2.6.1' 
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly' 
implementation 'com.google.android.gms:play-services-location:16.0.0' 
implementation 'com.google.firebase:firebase-ml-vision:24.0.1' 
implementation 'com.google.firebase:firebase-ml-vision-face-model:19.0.0' 
implementation 'com.google.firebase:firebase-core:17.2.2'
apply plugin:'com.google.gms.google-services'

File google-services.json

Make sure the package_name is the same as your project ID

Configurations for IOS

Platform

Prepare IOS

Install Pod

In platforms/ios install pod:

pod install

Settings in Xcode

@interface MainViewController : CDVViewController<AppItSDKResponse> 
@property (nonatomic, copy, readwrite) NSString *scanCallbackId; 
- (void)sendSuccessTo:(NSString *)callbackId withObject:(id)objwithObject; 
- (void)sendFailureTo:(NSString *)callbackId withObject:(id)objwithObject;

//IDmission SDK Methods - Start 
-(void) sendSuccessTo: (NSString * ) callbackId withObject: (id) obj {
        CDVPluginResult * result = nil;
        if ([obj isKindOfClass: [NSString class]]) {
            result = [CDVPluginResult resultWithStatus: CDVCommandStatus_OK messageAsString: obj];
        } else if ([obj isKindOfClass: [NSDictionary class]]) {
            NSError * error;
            NSData * jsonData = [NSJSONSerialization dataWithJSONObject: obj options: NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string error:&error]; if (! jsonData) 
                {
                    NSLog(@ "Got an error: %@", error);
                } else {
                    NSString * jsonString = [
                        [NSString alloc] initWithData: jsonData encoding: NSUTF8StringEncoding
                    ];
                    result = [CDVPlu CDVPluginResult resultWithStatus: CDVCommandStatus_OK messageAsString: jsonString];
                }
            }
            else if ([obj isKindOfClass: [NSNumber class]]) {
                // all the numbers we return are bools result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsInt:[obj intValue]]; 
            } else if (!obj) {
                result = [CDVPluginResult resultWithStatus: CDVCommandStatus_OK];
            } else {
                NSLog(@ "Success callback wrapper not yet implemented for class %@", [obj class]);
            }
            [self.commandDelegate sendPluginResult: result callbackId: callbackId];
        }

        -
        (void) sendFailureTo: (NSString * ) callbackId withObject: (id) obj {
                CDVPluginResult * result = nil;
                if ([obj isKindOfClass: [NSString class]]) {
                    result = [CDVPluginResult resultWithStatus: CDVCommandStatus_ERROR messageAsString: obj];
                } else if ([obj isKindOfClass: [NSDictionary class]]) {
                    NSError * error;
                    NSData * jsonData = [NSJSONSerialization dataWithJSONObject: obj options: NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string error:&error]; 
                        if (!jsonData) {
                            NSLog(@ "Got an error: %@", error);
                        } else {
                            NSString * jsonString = [
                                [NSString alloc] initWithData: jsonData encoding: NSUTF8StringEncoding
                            ];
                            result = [CDVPluginResult resultWithStatus: CDVCommandStatus_OK messageAsString: jsonString];
                        }
                    }
                    else if ([obj isKindOfClass: [NSNumber class]]) {
                        // all the numbers we return are bools result = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsInt:[obj intValue]]; 
                    } else if (!obj) {
                        result = [CDVPluginResult resultWithStatus: CDVCommandStatus_ERROR];
                    } else {
                        NSLog(@ "Success callback wrapper not yet implemented for class %@", [obj class]);
                    }
                    [self.commandDelegate sendPluginResult: result callbackId: callbackId];
                }

                -
                (void) bankStatementDetectionResponse: (NSMutableDictionary * ) result {} -
                    (void) birthCertificateDetectionResponse: (NSMutableDictionary * ) result {} -
                    (void) captureImageResponse: (NSMutableDictionary * ) result {
                        NSLog(@ "captureImageResponse");
                        [self sendSuccessTo: self.scanCallbackId withObject: result];
                    } -
                    (void) captureSignatureResponse: (NSMutableDictionary * ) result {} -
                    (void) cardDetectionResponse: (NSMutableDictionary * ) result {} -
                    (void) completeOperationResponse: (NSMutableDictionary * ) result {} -
                    (void) createEmployeeResponse: (NSMutableDictionary * ) result {} -
                    (void) executeGenericResponse: (NSMutableDictionary * ) result {} -
                    (void) faceDetectionResponse: (NSMutableDictionary * ) result {
                        NSLog(@ "faceDetectionResponse");
                        [self sendSuccessTo: self.scanCallbackId withObject: result];
                    } -
                    (void) faceMatchingResponse: (NSMutableDictionary * ) result {} -
                    (void) fingerprintEnrolmentResponse: (NSMutableDictionary * ) result {} -
                    (void) fingerprintVerificationResponse: (NSMutableDictionary * ) result {} -
                    (void) fourFingerprintDetectionResponse: (NSMutableDictionary * ) result {} -
                    (void) generateOTPResponse: (NSMutableDictionary * ) result {} -
                    (void) generateTokenResponse: (NSMutableDictionary * ) result {} -
                    (void) genericDocumentResponse: (NSMutableDictionary * ) result {} -
                    (void) gpsCoordinateResponse: (NSMutableDictionary * ) result {} -
                    (void) idValidationAndVideoMatchingResponse: (NSMutableDictionary * ) result {} -
                    (void) cardDetectionResponse: (NSMutableDictionary * ) result {} -
                    (void) completeOperationResponse: (NSMutableDictionary * ) result {} -
                    (void) createEmployeeResponse: (NSMutableDictionary * ) result {} -
                    (void) executeGenericResponse: (NSMutableDictionary * ) result {} -
                    (void) faceDetectionResponse: (NSMutableDictionary * ) result {
                        NSLog(@ "faceDetectionResponse");
                        [self sendSuccessTo: self.scanCallbackId withObject: result];
                    } -
                    (void) faceMatchingResponse: (NSMutableDictionary * ) result {} -
                    (void) fingerprintEnrolmentResponse: (NSMutableDictionary * ) result {} -
                    (void) fingerprintVerificationResponse: (NSMutableDictionary * ) result {} -
                    (void) fourFingerprintDetectionResponse: (NSMutableDictionary * ) result {} -
                    (void) generateOTPResponse: (NSMutableDictionary * ) result {} -
                    (void) generateTokenResponse: (NSMutableDictionary * ) result {} -
                    (void) genericDocumentResponse: (NSMutableDictionary * ) result {} -
                    (void) gpsCoordinateResponse: (NSMutableDictionary * ) result {} -
                    (void) idValidationAndVideoMatchingResponse: (NSMutableDictionary * ) result {} -
                    (void) videoRecordingResponse: (NSMutableDictionary * ) result {
                        NSLog(@ "videoRecordingResponse"); //[0] (null) @"statusMessage" : @"Success" //[1] (null) @"statusCode" : @"0" //[2] (null) @"StatusCode" : @"0" 
                        NSMutableDictionary * filteredResp = [NSMutableDictionary dictionary];
                        [filteredResp setValue: [result objectForKey: @ "statusMessage"] forKey: @ "statusMessage"];
                        [filteredResp setValue: [result objectForKey: @ "statusCode"] forKey: @ "statusCode"];
                        [filteredResp setValue: [result objectForKey: @ "StatusCode"] forKey: @ "StatusCode"];
                        [self sendSuccessTo: self.scanCallbackId withObject: filteredResp];
                    } -
                    (void) voiceRecordingResponse: (NSMutableDictionary * ) result {} //IDmission SDK Methods - End

Properties

Usage

To use the plugin, you need to create an integration user at Evolv IDMission and request the login credentials.

idm_sdk_init

It is necessary to execute this function first before the others.

var exampleData = {
    url: 'https://kyc.idmission.com/IDS/service/integ/idm/thirdparty/upsert',
    loginId: 'ev_integ_54192',
    password: 'IDmi#192$',
    merchantID: '33635',
    productID: '920',
    productName: 'Identity_Validation_and_Face_Matching',
    Language: 'en',
    EnableDebug: 'true',
    enableGPS: 'true'
};
( < any > window).cordova.plugins.IDMissionSDK_Cordova_Plugin.idm_sdk_init(JSON.stringify(exampleData), this.successCallback, this.errorCallback);

JSON success response

{
    "StatusCode": "0",
    "StatusMessage": "Success",
    "statusCode": "0",
    "statusMessage": "Success"
}

JSON error response

{
    "StatusCode": "-1",
    "StatusMessage": , // Error type message "statusCode": "-1", "statusMessage": // Error type message 
}

idm_sdk_IdFront

This function will open the camera that will automatically take the photo of the credential.

(<any>window).cordova.plugins.IDMissionSDK_Cordova_Plugin.idm_sdk_IdFront(null,this.successCallback, this.errorCallback);

JSON success response

{ "FRONT": "", // Base64 Image }

JSON error response

{ "StatusCode": "-1", "StatusMessage": , // Error type message "statusCode": "-1", "statusMessage": // Error type message }

idm_sdk_IdBack

This function will open the camera that will automatically take the photo of the back of the credential.

(<any>window).cordova.plugins.IDMissionSDK_Cordova_Plugin.idm_sdk_IdBack(null,this.successCallback, this.errorCallback);

JSON success response

{ "BACK": "", // Base64 Image }

JSON error response

{ "StatusCode": "-1", "StatusMessage": , // Error type message "statusCode": "-1", "statusMessage": // Error type message }

idm_sdk_detectFace

This function will open the camera that will automatically take a selfie of the user.

(<any>window).cordova.plugins.IDMissionSDK_Cordova_Plugin.idm_sdk_detectFace(null,this.successCallback, this.errorCallback);

JSON success response

{ "FACE": "", // Base64 Image }

JSON error response


{ "StatusCode": "-1", "StatusMessage": , // Error type message "statusCode": "-1", "statusMessage": // Error type message }

idm_sdk_recordVideo

This function will open the camera with which you can record.

var options = {
    recordingTime: 30,
    textDatatoScrolled: 'Hello world! Please let me know how this is recorded to the end of the video.'
};
( < any > window).cordova.plugins.IDMissionSDK_Cordova_Plugin.idm_sdk_recordVideo(JSON.stringify(options), this.successCallback, this.errorCallback);

JSON success response

{ "StatusCode": "0", "StatusMessage": "Success", "statusCode": "0", "statusMessage": "Success" }

JSON error response

{ "StatusCode": "-1", "StatusMessage": , // Error type message "statusCode": "-1", "statusMessage": // Error type message }

idm_sdk_getPermissions

Only for Android, you can obtain the permissions of the following native properties:

var permission = { permissionName : "CAMERA", // Type Permission }; (<any>window).cordova.plugins.IDMissionSDK_Cordova_Plugin.idm_sdk_getPermissions(JSON.stringify(permission),this.successCallback, this.errorCallback);

JSON success response

{ "StatusCode": "0", "StatusMessage": "Success", "statusCode": "0", "statusMessage": "Success" }

JSON error response

{ "StatusCode": "-1", "StatusMessage": , // Error type message "statusCode": "-1", "statusMessage": // Error type message }

idm_sdk_CaptureSignature

This function will open a blank screen where you can capture the signature.

(<any>window).cordova.plugins.IDMissionSDK_Cordova_Plugin.idm_sdk_CaptureSignature(null,this.successCallback, this.errorCallback);

JSON success response

{ "result": "", // Base64 Image }

JSON error response

{ "StatusCode": "-1", "StatusMessage": , // Error type message "statusCode": "-1", "statusMessage": // Error type message }

idm_sdk_processImageAndMatchFace

This function will send the form with the data collected from the previous functions to process the identity of the user to be registered.

var options = {
    countryCode: 'USA',
    stateCode: '',
    idType: 'PP',
    faceImageType: '',
    additionalDictionary: {
        Service_ID: 10
    },
    finalSubmit: 'true',
    clearFormKey: 'true'
};
( < any > window).cordova.plugins.IDMissionSDK_Cordova_Plugin.idm_sdk_processImageAndMatchFace(JSON.stringify(options), this.successCallback, this.errorCallback);

JSON success response

{
    "Status_Code": "000",
    "Status_Message": "Form Submitted Successfully",
    "Request_Id": "000000000",
    "FormKey": "IDMTPIA_0000000000000_00:C0:F0:F0:C0:00",
    "FormID": "00000000",
    "ProductId": "920",
    "State": "Template Not Found",
    "Face_Detected": "Y",
    "EnoughFeatureFoundOnID_FRONT": "Y",
    "NoTemplatesAvailable": "N",
    "EnoughFeatureFound": "Y",
    "MatchingTemplateFound": "D",
    "MRZValid": "NA",
    "PixelCount": "272688",
    "InputImagePixelCount": "272688",
    "LowResolution": "N",
    "ColorCode": "C",
    "IDBackImageExpected": "N",
    "PhotoEditingSoftwareDetected": "N",
    "ImageDateDiscrepancy": "N",
    "BarCodeExpected": "N",
    "IDImageMismatch": "N",
    "MRExist": "N",
    "Form_State_Code": "15",
    "FaceVerificationStatus": "Verified",
    "IsPassport": "N",
    "TotalDedupMatches": "0",
    "NegativeDBMatchFound": "N",
    "StatusCode": "0",
    "StatusMessage": "Success",
    "statusMessage": "Success",
    "statusCode": "0"
}

JSON response

If daily limit forms are exceeded

{
    "Status_Code": "3057",
    "Status_Message": "You have exceeded the limit of \"10\" forms in \"24\" hours",
    "ErrorData": "{}",
    "Request_Id": "000000000",
    "ProductId": "920",
    "StatusCode": "0",
    "StatusMessage": "Success",
    "statusMessage": "Success",
    "statusCode": "0"
}

JSON error response

{ "StatusCode": "-1", "StatusMessage": , // Error type message "statusCode": "-1", "statusMessage": // Error type message }

Note

The above documentation can be found in the following path

https://drive.google.com/file/d/1nHfvM60iirtKKhY3x7Es8fcAc4oj1iMN/view?usp=sharing

After extracting the zip that was downloaded, the documentation file is located at IDMissionSDK_Cordova_Plugin.zip-> IDMissionSDK_Cordova_Plugin-> README.md

In order to see it locally, I use an extension in my Visual Studio Code called "Markdown Preview Enhanced" by Yiyi Wang

iFrame Integration

Following explains the steps to invoke Apps from within the Web Application or current web site.

Sample example is available at

https://demo.idmission.com/thirdyPartySimulator/

The URLs that you will need to use for testing within the simulator specific fields will be ‘https://uat.idmission.com/…….’

ThirdParty-Integration

Initiate token creation :

Request :

        URL : https://uat.idmission.com/apps/generateToken
        PARAMS :
        loginId   : "****",
        password  : "****",
        requestId : "123123"

Response : /* Content-Type:"application/json;charset=UTF-8" */

    {
        "statusCode": "000",
        "statusMessage": "Token has been created successfully.",
        "data": {
            "tokenId": "23E2500084F870867F90DA76774BA651F87852C844B4CEC355AE699ABB0B6519.C2HVD2NHC2UTZHATBMFNAW9ZWZEYNY4WLJAUMV0",
            "requestId": "123123"
        },
        "dataList": []
    }

Initiate form execution

Request :

        URL : https://uat.idmission.com/apps/invokeApps
        PARAMS : 
        tokenId   :"B8DA48CF83B58968F14C8DD8405B5141BDA25A608A5B5957D5FD1D54B41A1392.C2HVD2NHC2UTZHATBMFNAW9ZWZEYNY4WLJAUMV0",
        productId :"***",
        requestId :"5694828",
        returnurl :"https://uat.idmission.com/thirdyPartySimulator/returnUrl.jsp",
        language  :"en_US",
        formId    :"123123",
        formData : null

Response on Form Completion sent to returnurl:
Response is JSON with following params.

        responseMessage : Token already used.,
        requesStatus    : FAILED,
        formId          : null,
        formStatus      :  null
        formData    :  null

Form Data Example 1

<FormData>
        <Field>
        <Name>COUNTRY</Name>
        <FieldValue>
        <Value>USA</Value>
        </FieldValue>
        </Field>
</FormData>

Form Data Example 2

<FormData>
  <Field>
    <Name>Name</Name>
    <FieldValue>
      <Value>PHILIPPE ROY</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>IDNumber</Name>
    <FieldValue>
      <Value>AA12345</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>DateOfBirth</Name>
    <FieldValue>
      <Value>03/11/2000</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>IDCountry</Name>
    <FieldValue>
      <Value>TH</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>IDType</Name>
    <FieldValue>
      <Value>PP</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>CustomerIdValue</Name>
    <FieldValue>
      <Value>9012345</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>ExpiryDate</Name>
    <FieldValue>
      <Value>02/03/2022</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>AgentCountry</Name>
    <FieldValue>
      <Value>TH</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>SendImagesToHost</Name>
    <FieldValue>
      <Value>N</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>FirstName</Name>
    <FieldValue>
      <Value>PHILIPPE</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>LastName</Name>
    <FieldValue>
      <Value>ROY</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>MiddleName</Name>
    <FieldValue>
      <Value></Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>CustomerEmail</Name>
    <FieldValue>
      <Value>test@abcd.com</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>CustomerPhone</Name>
    <FieldValue>
      <Value>mob-11-931510902</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>Platform</Name>
    <FieldValue>
        <Value>AMERIGO</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>ExactNameMatch</Name>
    <FieldValue>
        <Value>Y</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>ExactIdNumberMatch</Name>
    <FieldValue>
        <Value>Y</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>ExactDateMatch</Name>
    <FieldValue>
        <Value>Y</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>IssueDate_Match</Name>
    <FieldValue>
        <Value>Y</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>Issue_Date</Name>
    <FieldValue>
        <Value>02/03/2018</Value>
    </FieldValue>
  </Field>
  <Field>
    <Name>IDTypeMismatchCheck</Name>
    <FieldValue>
        <Value>Y</Value>
    </FieldValue>
  </Field>
</FormData>

Appendix

The following section includes supplementary information about IDmission IDentity APIs.

APPENDIX A - Submitting ID Images & Photos

BLOB fields can be of different types such as images or attachments. To handle them appropriately, you may submit different attributes to the server.

Example: ID Image Front (JSON)

<ID_Image__Front>
{
    "fieldId": "",
    "fileContent": "BASE_64_DATA_OF_IMAGE",
    "fileUploadType": "Y",
    "isImageControlData": "Y",
    "name": "#UniqueID#.jpeg",
    "type": "data:image/jpeg;base64",
    "uniqueId": #UniqueID#
}
</ID_Image__Front>

"fileContent": "BASE_64_DATA_OF_IMAGE": It contains Base_64 data of image.

APPENDIX B – Status Codes

Different status codes are provided based on the server’s evaluation of the request. The following table represents all of the values for the Form Create / Form Search APIs

Status Code Table

Status_Code Status Code Description
000 Success
3057 Form count exceeded in specific timeframe
5030 Form canceled by user
5031 Form Submitted
5036 Could not access offline storage, please try again
5032 Form stored as Draft
500 Form not found
4065 Product not found
5033 Form not found locally
5034 The state of your form has been changed. The form is no longer available for further modification for this login.
5035 Product Id Mandatory
604 Invalid login
6003 Token Expired
6004 Token already used
8051 Missing or Invalid value for

APPENDIX C – Form Status and State Codes

The following table contains a list of values that will be returned in the tag ‘State’ in the response. This indicates the overall result of the ID Validation and/or any additional processing based on the Service ID. The table also includes a recommendation for action for the requesting application.

Note: If Manual Review is supported for your configuration, these initially would go into a result state with the word ‘Review…’ in front of the result. Once the form is actioned by the manual review team, it would be updated to reflect the states below. These Form Status and State Code values for Manual Review are in APPENDIX D.

Form State Returns and State Codes Table

State Code
Form Status
Description Recommended Actions
00 Approved
  • All checks in our system have passed
  • Data was extracted with the level of accuracy within our defined thresholds based on image quality.
  • No action required
  • ID is approved
50 Barcode Unreadable A barcode is expected to be present, but the barcode data is not detected by IDmission. The application using this API should prompt the user to recapture the images where the barcode is present in better lighting without glare so the ID can be processed properly.
32 Biometric Match Fail If the user’s biometric data (face, voice, and/or fingerprint) captured does not match the biometric data in the database from a previously enrolled user. The application using this SDK/API should prompt the user to recapture their biometric information, ensuring that face, fingerprint, and voice can be captured with clarity and accuracy.
46 Customer Found If the customer biometric data (face, voice, and/or fingerprint) has matched the biometric data in the database of a previous enrollment.
  • No action required
  • Customer verification is approved.
44 Customer Not Found If the customer biometric data (face, voice, and/or fingerprint) does not match the biometric data in the database from a previously enrolled user. The application using this SDK/API should prompt the user to recapture their biometric information. The capture should be completed in a well-lit room with the customer biometric fully visible.
34 Customer Onboarded
  • All validation and security checks in our system have passed.
  • The customer was successfully enrolled in the database.
  • No action required.
  • Customer enrollment is approved.
37 Customer Onboarding Failed
  • The customer ID documents and/or biometric have failed one or more validation checks in our system.
  • The customer was not enrolled into the database.
  • The application using this SDK/API should prompt the user to reattempt enrollment.
  • When reattempting to enroll, the recapture should be completed in a well-lit room with the ID documents and biometric fully visible.
  • The customer failed to enroll.
39 Customer Updated If the capture of customer data has updated a previously enrolled customer record.
  • No action required
  • Customer data is successfully updated.
35 Duplicate Customer The biometric data provided by the customer for a new enrollment has matched to a previously enrolled user.
  • The application using the SDK should request the user to use the original unique customer identifier that was used during enrollment.
  • If not, the application using the SDK should delete the previous record and prompt the user to reattempt enrollment.
36 Duplicate Employee The biometric data provided by the employee for a new enrollment has matched to biometric data from a previous enrollment.
  • The application using the SDK should request the user to use the original unique employee identifier that was used during enrollment.
  • If not, the application using the SDK should delete the previous record and prompt the user to reattempt enrollment.
47 Employee Found If the customer biometric data (face, voice, and/or fingerprint) has matched the biometric data in the database of a previous enrollment.
  • No action required.
  • Customer verification is approved
45 Employee Not Found If the customer biometric data (face, voice, and/or fingerprint) does not match the biometric data in the database from a previously enrolled user. The application using this SDK/API should prompt the user to recapture their biometric information. The capture should be completed in a well-lit room with the customer biometric fully visible.
33 Employee Onboarded
  • All validation and security checks in our system have passed.
  • The employee was successfully enrolled in the database.
  • No action required.
  • Employee enrollment is approved.
38 Employee Onboarding Failed
  • The employee ID documents and/or biometric data have failed one or more validation checks in our system.
  • The employee was not enrolled into the database.
  • The application using this SDK/API should prompt the user to reattempt enrollment.
  • When reattempting to enroll, the recapture should be completed in a well-lit room with the ID documents and biometric fully visible.
  • The employee failed to enroll.
41 Employee Updated If the capture of employee data has updated a previously enrolled customer record.
  • No action required
  • Employee data is successfully updated.
40 Expired ID The expiration date on the ID is equal to or less than the current date. The application using this API should prompt the user to provide an ID with a valid expiration date.
31 Face Not Detected
  • A face is not detected on an image.
  • Typically, this occurs when the face is not present on the ID.
  • In some cases, is due to poor image quality or image glare.
The application using this API should prompt the user to provide a clear image of an ID that includes a photo.
30 Facial Biometric Match Failed If a customer photo is captured and does not biometrically match the photo in the ID document, the ability to review the images is in the back office. The application using this API should prompt the user to capture a new selfie image.
10 ID Back Image not found
  • The back of an ID is expected to be present.
  • The back image was not sent or
  • A blank image was provided.
The application using this API should prompt the user to provide a clear image of the back of the ID.
52 ID Face Not Found
  • When conducting facial biometric verification, no face is found on submitted ID to match with selfie.
  • Accordingly, facial biometric verification cannot be validated with the submitted ID
The application using this SDK/API should prompt the user to provide a clear ID with a clear face image to ensure that facial biometric verification can be completed.
60 ID Front and Back Mismatch If the data extracted from the back of the ID image does not belong to the data presented on the front of the ID image.

The application using the API should prompt the user to provide new front and back images because inconsistences were found.

Note: If this occurs more than once, the application could decide to push this to a manual review queue because it could be an issue with OCR extraction accuracy.

11 ID Front Image Not Found The front of an ID is not uploaded, or a blank image was provided. The application using this API should prompt the user to provide a clear image of the front of the ID.
61 ID Not Accepted The uploaded ID contains an invalid configuration for the selected country.

The application using this API should prompt the user to provide an ID that is in the list of accepted ID Types.

Note: The application should prompt the user to select an ID type from a dropdown list, which reduces the likeliness of this result.

62 ID Type Mismatch If the ID Type submitted doesn’t match the ID Type extracted from the ID Image. The application using this API should prompt the user to select the ID Type that matches the Type of ID that was uploaded/captured.
51 IDNumber Match Failed The ID Number that was extracted by OCR from the ID does not match the ID Number that was extracted from the MRZ or Barcode. The application using this SDK/API should prompt the user to retry ID Validation.
63 Invalid ID Number The ID Number on the ID does not match the pattern defined in the ID Template. The application using this API should prompt the user to provide a valid ID.
12 Key Component Not Visible If one of the key components on the ID such as the date of birth or expiration date is missing. The application using this SDK should prompt the user that: The ID they have provided is not valid or the image provided may be blurred or unreadable in some portions or to recapture or capture an image of a different ID.
13 Low Resolution
  • The front or back image that is uploaded has been detected as low resolution or
  • The ID image is not a color/grayscale image based on resolution thresholds defined by IDmission.
The application using this API should prompt the user to recapture the images in better lighting without glare so the ID can be processed properly.
48 Live Face Detected If our system detects a live face from the selfie.
  • No action required.
  • Live face detection was approved.
49 Live Face Not Detected If our system does not detect a live face from the selfie image (e.g., if the selfie image is a photo of a photo, if the selfie image is a screen capture of a face, etc.) The application using the SDK should prompt the user to retake the selfie ensuring that a live face is captured in good lighting.
64 MRZ and ID Data Mismatch If the data extracted from the MRZ does not match the data extracted from the ID image itself.

The application using the API should prompt the user to provide new image(s) because inconsistences were found.

Note: If this occurs more than once, the application could decide to push this to a manual review queue because it could be an issue with OCR extraction accuracy.

65 MRZ Invalid The MRZ Validation flag (Machine Readable Zone) results in determining that the MRZ Data was not correct according to the standards. The application using this API should prompt the user that the ID they have provided is not valid and to capture image of a different ID.
66 Name Match Failed If the name submitted for the Customer or the Employee doesn’t meet the matching thresholds against the name extracted from the ID Document. The application using this API should prompt the user to provide a valid ID as this was deemed invalid.
14 No Image Found The ID front and back images are black or white and missing an ID Image. The application using this API should prompt the user to recapture the images in better lighting without glare so the ID can be processed properly.
N/A Pending Review Initial state of the form. System checks are still pending. No action required. Final results are sent via the POST API
53 Real ID Detected If our system detects a real ID from the ID image.
  • No action required.
  • Real ID Detection was approved.
54 Real ID Not Detected If our system does not detect a real ID from the ID image (e.g., if the ID image is a photocopy, if the ID image is a screen capture of an ID, etc.) The application using the SDK should prompt the user to retake the ID image ensuring that a real ID is captured in good lighting.
67 Sample ID If an ID has been confirmed as a sample after manual review. The application using this API should prompt the user that: The ID they have provided is not valid and to capture a different ID image.
68 Security Feature Invalid One or more security features defined for the ID template are a mismatch with the provided image. The application using this API should prompt the user to recapture the ID or a different one.
01 Submitted If it is an asynchronous call via the API, the ID is awaiting process completion to be categorized into a form state.
  • No action required.
OR
  • If the call is asynchronous, the application using this SDK/API should get-process-data.
69 Suspected Sample An ID has been detected as a sample (logic has been configured to recognize sample ID numbers, names, watermarks and other suspected sample data.) The application using this API should prompt the user that the ID they have provided is not valid and to capture image of a different ID.
70 Suspected Tampering
  • Photo editing software (e.g. Microsoft Paint, Adobe Photoshop) was detected.
  • Dates have been falsely created or modified in the ID document image.
The application using this API should prompt the user that the ID they have provided is not valid and to capture image of a different ID.
73 Suspicious ID
  • If an ID is found to be suspicious based on IDmission’s AI logic.
The application using this API should prompt the user that the ID they have provided is not valid and to capture an image of a different ID.
71 Tampered ID An ID has been confirmed to be tampered with after manual review. The application using this API should prompt the user that the ID they have provided is not valid and to capture image of a different ID.
15 Template Not Found

The correct template cannot be matched against those configured for the client.

Note: The system will not find a template to associate with the image for correct data extraction and validation.

The application using the API should prompt the user to capture a different ID.
80 Third Party Verification Failed If an ID has not been successfully verified by a third party.
  • The application using this SDK/API should prompt the user that the ID they have provided is not valid and to capture an image of a different ID.
  • If the user thinks it is an error, they can retry.
72 Under the age of 18

The date of birth (extracted from the barcode / MRZ) calculates the individual as under the age of 18.

The date of birth indicates that the user is under the age of 18

Note: The API can determine if this was already indicated in the application. If it was not indicated, the API should prompt for correct ID.

118 Under the Age of 21 The date of birth (extracted from the barcode / MRZ) calculates the individual as under the age of 21.

The date of birth indicates that the user is under the age of 21.

Note: The API can determine if this was already indicated in the application. If it was not indicated, the API should prompt for correct ID.

129 VideoID Audio Match Failed The user’s Audio captured in the videoID does not match the Audio data in the database from a previously enrolled user.

The application using this SDK/API should prompt the user to recapture their VideoID and can be captured with clarity and accuracy.

131 ID and VideoID Not Matched The user's captured ID does not match the ID in the VideoID

The application using this SDK/API should prompt the user to recapture their VideoID and can be captured with clarity and accuracy.

133 VideoID Face Match Failed The user's captured Selfie does not match the Face in the VideoID

The application using this SDK/API should prompt the user to recapture their VideoID and can be captured with clarity and accuracy.

APPENDIX D – Manual Review Form Status and State Codes

If Manual Review is requested and the form moves into a ‘Review…’ formStatus, this is the list of values that the formStatus will show until manual review is completed. These are not the final form states, this is just a temporary formStatus that will be present until review is completed.

State Code
Form Status
Description Recommended Actions
104 Review Barcode If a barcode is expected to be present, and the barcode data is not detected by our system. Manual review of the ID in the Back Office to verify the information on the front of the ID against what is shown on the back.
111 Review Duplicate Employee Found If the submitted biometric data matches data already associated with an enrolled employee. The submission will be manually reviewed in the back-office to determine if the matches found are true duplicates and will action the form accordingly.
95 Review Expired ID If an ID has an expiration date that is expired as of today's date. Manual review of the ID in the back-office to determine if the ID is truly expired or not.
93 Review Face Not Detected If a face is not detected on an image. The main reason for this is that the face was not present on the ID, however in some cases this could be due to poor image quality, or if there is a glare throughout the image. Manual review of the ID in the Back Office to determine if a face is actually present on the ID.
102 Review Facial Biometric Match Not Verified If a customer photo is captured and does not biometrically match the photo in the ID document, the ability to review the images is in the back office. Manual review of the ID in the Back Office to determine if the Customer Photo is a match to the photo on the ID. If the person appears to be the same, it would be Approved, if not, it would be marked as ‘Facial Biometric Match Failed’.
90 Review Forced This form state occurs when the Manual Review flag is set to F (Forced), which requires every form to be reviewed by the back-office team. The ID will be manually reviewed in the back-office and decisioned into the appropriate form state.
94 Review ID Back Image not found If the flags that determine a back image is not found are questionable, then the ability to review the ID back image is available in the back office. Manual review of the ID back image in the Back Office to determine if its present and valid.
105 Review ID Front and Back Mismatch If the back of an ID is expected to be present and if the data extracted from the front of the ID data does not match the data extracted from the barcode, then the ability to review the data is available in the Back Office. Manual review of the ID in the Back Office because the data from the front does not match the data extracted from the barcode. The back office user will need to be able to see the ID Number field that was extracted from the front of the ID vs what was extracted from the barcode. They can manually compare this to the image to see if it's actually a mismatch or if it was an issue with OCR extraction.
103 Review ID Front Image Not Found If the front of an ID is not uploaded or a blank image was provided. Manual review of the ID front image in the Back Office to see if its present and valid.
108 Review ID Type Mismatch If the ID Type submitted doesn’t match the ID Type extracted from the ID Image. Manual Review of the ID in the Back Office to determine if the template match is correct based on the ID Type submitted.
63 Review Invalid ID Number The ID Number on the ID does not match the pattern defined in the ID Template. The ID will be manually reviewed in the back office to determine if the ID number matches the pattern defined in the ID template and was extracted incorrectly.
109 Review Key Component Not Visible A key component that is expected on the ID is missing such as the Date of birth, expiration date, photo, etc. Manual Review of the ID in the Back Office to determine if the components are present but just weren’t extracted.
116 Review Live Face Not Detected If the live photo submitted fails the liveness checks based on IDmission's liveness detection logic. Manual Review in the back-office. This occurs when an image fails the liveness check.
96 Review Low Resolution If either the front or back image that is uploaded has been detected as low resolution or the ID image is not a color/gray scale image. This is based on resolution thresholds defined in our system. Manual review of the ID in the Back Office to determine if the ID images have a clear enough resolution to be reviewed and validated.
106 Review MRZ and ID Data Mismatch If the data extracted from the MRZ does not match the data extracted from the ID image itself. Manual review of the ID in the Back office because the data from the front does not match the data extracted from the MRZ. The back-office user will need to be able to see the ID Number field that was extracted from the front of the ID vs what was extracted from the MRZ. They can manually compare this to the image to see if it's actually a mismatch or if it was an issue with OCR extraction.
91 Review MRZ Invalid If the MRZ Validation flag (Machine Readable Zone) is questionable, and MRZ Data is expected to be present, then the ability to review the MRZ is available in the back office. An MRZ parsing tool is provided in the event the MRZ extracted might have a few characters transposed. Manual Review of the ID in the Back Office. The MRZ String should be provided and an MRZ parsing tool should be present for the back-office user to utilize. In most cases, this is due to a glare on the MRZ so the data was extracted improperly. It can be manually fixed and tested to ensure the MRZ is truly valid.
107 Review Name Match Failed If the name submitted for the Customer or the Employee doesn’t meet the matching thresholds against the name extracted from the ID Document.

Manual Review in the Back Office of the name submitted against the name extracted from the ID.

98 Review No Image Found If the ID front and back images were not uploaded or a blank image was provided. The ID front and back images will be manually reviewed in the back-office to see if they are present and valid.
97 Review Security Feature Invalid If one or more security features defined for the ID template are detected as not matching with the image provided. Manual Review in the Back Office. This occurs when the ID Template the image is matched against indicates the placement of the security feature is off or is not present.
112 Review Suspected Tampering If photo editing software (e.g., Microsoft Paint, Adobe Photoshop) or other means of ID tampering were detected. The ID will be manually reviewed in the back-office to investigate whether the ID has been tampered with.
113 Review Suspicious ID If an ID is found to be suspicious based on IDmission’s AI logic. Manual Review in the back-office. This occurs when an ID is found to be suspicious.
92 Review Template Not Found If the image provided does not match any ID templates that are configured for a client, it can be reviewed by a back office team to determine if the image was just of poor quality and if it should be accepted OR if it should be rejected OR if the template needs to be setup and configured for that client. Manual Review in the Back Office. This is generally due to poor image quality, so a manual check is required to see if it's truly a valid and accepted ID type for the region / customer.
101 Review Under the age of 18** If the date of birth (extracted from the barcode/MRZ) calculates the individual as under the age of 18. Manual review of the ID in the Back Office to determine if the date of birth extracted has resulted in a proper calculated age.
114 Review Verification Results If the verification results through a third-party verification process are flagged to be reviewed. For example, the customer name matched against a watchlist. The verification results will be manually reviewed in the back-office
117 Review Under the age of 21 If the date of birth (extracted from the barcode/MRZ) calculates the individual as under the age of 21. Manual review of the ID in the Back Office to determine if the date of birth extracted has resulted in a proper calculated age.
128 Review VideoID Audio Match Failed The user’s Audio captured in the videoID does not match the Audio data in the database from a previously enrolled user.

Manual review of the VideoID Audio in the Back Office to determine if the Customer Audio is a match to the VideoID Audio previously recorded. If the person appears to be the same, it would be Approved, if not, it would be marked as ‘VideoID Audio Match Failed'.

130 Review ID and VideoID Not Matched The user's captured ID does not match the ID in the VideoID

Manual review of the VideoID ID in the Back Office to determine if the Customer ID is a match to the ID captured in the Video . If the person appears to be the same, it would be Approved, if not, it would be marked as ‘ID and VideoID Not Matched'.

132 Review VideoID Face Match Failed The user's captured Selfie does not match the Face in the VideoID

Manual review of the Selfie and Face in the VideoID in the Back Office to determine if the Customer's Face is a match. If the person appears to be the same, it would be Approved, if not, it would be marked as ‘VideoID Face Match Failed’.

APPENDIX E – ID Types Codes

ID Type Code
ID Type Description
PP
PASSPORT
NID
NATIONAL_ID
RID
RESIDENCE_CARD
DL
DRIVERS_LICENSE
PID
PHOTO_ID
VID
VOTER_ID_CARD
TID
TAX_ID_CARD
WV
WORK_VISA_PERMIT
SV
STUDENT_VISA_PERMIT
GID
MILITARY_POLICE_GOVERNMENT_ID
BID
BOAT_SHIP_ID_CARD
OTH
OTHERS
GE
GLOBAL_ENTRY_CARD
PPC
PASSPORT CARD
NSP
NOT SPECIFIED
UNR
UNITED_NATION_REFUGEE_CARD
TD
TRAVEL_DOCUMENT
BC
BANK_CARD
PPA
PASSPORT_ADDRESS

APPENDIX F – ISO Country Codes

Country Code
Country Name
AFG
Afghanistan
ALA
Aland Islands
ALB
Albania
DZA
Algeria
ASM
American Samoa
AND
Andorra
AGO
Angola
AIA
Anguilla
ATA
Antarctica
ATG
Antigua and Barbuda
ARG
Argentina
ARM
Armenia
ABW
Aruba
AUS
Australia
AUT
Austria
AZE
Azerbaijan
BHS
Bahamas
BHR
Bahrain
BGD
Bangladesh
BRB
Barbados
BLR
Belarus
BEL
Belgium
BLZ
Belize
BEN
Benin
BMU
Bermuda
BTN
Bhutan
BOL
Bolivia
BES
Bonaire, Sint Eustatius and Saba
BIH
Bosnia and Herzegovina
BWA
Botswana
BVT
Bouvet Island
BRA
Brazil
IOT
British Indian Ocean Territory
BRN
Brunei Darussalam
BGR
Bulgaria
BFA
Burkina Faso
BDI
Burundi
KHM
Cambodia
CMR
Cameroon
CAN
Canada
CPV
Cape Verde
CYM
Cayman Islands
CAF
Central African Republic
TCD
Chad
CHL
Chile
CHN
China
CXR
Christmas Island
CCK
Cocos (Keeling) Islands
COL
Colombia
COM
Comoros
COG
Congo
COD
Congo, The Democratic Republic of
COK
Cook Islands
CRI
Costa Rica
CIV
Cote d'Ivoire
HRV
Croatia
CUB
Cuba
CUW
Curaçao
CYP
Cyprus
CZE
Czechia
DNK
Denmark
DJI
Djibouti
DMA
Dominica
DOM
Dominican Republic
ECU
Ecuador
EGY
Egypt
SLV
El Salvador
GNQ
Equatorial Guinea
ERI
Eritrea
EST
Estonia
ETH
Ethiopia
FLK
Falkland Islands (Malvinas)
FRO
Faroe Islands
FJI
Fiji
FIN
Finland
FRA
France
GUF
French Guiana
PYF
French Polynesia
ATF
French Southern Territories
GAB
Gabon
GMB
Gambia
GEO
Georgia
DEU
Germany
GHA
Ghana
GIB
Gibraltar
GRC
Greece
GRL
Greenland
GRD
Grenada
GLP
Guadeloupe
GUM
Guam
GTM
Guatemala
GGY
Guernsey
GIN
Guinea
GNB
Guinea-Bissau
GUY
Guyana
HTI
Haiti
HMD
Heard and Mc Donald Islands
VAT
Holy See (Vatican City State)
HND
Honduras
HKG
Hong Kong
HUN
Hungary
ISL
Iceland
IND
India
IDN
Indonesia
IRN
Iran, Islamic Republic of
IRQ
Iraq
IRL
Ireland
IMN
Isle of Man
ISR
Israel
ITA
Italy
JAM
Jamaica
JPN
Japan
JEY
Jersey
JOR
Jordan
KAZ
Kazakstan
KEN
Kenya
KIR
Kiribati
PRK
Korea, Democratic People's Republic of
KOR
Korea, Republic of
XKX
Kosovo (temporary code)
KWT
Kuwait
KGZ
Kyrgyzstan
LAO
Lao, People's Democratic Republic
LVA
Latvia
LBN
Lebanon
LSO
Lesotho
LBR
Liberia
LBY
Libyan Arab Jamahiriya
LIE
Liechtenstein
LTU
Lithuania
LUX
Luxembourg
MAC
Macao
MKD
Macedonia, The Former Yugoslav Republic Of
MDG
Madagascar
MWI
Malawi
MYS
Malaysia
MDV
Maldives
MLI
Mali
MLT
Malta
MHL
Marshall Islands
MTQ
Martinique
MRT
Mauritania
MUS
Mauritius
MYT
Mayotte
MEX
Mexico
FSM
Micronesia, Federated States of
MDA
Moldova, Republic of
MCO
Monaco
MNG
Mongolia
MNE
Montenegro
MSR
Montserrat
MAR
Morocco
MOZ
Mozambique
MMR
Myanmar
NAM
Namibia
NRU
Nauru
NPL
Nepal
NLD
Netherlands
NCL
New Caledonia
NZL
New Zealand
NIC
Nicaragua
NER
Niger
NGA
Nigeria
NIU
Niue
NFK
Norfolk Island
MNP
Northern Mariana Islands
NOR
Norway
OMN
Oman
PAK
Pakistan
PLW
Palau
PSE
Palestinian Territory, Occupied
PAN
Panama
PNG
Papua New Guinea
PRY
Paraguay
PER
Peru
PHL
Philippines
PCN
Pitcairn
POL
Poland
PRT
Portugal
PRI
Puerto Rico
QAT
Qatar
SRB
Republic of Serbia
REU
Reunion
ROU
Romania
RUS
Russia Federation
RWA
Rwanda
BLM
Saint Barthélemy
SHN
Saint Helena
KNA
Saint Kitts & Nevis
LCA
Saint Lucia
MAF
Saint Martin
SPM
Saint Pierre and Miquelon
VCT
Saint Vincent and the Grenadines
WSM
Samoa
SMR
San Marino
STP
Sao Tome and Principe
SAU
Saudi Arabia
SEN
Senegal
SYC
Seychelles
SLE
Sierra Leone
SGP
Singapore
SXM
Sint Maarten
SVK
Slovakia
SVN
Slovenia
SLB
Solomon Islands
SOM
Somalia
ZAF
South Africa
SGS
South Georgia & The South Sandwich Islands
SSD
South Sudan
ESP
Spain
LKA
Sri Lanka
SDN
Sudan
SUR
Suriname
SJM
Svalbard and Jan Mayen
SWZ
Swaziland
SWE
Sweden
CHE
Switzerland
SYR
Syrian Arab Republic
TWN
Taiwan, Province of China
TJK
Tajikistan
TZA
Tanzania, United Republic of
THA
Thailand
TLS
Timor-Leste
TGO
Togo
TKL
Tokelau
TON
Tonga
TTO
Trinidad and Tobago
TUN
Tunisia
TUR
Turkey
XTX
Turkish Rep N Cyprus (temporary code)
TKM
Turkmenistan
TCA
Turks and Caicos Islands
TUV
Tuvalu
UGA
Uganda
UKR
Ukraine
ARE
United Arab Emirates
GBR
United Kingdom
USA
United States
UMI
United States Minor Outlying Islands
URY
Uruguay
UZB
Uzbekistan
VUT
Vanuatu
VEN
Venezuela
VNM
Vietnam
VGB
Virgin Islands, British
VIR
Virgin Islands, U.S.
WLF
Wallis and Futuna
ESH
Western Sahara
YEM
Yemen
ZMB
Zambia
ZWE
Zimbabwe

APPENDIX G – ISO State Codes

State Code
Country Code
State Name
AL
USA
Alabama
AK
USA
Alaska
AZ
USA
Arizona
AR
USA
Arkansas
CA
USA
California
CO
USA
Colorado
CT
USA
Connecticut
DE
USA
Delaware
FL
USA
Florida
GA
USA
Georgia
HI
USA
Hawaii
ID
USA
Idaho
IL
USA
Illinois
IN
USA
Indiana
IA
USA
Iowa
KS
USA
Kansas
KY
USA
Kentucky
LA
USA
Louisiana
ME
USA
Maine
MD
USA
Maryland
MA
USA
Massachusetts
MI
USA
Michigan
MN
USA
Minnesota
MS
USA
Mississippi
MO
USA
Missouri
MT
USA
Montana
NE
USA
Nebraska
NV
USA
Nevada
NH
USA
New Hampshire
NJ
USA
New Jersey
NM
USA
New Mexico
NY
USA
New York
NC
USA
North Carolina
ND
USA
North Dakota
OH
USA
Ohio
OK
USA
Oklahoma
OR
USA
Oregon
PA
USA
Pennsylvania
RI
USA
Rhode Island
SC
USA
South Carolina
SD
USA
South Dakota
TN
USA
Tennessee
TX
USA
Texas
UT
USA
Utah
VT
USA
Vermont
VA
USA
Virginia
WA
USA
Washington
WV
USA
West Virginia
WI
USA
Wisconsin
WY
USA
Wyoming
ON
CAN
Ontario
QC
CAN
Quebec
NS
CAN
Nova Scotia
NB
CAN
New Brunswick
MB
CAN
Manitoba
BC
CAN
British Columbia
PE
CAN
Prince Edward Island
SK
CAN
Saskatchewan
AB
CAN
Alberta
NL
CAN
Newfoundland and Labrador
NSW
AUS
New South Wales
QLD
AUS
Queensland
SA
AUS
South Australia
TAS
AUS
Tasmania
VIC
AUS
Victoria
WA
AUS
Western Australia