Quick Start

We suggest you read through the step by step integration guide to understand the integration in detail. Please see below for example code snippets, examples projects and a demo.

Before you start
You will need to access your Yoti Hub account with an e-mail & password or using the Yoti mobile app and to have registered your business with Yoti. Click below for more info.

Please ensure you have a verified organisation and generate Age estimation keys.


Face capture example


Example code

Good to know
We strongly recommend you use the Face capture module.

Age Estimation v2

This is our current API with the latest features. If starting a new integration, please use this API.

To use it, first you need to install the SDK:

npm install -S -E yoti
// If you are using Maven, add the following dependency:
<dependency>
<groupId>com.yoti</groupId>
<artifactId>yoti-sdk-api</artifactId>
<version>3.0.0</version>
</dependency>

// If you are using Gradle, add the following dependency:
compile group: 'com.yoti', name: 'yoti-sdk-api', version: '3.0.0'
// Get the Yoti PHP SDK library via a Composer package
composer require yoti/yoti-php-sdk
pip install yoti
// To install the Yoti NuGet package you will need to install NuGet.
// To import the latest Yoti SDK into your project, enter the following
// command from NuGet Package Manager Console in Visual Studio:

Install-Package Yoti

// For other installation methods, see https://www.nuget.org/packages/Yoti
// As of version 2.4.0, modules are used. This means it's not necessary to get a copy or fetch all dependencies
// as instructed below, as the Go toolchain will fetch them as necessary.
// You can simply add a `require github.com/getyoti/yoti-go-sdk/v2` to go.mod.
// To download and install the Yoti SDK and its dependencies, run the following command from your terminal:

go get "github.com/getyoti/yoti-go-sdk/v3"
gem install yoti

# The gem provides a configuration generator for Ruby on Rails:

rails generate yoti:install

There are three endpoints which can be used with this API:

Endpoint

Description

https://api.yoti.com/ai/v1/age

Use Yoti's age estimation service.

https://api.yoti.com/ai/v1/age-antispoofing

Use Yoti's age estimation service and the Anti-spoofing check.

https://api.yoti.com/ai/v1/antispoofing

Use Yoti's anti-spoofing check as a standalone product.

const PATHS = {
AGE: '/age',
LIVENESS: '/antispoofing',
AGE_LIVENESS: '/age-antispoofing',
};

const data = {
img: 'base64img',
};

const request = new RequestBuilder()
.withBaseUrl('https://api.yoti.com/ai/v1')
.withPemFilePath('<YOTI_KEY_FILE_PATH>')
.withEndpoint(PATHS.AGE_LIVENESS) // optionally PATHS.AGE or PATHS.LIVENESS
.withPayload(new Payload(data))
.withMethod('POST')
.withHeader('X-Yoti-Auth-Id', '<YOTI_CLIENT_SDK_ID>')
.build();
String AGE = "/age";
String LIVENESS = "/antispoofing";
String AGE_LIVENESS = "/age-antispoofing";

JsonObject body = new JsonObject();
body.put("img", imageBytes);
byte[] payload = body.encode().getBytes();

try {
SignedRequest signedRequest = new SignedRequestBuilder()
.withKeyPair(<YOTI_KEY_FILE_PATH>)
.withBaseUrl("https://api.yoti.com/ai/v1")
.withEndpoint(AGE_LIVENESS) // optionally AGE or LIVENESS
.withPayload(payload)
.withHttpMethod("POST")
.withHeader("X-Yoti-Auth-Id", "<YOTI_CLIENT_SDK_ID>")
.build();

YourPojo yourPojo = signedRequest.execute(YourPojo.class);
} catch (GeneralSecurityException | URISyntaxException | IOException | ResourceException ex) {
ex.printStackTrace();
<?php
use Yoti\Http\RequestBuilder;
use Yoti\Http\Payload;

$img = [ "img" => "base64Image" ];

$request = (new RequestBuilder())
->withBaseUrl('https://api.yoti.com/ai/v1')
->withPemFilePath('<YOTI_KEY_FILE_PATH>')
->withEndpoint('/age-antispoofing')
->withPayload(Payload::fromJsonData($img)) // For version < 3, use ->withPayload(new Payload($img))
->withMethod('POST')
->withHeader('X-Yoti-Auth-Id', '<YOTI_CLIENT_SDK_ID>')
->build();

// Execute request
$response = $request->execute();

// Get response body
$body = $response->getBody();
from yoti_python_sdk.http import SignedRequest, RequestHandler
import json
import requests

def execute(request):
response = requests.request(
url=request.url, img=request.img, headers=request.headers, method=request.method)
return response.content

def generate_session():

payload_string = json.dumps(img).encode()

signed_request = (
SignedRequest
.builder()
.with_pem_file("<YOTI_KEY_FILE_PATH>")
.with_base_url("https://api.yoti.com/ai/v1")
.with_endpoint("/age-antispoofing")
.with_http_method("POST")
.with_header("X-Yoti-Auth-Id", "<YOTI_CLIENT_SDK_ID>")
.with_payload(payload_string)
.build()
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Yoti.Auth.Web;

HttpClient httpClient = new HttpClient();
StreamReader privateKeyStream = System.IO.File.OpenText(_pemFilePath);

string serializedRequest = Newtonsoft.Json.JsonConvert.SerializeObject(new
{
img = _base64Face
});

byte[] byteContent = Encoding.UTF8.GetBytes(serializedRequest);

Uri _baseUrl = new UriBuilder("https", "api.yoti.com", 443, "ai/v1").Uri;

Yoti.Auth.Web.Request ageScanRequest = new RequestBuilder()
.WithStreamReader(privateKeyStream)
.WithBaseUri(_baseUrl)
.WithEndpoint("/age-antispoofing")
.WithHttpMethod(HttpMethod.Post)
.WithContent(byteContent)
import (
"io/ioutil"
"net/http"
"github.com/getyoti/yoti-go-sdk/v2/requests"
)

key, _ := ioutil.ReadFile("<YOTI_KEY_FILE_PATH>")
// Create session
request,_ := requests.SignedRequest{
HTTPMethod: http.MethodPost,
BaseURL: "https://api.yoti.com/ai/v1/",
Endpoint: "/age-antispoofing",
Headers: map[string][]string{
"Content-Type": {"application/img"},
"Accept": {"application/img"},
"X-Yoti-Auth-Id":{"<YOTI_CLIENT_SDK_ID>"},
},

Body: func(img []byte, _ error) []byte {
return img
}(json.Marshal(jsonobj{ data },
})),
}.WithPemFile(key).Request()

//get Yoti response
require 'yoti'
Yoti.configure do |config|
config.client_sdk_id = '<YOTI_CLIENT_SDK_ID>'
config.key_file_path = '<YOTI_KEY_FILE_PATH>'
end
request = Yoti::Request
.builder
.with_base_url('https://api.yoti.com/api/v1')
.with_http_method('POST')
.with_endpoint('/age-antispoofing')
.with_payload(img: 'base64Image')
.with_header('X-Yoti-Auth-Id', Yoti.configuration.client_sdk_id)
.build
response = request.execute
body = response.body
puts body

Age Estimation v1 (legacy)

This is our older API, that is relevant for legacy integrations.

First you need to install the SDK:

npm install -S -E yoti
// If you are using Maven, add the following dependency:
<dependency>
<groupId>com.yoti</groupId>
<artifactId>yoti-sdk-api</artifactId>
<version>3.0.0</version>
</dependency>

// If you are using Gradle, add the following dependency:
compile group: 'com.yoti', name: 'yoti-sdk-api', version: '3.0.0'
// Get the Yoti PHP SDK library via a Composer package
composer require yoti/yoti-php-sdk
pip install yoti
// To install the Yoti NuGet package you will need to install NuGet.
// To import the latest Yoti SDK into your project, enter the following
// command from NuGet Package Manager Console in Visual Studio:

Install-Package Yoti

// For other installation methods, see https://www.nuget.org/packages/Yoti
// As of version 2.4.0, modules are used. This means it's not necessary to get a copy or fetch all dependencies
// as instructed below, as the Go toolchain will fetch them as necessary.
// You can simply add a `require github.com/getyoti/yoti-go-sdk/v2` to go.mod.
// To download and install the Yoti SDK and its dependencies, run the following command from your terminal:

go get "github.com/getyoti/yoti-go-sdk/v3"
gem install yoti

# The gem provides a configuration generator for Ruby on Rails:

rails generate yoti:install

There is one endpoint which can be used with this API:

Endpoint

Description

https://api.yoti.com/api/v1/age-verification

Use Age estimation only with a lower quality image.

const { RequestBuilder, Payload } = require('yoti');
const request = new RequestBuilder()
.withBaseUrl('https://api.yoti.com/api/v1/age-verification')
.withPemFilePath('<YOTI_KEY_FILE_PATH>')
.withEndpoint('/checks')
.withPayload(new Payload(data))
.withMethod('POST')
.withHeader('X-Yoti-Auth-Id', '<YOTI_CLIENT_SDK_ID>')
.build();
//get Yoti response
const response = request.execute();
JsonObject body = new JsonObject();
body.put("data", imageBytes);
byte[] payload = body.encode().getBytes();

try {
SignedRequest signedRequest = new SignedRequestBuilder()
.withKeyPair(<YOTI_KEY_FILE_PATH>)
.withBaseUrl("https://api.yoti.com/api/v1/age-verification")
.withEndpoint("/checks")
.withPayload(payload)
.withHttpMethod("POST")
.withHeader("X-Yoti-Auth-Id", "<YOTI_CLIENT_SDK_ID>")
.build();

YourPojo yourPojo = signedRequest.execute(YourPojo.class);
} catch (GeneralSecurityException | URISyntaxException | IOException | ResourceException ex) {
ex.printStackTrace();
}
<?php
use Yoti\Http\RequestBuilder;
use Yoti\Http\Payload;

$data = [ "data" => "base64Image" ];

$request = (new RequestBuilder())
->withBaseUrl('https://api.yoti.com/api/v1/age-verification')
->withPemFilePath('<YOTI_KEY_FILE_PATH>')
->withEndpoint('/checks')
->withPayload(Payload::fromJsonData($data)) // For version < 3, use ->withPayload(new Payload(data))
->withMethod('POST')
->withHeader('X-Yoti-Auth-Id', '<YOTI_CLIENT_SDK_ID>')
->build();

// Execute request
$response = $request->execute();

// Get response body
$body = $response->getBody();
from yoti_python_sdk.http import SignedRequest, RequestHandler
import json
import requests

def execute(request):
response = requests.request(
url=request.url, data=request.data, headers=request.headers, method=request.method)
return response.content

def generate_session():

payload_string = json.dumps(data).encode()

signed_request = (
SignedRequest
.builder()
.with_pem_file("<YOTI_KEY_FILE_PATH>")
.with_base_url("https://api.yoti.com/api/v1/age-verification")
.with_endpoint("/checks")
.with_http_method("POST")
.with_header("X-Yoti-Auth-Id", "<YOTI_CLIENT_SDK_ID>")
.with_payload(payload_string)
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using Microsoft.AspNetCore.Mvc;
using Yoti.Auth.Web;

HttpClient httpClient = new HttpClient();
StreamReader privateKeyStream = System.IO.File.OpenText(_pemFilePath);

string serializedRequest = Newtonsoft.Json.JsonConvert.SerializeObject(new
{
data = _base64Face
});

byte[] byteContent = Encoding.UTF8.GetBytes(serializedRequest);

Uri _baseUrl = new UriBuilder("https", "api.yoti.com", 443, "/api/v1/age-verification").Uri;

Yoti.Auth.Web.Request ageScanRequest = new RequestBuilder()
.WithStreamReader(privateKeyStream)
.WithBaseUri(_baseUrl)
.WithEndpoint("/checks")
.WithHttpMethod(HttpMethod.Post)
.WithContent(byteContent)
import (
"io/ioutil"
"net/http"
"github.com/getyoti/yoti-go-sdk/v2/requests"
)

key, _ := ioutil.ReadFile("<YOTI_KEY_FILE_PATH>")
// Create session
request,_ := requests.SignedRequest{
HTTPMethod: http.MethodPost,
BaseURL: "https://api.yoti.com/api/v1/age-verification",
Endpoint: "/checks",
Headers: map[string][]string{
"Content-Type": {"application/json"},
"Accept": {"application/json"},
"X-Yoti-Auth-Id":{"<YOTI_CLIENT_SDK_ID>"},
},

Body: func(data []byte, _ error) []byte {
return data
}(json.Marshal(jsonobj{ data },
})),
}.WithPemFile(key).Request()

//get Yoti response
require 'yoti'
Yoti.configure do |config|
config.client_sdk_id = '<YOTI_CLIENT_SDK_ID>'
config.key_file_path = '<YOTI_KEY_FILE_PATH>'
end
request = Yoti::Request
.builder
.with_base_url('https://api.yoti.com/api/v1/age-verification')
.with_http_method('POST')
.with_endpoint('checks')
.with_payload(data: 'base64Image')
.with_header('X-Yoti-Auth-Id', Yoti.configuration.client_sdk_id)
.build
response = request.execute
body = response.body
puts body

If you wanna just dive in to hacking this together, click below to see the examples.


Demos

We've created a suite of live demos in Yoti World to show you how Yoti can best serve your business with an age estimation integration: