Getting straight to it with this quick start guide.
This section will guide you through the initial steps to integrate and use our services. Whether you are new to APIs or an experienced developer, we've designed this process to be straightforward.
Step 1: Register for API Access
Before you can start using the API, you'll need to register and obtain your unique API credentials. These credentials are essential for authenticating and sending your API requests.
1) Sign Up: Visit our sign up page and create an account for your company. This will not be instant as we need to set up your company before we can give you access to our services.
2) API Permission: Once your account is set up, please contact us at support@tillertech.com to request API permission on your user credentials.
Step 2: Install Required Tools
To make API requests, you'll need a tool that can send HTTP requests. You can use tools like Postman , cURL, or write your code in a language that supports HTTP requests, such as Python, JavaScript, etc.
We can provide you with a Postman collection if required. Please contact support@tillertech.com.
Step 3: Authenticate Your API Request
All API requests to Verify by Tiller require authentication. An access token can be retrieved through the Authentication method. Please see below some examples code.
Authentication will provide a bearer token to include in the header of your subsequent API requests. Please ensure this token is passed into the Authorization header on subsequent requests.
Step 4: Making Your First API Calls
Once you're authenticated, you can start making API calls. Here are some initial requests to get you started (subscribe, references and application).
- Post Subscription:
The subscribe endpoint provides a URL to send the customer verification results to your system via a Webhook.
Example code:
import requestsdefsubscribe_to_webhook(token,callback_url): url ="https://api.tiller-verify.com/api/v1/ext/webhooks/subscribe" headers ={"Authorization":f"Bearer {token}","Content-Type":"application/json"} payload ={"callback_url": callback_url} response = requests.post(url, headers=headers, json=payload)if response.status_code ==200:return response.json()else:print(f"Error: {response.status_code}, Message: {response.text}")returnNone# Example usagetoken ="your_auth_token"# Replace with your actual tokencallback_url ="https://your.callback.url"# Replace with your URLsubscription =subscribe_to_webhook(token, callback_url)print(subscription)
constaxios=require('axios');asyncfunctionsubscribeToWebhook(token, callbackUrl) {consturl="https://api.tiller-verify.com/api/v1/ext/webhooks/subscribe";constheaders= { Authorization:`Bearer ${token}`,'Content-Type':'application/json' };constpayload= { callback_url: callbackUrl };try {constresponse=awaitaxios.post(url, payload, { headers: headers });returnresponse.data; } catch (error) {console.error(`Error: ${error.response.status}, Message: ${error.response.statusText}`);returnnull; }}// Example usageconsttoken='your_auth_token'; // Replace with your actual tokenconstcallbackUrl='https://your.callback.url'; // Replace with your urlsubscribeToWebhook(token, callbackUrl).then(subscription =>console.log(subscription)).catch(error =>console.error(error));
This allows for greater flexibility and specificity in handling webhook notifications.
- Get References:
This endpoint provide the ID references to commonly needed items such as your mandate type IDs and status IDs.
import requestsdefget_references(token): url ="https://api.tiller-verify.com/api/v1/ext/references" headers ={"Authorization":f"Bearer {token}"} response = requests.get(url, headers=headers)if response.status_code ==200:return response.json()else:print(f"Error: {response.status_code}, Message: {response.text}")returnNone# Example usagetoken ="your_auth_token"# Replace with your actual tokenreferences =get_references(token)print(references)
constaxios=require('axios');asyncfunctiongetReferences(token) {consturl="https://api.tiller-verify.com/api/v1/ext/references";constheaders= { Authorization:`Bearer ${token}` };try {constresponse=awaitaxios.get(url, { headers });returnresponse.data; } catch (error) {console.error(`Error: ${error.response.status}, Message: ${error.response.statusText}`);returnnull; }}// Example usageconsttoken="your_auth_token"; // Replace with your actual tokengetReferences(token).then(references => {console.log(references);});
curl -X GET "https://api.tiller-verify.com/api/v1/ext/references" \
-H "Authorization: Bearer your_auth_token"
It is useful to organise the references into categories.
import jsonfrom collections import defaultdictdeforganise_by_category(data): categories =defaultdict(list)for item in data: category = item['category'] categories[category].append(item)# Optionally, sort each category by name or reference_idfor category in categories: categories[category].sort(key=lambdax: (x['reference_id'] isNone, x['reference_id']))return categories# JSON payloaddata =get_references(token)# Organise dataorganised_data =organise_by_category(data)# To print the organized datafor category, items in organised_data.items():print(f"Category: {category}")for item in items:print(f" {item}")print("\n")# Optionally, convert it back to JSONjson_output = json.dumps(organized_data, indent=4)print(json_output)
constdata= referencesfunctionorganiseByCategory(data) {constcategories= {};data.forEach(item => {constcategory=item.category;if (!categories[category]) { categories[category] = []; } categories[category].push(item); });// Optionally, sort each category by name or reference_idfor (constcategoryin categories) { categories[category].sort((a, b) => {// Sorting by reference_id with null values lastreturn (a.reference_id ===null) - (b.reference_id ===null) || (a.reference_id ||0) - (b.reference_id ||0); }); }return categories;}constorganisedData=organiseByCategory(data);// To print the organized datafor (constcategoryin organisedData) {console.log(`Category: ${category}`); organisedData[category].forEach(item =>console.log(` ${JSON.stringify(item)}`));console.log('\n');}// Optionally, convert it back to JSONconstjsonOutput=JSON.stringify(organisedData,null,4);console.log(jsonOutput);
- Create Application
You can create an application for one or more individuals. This will send each individual an email inviting them to download the Verify by Tiller app and complete their checks. For more information please see the Applications section.
import requestsdefcreate_application(token,application_data): url ="https://api.tiller-verify.com/api/v1/ext/applications" headers ={"Authorization":f"Bearer {token}","Content-Type":"application/json"} response = requests.post(url, headers=headers, json=application_data)if response.status_code ==200:return response.json()else:print(f"Error: {response.status_code}, Message: {response.text}")returnNone# Example usagetoken ="your_auth_token"# Replace with your actual tokenapplication_data ={"name":"YOUR_APPLICATION_NAME",# A meaningful application name for the customer"reference":"MANDATE_REFERENCE",# A unique mandate referece"mandate_type":1,# Update from references list"individuals": [{"email":"CUSTOMER_EMAIL","title":"Mr","first_name":"FIRST_NAME","middle_name":"",#Optional"last_name":"LAST_NAME","date_of_birth":"1980-12-31",#Optional"gender":"male","reference":"REFERENCE001"# Your unique reference}# Additional individuals can be added to this list. ]}new_application =create_application(token, application_data)print(new_application)
constaxios=require('axios');asyncfunctioncreateApplication(token, applicationData) {consturl="https://api.tiller-verify.com/api/v1/ext/applications";constheaders= { Authorization:`Bearer ${token}`,'Content-Type':'application/json' };try {constresponse=awaitaxios.post(url, applicationData, { headers });returnresponse.data; } catch (error) {console.error(`Error: ${error.response.status}, Message: ${error.response.data}`);returnnull; }}// Example usageconsttoken="your_auth_token"; // Replace with your actual tokenconstapplicationData= { name:"YOUR_APPLICATION_NAME",// A meaningful application name for the customer reference:"MANDATE_REFERENCE",// A unique mandate reference mandate_type:1,// Update from references list individuals: [ { email:"CUSTOMER_EMAIL", title:"Mr", first_name:"FIRST_NAME", middle_name:"",// Optional last_name:"LAST_NAME", date_of_birth:"1980-12-31",// Optional gender:"male", reference:"REFERENCE001"// Your unique reference }// Additional individuals can be added to this list. ]};createApplication(token, applicationData).then(newApplication =>console.log(newApplication)).catch(error =>console.error(error));
Once an individual has completed their checks on the Verify by Tiller mobile app, the results will be sent to the URL provided through the subscription endpoint. You can also retrieve the information directly using the Applications endpoint.
Further information about all the endpoint can be found in the API Reference section.
Step 5: Your Results
Each time an individual completes their checks within the Verify by Tiller app, you will receive a response to the URL you have posted to the subscription endpoint. Each webhook will contain the mandate/application details and all the details about the individuals.
General structure:
ID and Reference: Unique identifiers for the application or the mandate.
Mandate Type: Describes the type of application and what checks are included.
Status: Overall status of the application, which is 'in progress' >> 'in review'/'complete'.
Individual details:
Name, Date of Birth, Email, Gender: Basic personal information.
Terms Accepted: Indicates whether the terms and conditions were accepted.
Completed Actions: Lists completed steps in the mobile app to complete their check, like accepting terms and conditions, adding personal details, etc.
Checks: Each check completed (e.g. address_verification_check) will have a set of result data, including:
Title - The type of check made
Status - Indicates the result of the check type, such as "pending", "review", or "accepted".
Check field results - Any underlying verifications made to determine the overall check status.
Images - Any associated images that are related to the check. This can include the ID document image for the Identity and Liveliness Checks.
Handling Errors
Each API request will return a response. A successful request will typically return a 200 OK status code along with any requested data. Errors or issues with your request will return different status codes (e.g., 400 Bad Request, 401 Unauthorized) and an error message explaining what went wrong.
Error handling for all API methods must adhere to the RFC7807 standard, ensuring standardized and informative error responses for clients. Please see https://www.rfc-editor.org/rfc/rfc7807. Please see more information within the Error Handling section.
Need Help?
If you encounter any issues or have questions, our support team is here to help. Please contact us at support@tillertech.com
For "grant_type" we only support either "client_credentials" or "password". This will usually be "password".
It is important that you retrieve your mandate type ID(s) to be able to start creating applications. These mandate types will determine the checks made against the individual. You should have at least one mandate type available upon set-up.
When all individuals have completed their checks, the mandate (application) will move from an 'in progress' status to either a 'in review' or 'complete' status.