Skip to main content

Identity Verification

SDK

We provide a PHP SDK containing an example integration to make it easier and faster to get ready to verify your customers:

VerifyMyContent Identity-Verification PHP SDK

Postman Workspace

We've created a Postman workspace specifically for our API, which contains example API calls that you can use to test and familiarise yourself with our API.

The workspace includes example API calls for each of our API endpoints, along with detailed descriptions of the request parameters and headers being used.

You can generate most of the client code to call our APIs using the Postman client code generator. With this feature, developers can select a range of programming languages, and generate the corresponding code with a few clicks.

Please note that while both the example API calls and the generated code can be a helpful starting point, it's important to thoroughly test your own API calls before deploying them in production. If you encounter any issues while using the example API calls, or if you have any questions about our API, please don't hesitate to reach out to our support team.

API Domain

Our API is designed to be used in two environments: a sandbox environment and a production environment.

The sandbox environment is intended for testing and development purposes, while the production environment is used for live data and real-world use cases.

To ensure the security and integrity of our API, we use separate API keys for each environment. This means that you will need to obtain different API keys for the sandbox and production environments, and should not use the same key for both.

DomainEnvironment
https://oauth.verifymycontent.comproduction
https://oauth.sandbox.verifymycontent.comsandbox

Generating the HMAC header

To improve the security of the communication between your implementation and the VerifyMyContent API, we require you to generate a unique hexadecimal encoded SHA256 HMAC hash for each request, based on the input parameters.

The process of generating it depends on the language of your implementation.

If you use our SDK, the HMAC step will be abstracted,
and you don't need to do anything related to it.
Copy

Copied!

<?php

hash_hmac('sha256', $input, 'API_SECRET');
Copy

Copied!

import { HmacSHA256 } from 'crypto-js';

HmacSHA256(JSON.stringify(input), 'API_SECRET').toString()
Copy

Copied!

Integration steps

Create Identity Verification

To create an identity verification, you'll need to send us the url the user will be redirected to after they finish the verification, some data for them so we can trigger reminders and notifications during the process, and a webhook to notify you when the identity verification status changes.

Important: Please generate a universally unique identifier (UUID v4) for each customer on your site. You should then use this same customer ID every time you call one of our APIs on behalf of that customer. This UUID should never change. For example, if the customer's username on your site changes, their UUID shouldn't.

Authorization Header

Generate HMAC with: Request Body
Authorization: hmac YOUR-API-KEY:GENERATED-HMAC

Request parameters

customer required

Customer information

id required

Customer's unique ID

email required

Customer's email address

redirect_uri optional

The URL where we will redirect the customer after they finish the identity verification process

webhook required

The URL where we will post status updates on the moderation.

Response parameters

id

Unique identifier generated by the VerifyMyContent API.

customer

Customer information

id

Customer's unique ID

email

Customer's email address

redirect_uri

The URL you should redirect the user to start the verification process.

webhook

The URL where we will post status updates on the moderation.

Error responses

CodeDescription
400
{"message": "the request could not be understood by the server due to malformed syntax", "status_code": 400}
Copy

Copied!

401
{"message": "invalid authentication", "status_code": 401}
Copy

Copied!

401
{"message": "invalid client", "status_code": 401}
Copy

Copied!

422
{"message": "invalid parameters", "status_code": 422}
Copy

Copied!

500
{"message": "Internal Server Error","status_code": 500}
Copy

Copied!

API Call
POST /api/v1/identity-verification HTTP/1.1
Content-Type: application/json
Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-BODY

{
    "customer": {
        "id": "YOUR-USER-ID",
        "email": "person@example.com"
    },
    "redirect_uri": "https://verifymy.io",
    "webhook": "https://example.com/webhook"
}
Copy

Copied!

curl -d '{"customer": {"id": "YOUR-USER-ID", "email": "person@example.com"}, "redirect_uri": "https://verifymy.io", "webhook": "https://example.com/webhook"}' \
-H "Content-Type: application/json" \
-H "Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-BODY" \
-X POST https://oauth.sandbox.verifymycontent.com/api/v1/identity-verification
Copy

Copied!

<?php
require(__DIR__ . "/vendor/autoload.php");

use \VerifyMyContent\IdentityCheck\VMC;

$vmc = new VMC(getenv('VMC_API_KEY'), getenv('VMC_API_SECRET'));
//$vmc->useSandbox();

$response = $vmc->createIdentityVerification([
    "customer" => [
        "id" => "YOUR-CUSTOMER-UNIQUE-ID",
        "email" => "person@example.com",
        "phone" => "+4412345678"
    ],
    "redirect_uri" => "https://example.com/callback",
    "webhook" => "https://example.com/webhook",
]);
Copy

Copied!

Response 201: (application/json)
{
  "id": "ABC-123-5678-ABC",
  "customer": {
    "id": "YOUR-USER-ID",
    "email": "person@example.com"
  },
  "redirect_uri": "https://.../v/ABC-123-5678-ABC",
  "webhook": "https://example.com/webhook"
}
Copy

Copied!

Verify Selfie and Document

To verify selfies and documents, you'll need to upload the user's selfie and a photo of their document. Additionally, you'll need to provide some user data so we can trigger reminders and notifications during the process, as well as a webhook to notify you when the identity verification status changes.

Important: Please generate a universally unique identifier (UUID v4) for each customer on your site. You should then use this same customer ID every time you call one of our APIs on behalf of that customer. This UUID should never change. For example, if the customer's username on your site changes, their UUID shouldn't.

Authorization Header

Generate HMAC with: Request Body
Authorization: hmac YOUR-API-KEY:GENERATED-HMAC

Request parameters

customer required

Customer information

id required

Customer's unique ID

email required

Customer's email address

selfie required

Selfie photo in base64 format

document required

Customer document information

type required

Important: The document must contain a photo of the holder for us to match with their selfie.

It can be one of these values. It defaults to passport.

TypeDescription
IdCardA government-issued ID card with personal details and a photo for identity verification
DriverLicenseA document permitting an individual to drive, also used as an ID
PassportA travel document that certifies identity and nationality, used for international travel
ResidencePermitA document allowing a non-citizen to reside in a country, often including biometric data

country required

Country of document

Use 'Code' column to populate 'country' parameter.

CodeCountry
afgAfghanistan
albAlbania
dzaAlgeria
andAndorra
agoAngola
aiaAnguilla
atgAntigua and Barbuda
argArgentina
armArmenia
ausAustralia
autAustria
azeAzerbaijan
bhsBahamas
bhrBahrain
bgdBangladesh
brbBarbados
blrBelarus
belBelgium
blzBelize
benBenin
bmuBermuda
btnBhutan
bolBolivia (Plurinational State of)
bihBosnia and Herzegovina
bwaBotswana
braBrazil
brnBrunei Darussalam
bgrBulgaria
bfaBurkina Faso
bdiBurundi
cpvCabo Verde
khmCambodia
cmrCameroon
canCanada
cymCayman Islands
cafCentral African Republic
tcdChad
chlChile
chnChina
colColombia
comComoros
cogCongo
codCongo, Democratic Republic of the
criCosta Rica
hrvCroatia
cubCuba
cypCyprus
czeCzechia
civCôte d'Ivoire
dnkDenmark
djiDjibouti
dmaDominica
domDominican Republic
ecuEcuador
egyEgypt
slvEl Salvador
gnqEquatorial Guinea
eriEritrea
estEstonia
swzEswatini
ethEthiopia
fjiFiji
finFinland
fraFrance
pyfFrench Polynesia
gabGabon
gmbGambia
geoGeorgia
deuGermany
ghaGhana
gibGibraltar
grcGreece
grdGrenada
gtmGuatemala
ginGuinea
gnbGuinea-Bissau
guyGuyana
htiHaiti
vatHoly See
hndHonduras
hkgHong Kong
hunHungary
islIceland
indIndia
idnIndonesia
irnIran (Islamic Republic of)
irqIraq
irlIreland
imnIsle of Man
isrIsrael
itaItaly
jamJamaica
jpnJapan
jorJordan
kazKazakhstan
kenKenya
kirKiribati
prkKorea (Democratic People's Republic of)
korKorea, Republic of
rksKosovo
kwtKuwait
kgzKyrgyzstan
laoLao People's Democratic Republic
lvaLatvia
lbnLebanon
lsoLesotho
lbrLiberia
lbyLibya
lieLiechtenstein
ltuLithuania
luxLuxembourg
mdgMadagascar
mwiMalawi
mysMalaysia
mdvMaldives
mliMali
mltMalta
mrtMauritania
musMauritius
mexMexico
mdaMoldova, Republic of
mcoMonaco
mngMongolia
mneMontenegro
msrMontserrat
marMorocco
mozMozambique
mmrMyanmar
namNamibia
nruNauru
nplNepal
nldNetherlands
nzlNew Zealand
nicNicaragua
nerNiger
ngaNigeria
mkdNorth Macedonia
norNorway
omnOman
pakPakistan
plwPalau
psePalestine, State of
panPanama
pngPapua New Guinea
pryParaguay
perPeru
phlPhilippines
polPoland
prtPortugal
qatQatar
rouRomania
rusRussian Federation
rwaRwanda
shnSaint Helena, Ascension and Tristan da Cunha
knaSaint Kitts and Nevis
lcaSaint Lucia
vctSaint Vincent and the Grenadines
wsmSamoa
smrSan Marino
stpSao Tome and Principe
sauSaudi Arabia
senSenegal
srbSerbia
sycSeychelles
sleSierra Leone
sgpSingapore
svkSlovakia
svnSlovenia
slbSolomon Islands
somSomalia
zafSouth Africa
ssdSouth Sudan
espSpain
lkaSri Lanka
sdnSudan
surSuriname
sweSweden
cheSwitzerland
syrSyrian Arab Republic
twnTaiwan, Province of China
tjkTajikistan
tzaTanzania, United Republic of
thaThailand
tlsTimor-Leste
tgoTogo
tonTonga
ttoTrinidad and Tobago
tunTunisia
turTurkey
tkmTurkmenistan
tcaTurks and Caicos Islands
tuvTuvalu
ugaUganda
ukrUkraine
areUnited Arab Emirates
gbrUnited Kingdom of Great Britain and Northern Ireland
usaUnited States of America
uryUruguay
uzbUzbekistan
vutVanuatu
venVenezuela (Bolivarian Republic of)
vnmViet Nam
vgbVirgin Islands (British)
yemYemen
zmbZambia
zweZimbabwe

front required

Front of document photo in base64 format

back required

Back of document photo in base64 format.

For the documents below, this field is required

Type
IdCard
DriverLicense
ResidencePermit

webhook required

The URL where we will post status updates on the moderation.

Response parameters

id

Unique identifier generated by the VerifyMyContent API.

customer

Customer information

id

Customer's unique ID

email

Customer's email address

webhook

The URL where we will post status updates on the moderation.

Error responses

CodeDescription
400
{"message": "the request could not be understood by the server due to malformed syntax", "status_code": 400}
Copy

Copied!

401
{"message": "invalid authentication", "status_code": 401}
Copy

Copied!

401
{"message": "invalid client", "status_code": 401}
Copy

Copied!

422
{"message": "invalid parameters", "status_code": 422}
Copy

Copied!

500
{"message": "Internal Server Error","status_code": 500}
Copy

Copied!

API Call
POST /api/v1/identity-verification/selfie-document-validation HTTP/1.1
Content-Type: application/json
Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-BODY

{
    "customer":{
        "id":"YOUR-USER-ID",
        "email":"person@example.com",
        "selfie": "selfie-base64",
        "document": {
            "type":"Passport",
            "country": "gbr",
            "front": "document-front-base64",
            "back": "document-back-base64"
    },
    "webhook": "https://example.com/webhook"
}
Copy

Copied!

curl -d '{
    "customer":{
        "id":"YOUR-USER-ID",
        "email":"person@example.com",
        "selfie": "selfie-base64",
        "document": {
            "type":"Passport",
            "country": "gbr",
            "front": "document-front-base64",
            "back": "document-back-base64"
    },
    "webhook": "https://example.com/webhook"
}' \
-H "Content-Type: application/json" \
-H "Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-BODY" \
-X POST https://oauth.sandbox.verifymycontent.com/api/v1/identity-verification/selfie-document-validation
Copy

Copied!

<?php
require(__DIR__ . "/vendor/autoload.php");

use \VerifyMyContent\IdentityCheck\VMC;

$vmc = new VMC(getenv('VMC_API_KEY'), getenv('VMC_API_SECRET'));
//$vmc->useSandbox();

$response = $vmc->createIdentityVerification([
    "customer" => [
        "id" => "YOUR-CUSTOMER-UNIQUE-ID",
        "email" => "person@example.com",
        "phone" => "+4412345678",
        "selfie" => "selfie-base64",
        "document" => [
            "type" => "Passport",
            "country" => "gbr",
            "front" => "document-front-base64",
            "back" => "document-back-base64"
        ]
    ],
    "webhook" => "https://example.com/webhook",
]);
Copy

Copied!

Response 201: (application/json)
{
  "id": "ABC-123-5678-ABC",
  "status": "pending",
  "customer": {
    "id": "YOUR-USER-ID",
    "email": "person@example.com"
  },
  "webhook": "https://example.com/webhook"
}
Copy

Copied!

Get Identity Verification

Authorization Header

Generate HMAC with: Request URI
Authorization: hmac YOUR-API-KEY:GENERATED-HMAC

Response parameters

id

Unique identifier generated by the VerifyMyContent API.

customer

Customer information

id

Customer's unique ID

email

Customer's email address

redirect_uri

The URL you should redirect the user to start the verification process.

webhook

The URL where we will post status updates on the moderation.

status

It represents the current status of the identity verification flow. It can be one of the following:

StatusDescription
pendingThe verification is pending and the user has not yet started the verification process.
startedThe verification has started and the user has been redirected to the verification page.
expiredThe verification has expired (5 days after creation) and the user has not completed the verification process.
failedThe verification has failed. The user attempted multiple times but didn't succeed.
approvedThe verification has been approved. The user has successfully completed the verification process.

reason

It represents the reason for an identity verification failure. It can be one of the following:

ReasonDescription
expired_idID Document expired.
id_scan_errorWe couldn't extract the required information from the person’s ID
idv_errorWe were unable to complete your request. Please try again.
invalid_idID Document not supported or invalid.
liveness_errorLiveness anti-spoofing check failed during selfie-video.
minorThis person is under 18.
partial_idA part of the person's ID was covered, so we couldn't extract the required information.
photo_mismatchWe couldn't match the device operator with the expected person.
poor_id_scan_errorWe couldn't extract the required information from the person’s ID due to poor photo quality.
potential_fraudWe detected a possible fraud attempt.
server_error_unavailableThe service is unavailable. Please try again.

Error responses

CodeDescription
400
{"message": "the request could not be understood by the server due to malformed syntax", "status_code": 400}
Copy

Copied!

401
{"message": "invalid authentication", "status_code": 401}
Copy

Copied!

401
{"message": "invalid client", "status_code": 401}
Copy

Copied!

422
{"message": "invalid parameters", "status_code": 422}
Copy

Copied!

500
{"message": "Internal Server Error","status_code": 500}
Copy

Copied!

API Call
GET /api/v1/identity-verification/{ID} HTTP/1.1
Content-Type: application/json
Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-URI

Copy

Copied!

curl -H "Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-URI" \
https://oauth.sandbox.verifymycontent.com/api/v1/identity-verification/{ID}
Copy

Copied!

<?php
require(__DIR__ . "/vendor/autoload.php");

use \VerifyMyContent\IdentityCheck\VMC;

$vmc = new VMC(getenv('VMC_API_KEY'), getenv('VMC_API_SECRET'));
//$vmc->useSandbox();

$response = $vmc->getIdentityVerification("ID");
Copy

Copied!

Response 200: (application/json)
{
  "id": "ABC-123-5678-ABC",
  "customer": {
    "id": "YOUR-USER-ID",
    "email": "person@example.com"
  },
  "redirect_uri": "https://.../v/ABC-123-5678-ABC",
  "webhook": "https://example.com/webhook",
  "status": "approved",
  "reason": ""
}
Copy

Copied!

Sample Webhook Notification

When the identity verification status changes, we will send a webhook notification to the url you provided when you created the identity verification.

Authorization Header

Generate HMAC with: Request Body
Authorization: hmac YOUR-API-KEY:GENERATED-HMAC

Request parameters

id

Unique identifier generated by the VerifyMyContent API.

customer_id

Customer identifier you provided while creating the identity verification.

status

It represents the current status of the identity verification flow. It can be one of the following:

StatusDescription
pendingThe verification is pending and the user has not yet started the verification process.
startedThe verification has started and the user has been redirected to the verification page.
expiredThe verification has expired (5 days after creation) and the user has not completed the verification process.
failedThe verification has failed. The user attempted multiple times but didn't succeed.
approvedThe verification has been approved. The user has successfully completed the verification process.

reason

It represents the reason for an identity verification failure. It can be one of the following:

ReasonDescription
expired_idID Document expired.
id_scan_errorWe couldn't extract the required information from the person’s ID
idv_errorWe were unable to complete your request. Please try again.
invalid_idID Document not supported or invalid.
liveness_errorLiveness anti-spoofing check failed during selfie-video.
minorThis person is under 18.
partial_idA part of the person's ID was covered, so we couldn't extract the required information.
photo_mismatchWe couldn't match the device operator with the expected person.
poor_id_scan_errorWe couldn't extract the required information from the person’s ID due to poor photo quality.
potential_fraudWe detected a possible fraud attempt.
server_error_unavailableThe service is unavailable. Please try again.

Error responses

CodeDescription
400
{"message": "the request could not be understood by the server due to malformed syntax", "status_code": 400}
Copy

Copied!

401
{"message": "invalid authentication", "status_code": 401}
Copy

Copied!

401
{"message": "invalid client", "status_code": 401}
Copy

Copied!

422
{"message": "invalid parameters", "status_code": 422}
Copy

Copied!

500
{"message": "Internal Server Error","status_code": 500}
Copy

Copied!

Webhook Call
POST /your-path HTTP/1.1
Host: https://your-domain.com
Content-Type: application/json
Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-BODY

{
    "id": "ABC-123-5678-ABC",
    "customer_id": "YOUR-USER-ID",
    "status": "approved",
    "reason": ""
}
Copy

Copied!

curl -d '{"id": "ABC-123-5678-ABC", "customer_id": "YOUR-USER-ID", "status": "approved", "reason": ""}' \
-H "Content-Type: application/json" \
-H "Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-BODY" \
-X POST https://your-domain.com/your-path
Copy

Copied!

Response 2xx

Allowed Redirect URLs

These changes will come into effect from 14:00 BST on 19th July 2024. URLs that are allowed to be redirected to after a successful verification.

Generating the HMAC header

To improve the security of the communication between your implementation and the VerifyMyContent API, we require you to generate a unique hexadecimal encoded SHA256 HMAC hash for each request, based on the input parameters.

The process of generating it depends on the language of your implementation.

Example
<?php

hash_hmac('sha256', $input, 'API_SECRET');
Copy

Copied!

import { HmacSHA256 } from 'crypto-js';

HmacSHA256(JSON.stringify(input), 'API_SECRET').toString()
Copy

Copied!

Get allowed URLs

Retrieve a list of allowed redirect URLs.

Authorization Header

Generate HMAC with: Request URI
Authorization: hmac YOUR-API-KEY:GENERATED-HMAC

Response parameters

body

The list of Allowed Redirect URLs.

Error responses

CodeDescription
401
{"message": "invalid authentication", "status_code": 401}
Copy

Copied!

500
{"message": "Internal Server Error","status_code": 500}
Copy

Copied!

API Call
GET /v1/business/allowed-redirects HTTP/1.1
Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-URI

Copy

Copied!

curl https://oauth.sandbox.verifymycontent.com/v1/business/allowed-redirects
    --header 'Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-URI'
    
Copy

Copied!

Response 200: (application/json)
{
  "body": [
    "https://your-website.com/redirect-1",
    "https://your-website.com/redirect-2"
  ]
}
Copy

Copied!

Add Allowed URLs

Add one or more allowed redirect URLs.

Authorization Header

Generate HMAC with: Request Body
Authorization: hmac YOUR-API-KEY:GENERATED-HMAC

Request parameters

body required

An array containing the allowed redirect URLs.

Error responses

CodeDescription
401
{"message": "invalid authentication", "status_code": 401}
Copy

Copied!

500
{"message": "Internal Server Error","status_code": 500}
Copy

Copied!

API Call
PATCH /v1/business/allowed-redirects HTTP/1.1
Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-BODY
[
    "https://your-website.com/redirect-1"
]

Copy

Copied!

curl -X PATCH https://oauth.sandbox.verifymycontent.com/v1/business/allowed-redirects
    --header 'Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-BODY'
    --data '[
    "https://your-website.com/redirect-1"
]'
    
Copy

Copied!

Response 204

Replace All Allowed URLs

Replace any existing allowed redirect URLs with the provided list.

Authorization Header

Generate HMAC with: Request Body
Authorization: hmac YOUR-API-KEY:GENERATED-HMAC

Request parameters

body required

An array containing the allowed redirect URLs.

Error responses

CodeDescription
401
{"message": "invalid authentication", "status_code": 401}
Copy

Copied!

500
{"message": "Internal Server Error","status_code": 500}
Copy

Copied!

API Call
PUT /v1/business/allowed-redirects HTTP/1.1
Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-BODY
[
    "https://your-website.com/new-redirect-url"
]

Copy

Copied!

curl -X PUT https://oauth.sandbox.verifymycontent.com/v1/business/allowed-redirects
    --header 'hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-BODY'
    --data '[
    "https://your-website.com/new-redirect-url"
]'
    
Copy

Copied!

Response 204

Delete Allowed URLs

Remove one or more allowed redirect URLs.

Authorization Header

Generate HMAC with: Request Body
Authorization: hmac YOUR-API-KEY:GENERATED-HMAC

Request parameters

body required

An array containing the allowed redirect URLs.

Error responses

CodeDescription
401
{"message": "invalid authentication", "status_code": 401}
Copy

Copied!

500
{"message": "Internal Server Error","status_code": 500}
Copy

Copied!

API Call
DELETE /v1/business/allowed-redirects HTTP/1.1
Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-BODY
[
    "https://your-website.com/redirect-1",
    "https://your-website.com/redirect-2"
]

Copy

Copied!

curl -X DELETE https://oauth.sandbox.verifymycontent.com/v1/business/allowed-redirects
    --header 'Authorization: hmac YOUR-API-KEY:GENERATE-HMAC-WITH-REQUEST-BODY'
    --data '[
    "https://your-website.com/redirect-1",
    "https://your-website.com/redirect-2"
]'
    
Copy

Copied!

Response 204