Installation
View the package on Rubygems and the open source code on Github.
Add this line to your application's Gemfile:
gem 'smile-identity-core'
and require the package:
require 'smile-identity-core'
Or install it to your system as:
$ gem install smile-identity-core
Web API Prototype
submit_job method
Copy this code and replace sections marked with <>
require 'smile-identity-core'​partner_id = '<Put your 3 digit partner ID here>';default_callback = '<Put your default callback url here>';api_key = '<Put your base64 encoded API key here>'; # Download your API key from the Smile Identity portalsid_server = '0'; # Use '0' for the sandbox server, use '1' for production server​# Initializeconnection = SmileIdentityCore::WebApi.new(partner_id, default_callback, api_key, sid_server)​# Create required tracking parameterspartner_params = {user_id: '<put your unique ID for the user here>',job_id: '<put unique job ID here',# Job Type Integer# Use 1 for jobs that compare a selfie to an ID,# 2 for authenticating a selfie against a previously registered user,# 4 for registering a user.# 8 for updating an enrolled photojob_type: <1 | 2 | 4 | 8>};​# Create image list# image_type_id Integer# 0 - Selfie image jpg or png# 1 - ID card image jpg or png# 2 - Selfie image jpg or png base64 encoded# 3 - ID card image jpg or png base 64 encodedimage_details = {[{image_type_id: <0 | 2>,image: '<path to selfie image or base64image string>'},{ # Not required if suppling ID number info or job type 4 - registration onlyimage_type_id: <1 | 3>,image: '<path to selfie image or base64 image string>'}]};​# Create ID number infoid_info = {first_name: '<name>',last_name: '<surname>',country: '<country code>',id_type: '<id type>',id_number: '<valid id number>',entered: '<true | false>' # must be a string};​# Create optionsoptions = {return_job_status: <true | false>,return_history: <true | false>,return_image_links: <true |false>};​String response = connection.submit_job(partner_params, image_details, id_info, options)​
Please note that if you do not need to pass through id_info or options, you may omit calling those class and send through nil in submit_job, as follows:
$ response = connection.submit_job(partner_params, images, nil, nil);
In the case of a Job Type 5 you can simply omit the the images and options keys. Remember that the response is immediate, so there is no need to query the job_status. There is also no enrollment so no images are required. The response for a job type 5 can be found in the response section below.
$ response = connection.submit_job(partner_params, nil, id_info, nil);
Response:
Should you choose to set return_job_status to false, the response will be a JSON String containing:
{success: true, smile_job_id: smile_job_id}
However, if you have set return_job_status to true (with image_links and history) then you will receive JSON Object response like below:
{"job_success":true,"result":{"ConfidenceValue":"99","JSONVersion":"1.0.0","Actions":{"Verify_ID_Number":"Verified","Return_Personal_Info":"Returned","Human_Review_Update_Selfie":"Not Applicable","Human_Review_Compare":"Not Applicable","Update_Registered_Selfie_On_File":"Not Applicable","Liveness_Check":"Not Applicable","Register_Selfie":"Approved","Human_Review_Liveness_Check":"Not Applicable","Selfie_To_ID_Authority_Compare":"Completed","Selfie_To_ID_Card_Compare":"Not Applicable","Selfie_To_Registered_Selfie_Compare":"Not Applicable"},"ResultText":"Enroll User","IsFinalResult":"true","IsMachineResult":"true","ResultType":"SAIA","PartnerParams":{"job_type":"1","optional_info":"we are one","user_id":"HBBBBBBH57g","job_id":"HBBBBBBHg"},"Source":"WebAPI","ResultCode":"0810","SmileJobID":"0000001111"},"code":"2302","job_complete":true,"signature":"HKBhxcv+1qaLy\C7PjVtk257dE=|1577b051a4313ed5e3e4d29893a66f966e31af0a2d2f6bec2a7f2e00f2701259","history":[{"ConfidenceValue":"99","JSONVersion":"1.0.0","Actions":{"Verify_ID_Number":"Verified","Return_Personal_Info":"Returned","Human_Review_Update_Selfie":"Not Applicable","Human_Review_Compare":"Not Applicable","Update_Registered_Selfie_On_File":"Not Applicable","Liveness_Check":"Not Applicable","Register_Selfie":"Approved","Human_Review_Liveness_Check":"Not Applicable","Selfie_To_ID_Authority_Compare":"Completed","Selfie_To_ID_Card_Compare":"Not Applicable","Selfie_To_Registered_Selfie_Compare":"Not Applicable"},"ResultText":"Enroll User","IsFinalResult":"true","IsMachineResult":"true","ResultType":"SAIA","PartnerParams":{"job_type":"1","optional_info":"we are one","user_id":"HBBBBBBH57g","job_id":"HBBBBBBHg"},"Source":"WebAPI","ResultCode":"0810","SmileJobID":"0000001111"}],"image_links":{"selfie_image":"image_link"},"timestamp":"2019-10-10T12:32:04.622Z"}
You can also view your response asynchronously at the callback that you have set, it will look as follows:
{"job_success":true,"result":{"ConfidenceValue":"99","JSONVersion":"1.0.0","Actions":{"Verify_ID_Number":"Verified","Return_Personal_Info":"Returned","Human_Review_Update_Selfie":"Not Applicable","Human_Review_Compare":"Not Applicable","Update_Registered_Selfie_On_File":"Not Applicable","Liveness_Check":"Not Applicable","Register_Selfie":"Approved","Human_Review_Liveness_Check":"Not Applicable","Selfie_To_ID_Authority_Compare":"Completed","Selfie_To_ID_Card_Compare":"Not Applicable","Selfie_To_Registered_Selfie_Compare":"Not Applicable"},"ResultText":"Enroll User","IsFinalResult":"true","IsMachineResult":"true","ResultType":"SAIA","PartnerParams":{"job_type":"1","optional_info":"we are one","user_id":"HBBBBBBH57g","job_id":"HBBBBBBHg"},"Source":"WebAPI","ResultCode":"0810","SmileJobID":"0000001111"},"code":"2302","job_complete":true,"signature":"HKBhxcv+1qaLy\C7PjVtk257dE=|1577b051a4313ed5e3e4d29893a66f966e31af0a2d2f6bec2a7f2e00f2701259","history":[{"ConfidenceValue":"99","JSONVersion":"1.0.0","Actions":{"Verify_ID_Number":"Verified","Return_Personal_Info":"Returned","Human_Review_Update_Selfie":"Not Applicable","Human_Review_Compare":"Not Applicable","Update_Registered_Selfie_On_File":"Not Applicable","Liveness_Check":"Not Applicable","Register_Selfie":"Approved","Human_Review_Liveness_Check":"Not Applicable","Selfie_To_ID_Authority_Compare":"Completed","Selfie_To_ID_Card_Compare":"Not Applicable","Selfie_To_Registered_Selfie_Compare":"Not Applicable"},"ResultText":"Enroll User","IsFinalResult":"true","IsMachineResult":"true","ResultType":"SAIA","PartnerParams":{"job_type":"1","optional_info":"we are one","user_id":"HBBBBBBH57g","job_id":"HBBBBBBHg"},"Source":"WebAPI","ResultCode":"0810","SmileJobID":"0000001111"}],"image_links":{"selfie_image":"image_link"},"timestamp":"2019-10-10T12:32:04.622Z"}
If you have queried a job type 5, your response be a JSON String that will contain the following:
{"JSONVersion":"1.0.0","SmileJobID":"0000001105","PartnerParams":{"user_id":"T6yzdOezucdsPrY0QG9LYNDGOrC","job_id":"FS1kd1dd15JUpd87gTBDapvFxv0","job_type":5},"ResultType":"ID Verification","ResultText":"ID Number Validated","ResultCode":"1012","IsFinalResult":"true","Actions":{"Verify_ID_Number":"Verified","Return_Personal_Info":"Returned"},"Country":"NG","IDType":"PASSPORT","IDNumber":"A04150107","ExpirationDate":"2017-10-28","FullName":"ADEYEMI KEHINDE ADUNOLA","DOB":"1989-09-20","Photo":"SomeBase64Image","sec_key":"pjxsxEY69zEHjSPFvPEQTqu17vpZbw+zTNqaFxRWpYDiO+7wzKc9zvPU2lRGiKg7rff6nGPBvQ6rA7/wYkcLrlD2SuR2Q8hOcDFgni3PJHutij7j6ThRdpTwJRO2GjLXN5HHDB52NjAvKPyclSDANHrG1qb/tloO7x4bFJ7tKYE=|8faebe00b317654548f8b739dc631431b67d2d4e6ab65c6d53539aaad1600ac7","timestamp":1570698930193}
get_job_status method
Sometimes, you may want to get a particular job status at a later time. You may use the get_job_status function to do this:
You will already have your Web Api class initialised as follows:
connection = SmileIdentityCore::WebApi.new(partner_id, default_callback, api_key, sid_server)
Thereafter, simply call get_job_status with the correct parameters:
response = connection.get_job_status(partner_params, options)# where options is {return_history: true | false, return_image_links: true | false}
Please note that if you do not need to pass through options if you will not be using them, you may omit pass through an empty hash or nil instead:
response = connection.get_job_status(partner_params, nil);
Example Response Body
Your response will return a JSON Object below with image_links and history included:
{"job_success":true,"result":{"ConfidenceValue":"99","JSONVersion":"1.0.0","Actions":{"Verify_ID_Number":"Verified","Return_Personal_Info":"Returned","Human_Review_Update_Selfie":"Not Applicable","Human_Review_Compare":"Not Applicable","Update_Registered_Selfie_On_File":"Not Applicable","Liveness_Check":"Not Applicable","Register_Selfie":"Approved","Human_Review_Liveness_Check":"Not Applicable","Selfie_To_ID_Authority_Compare":"Completed","Selfie_To_ID_Card_Compare":"Not Applicable","Selfie_To_Registered_Selfie_Compare":"Not Applicable"},"ResultText":"Enroll User","IsFinalResult":"true","IsMachineResult":"true","ResultType":"SAIA","PartnerParams":{"job_type":"1","optional_info":"we are one","user_id":"HBBBBBBH57g","job_id":"HBBBBBBHg"},"Source":"WebAPI","ResultCode":"0810","SmileJobID":"0000001111"},"code":"2302","job_complete":true,"signature":"HKBhxcv+1qaLy\C7PjVtk257dE=|1577b051a4313ed5e3e4d29893a66f966e31af0a2d2f6bec2a7f2e00f2701259","history":[{"ConfidenceValue":"99","JSONVersion":"1.0.0","Actions":{"Verify_ID_Number":"Verified","Return_Personal_Info":"Returned","Human_Review_Update_Selfie":"Not Applicable","Human_Review_Compare":"Not Applicable","Update_Registered_Selfie_On_File":"Not Applicable","Liveness_Check":"Not Applicable","Register_Selfie":"Approved","Human_Review_Liveness_Check":"Not Applicable","Selfie_To_ID_Authority_Compare":"Completed","Selfie_To_ID_Card_Compare":"Not Applicable","Selfie_To_Registered_Selfie_Compare":"Not Applicable"},"ResultText":"Enroll User","IsFinalResult":"true","IsMachineResult":"true","ResultType":"SAIA","PartnerParams":{"job_type":"1","optional_info":"we are one","user_id":"HBBBBBBH57g","job_id":"HBBBBBBHg"},"Source":"WebAPI","ResultCode":"0810","SmileJobID":"0000001111"}],"image_links":{"selfie_image":"image_link"},"timestamp":"2019-10-10T12:32:04.622Z"}
Signature Class
generate_sec_key method
connection = SmileIdentityCore::Signature.new(partner_id, api_key)​sec_key = connection.generate_sec_key(timestamp)where timestamp is optional
The response will be a hash:
{:sec_key=> "<the generated sec key>",:timestamp=> 1563283420}
confirm_sec_key method
You can also confirm the signature that you receive when you interacting with our servers, simply use the confirm_sec_key method which returns a boolean:
connection = SmileIdentityCore::Signature.new(partner_id, api_key)sec_key = connection.confirm_sec_key(sec_key, timestamp)
Utilities Class
You may want to receive more information about a job. This is built into Web Api if you choose to set return_job_status as true in the options hash. However, you also have the option to build the functionality yourself by using the Utilities class. Please note that if you are querying a job immediately after submitting it, you will need to poll it for the duration of the job.
utilities_connection = SmileIdentityCore::Utilities.new('partner_id', 'api_key' , sid_server)​utilities_connection.get_job_status('user_id', 'job_id', options)where options is {return_history: true | false, return_image_links: true | false}