Introduction
The Vouched Verification SDK is a set of tools that you can use to submit, access and manage verification jobs. You can access Vouched Verification with our client libraries in a wide variety of popular programming languages.
Recognized IDs
- citizen - CA, PT
- commercial-license - US
- drivers-license - AR, AU, BM, BR, BY, CA, CO, CR, DE, ES, FR, GB, HK, IE, IL, IT, LU, PE, RO, SG, SK, TH, UA, US, VN, ZA
- drivers-license-permit - CA, GB, US
- employment - US
- global-entry - US
- handgun - CA, US
- health-insurance - CA
- identification - AE, AR, AU, BE, BR, CA, DE, ES, FR, ID, IN, IQ, MX, PE, SG, SK, TR, US, VN, ZA
- indian - CA
- nexus - US
- passport - AR, AU, BH, BM, BR, BY, CA, CM, CN, CO, DE, DK, FR, GB, GH, HK, HN, ID, IE, IL, IN, IQ, IT, JM, JP, KR, MO, MX, MY, NG, NZ, PE, PH, PK, PL, RU, SG, TH, UA, US, VN, ZA
- passport-card - US
- residence - BE, CA, GB, HK, PE, US, VN
- visa - US
Browser Client
In order to use Vouched SDK in a browser, your page must be served using HTTPS.
Without it, browser would not allow camera access.
Getting Started
- Obtain the private and public keys
Initialize the Vouched client
<head>
....
<script src="https://static.vouched.id/widget/vouched-2.0.0.js"></script>
<script type='text/javascript'>
(function() {
var vouched = Vouched({
appId: "<PUBLIC_KEY>",
crossDevice: true,
crossDeviceQRCode: true,
onSubmit: ({ stage, attempts, job }) => {
console.log('submit', { stage, attempts, job });
},
onCamera: ({ hasCamera, hasPermission }) => {
console.log('onCamera', { hasCamera, hasPermission });
},
onInit: ({token, job}) => {
// if crossDevice is true, a web token is created during initialization for
// session handoffs to other devices
console.log('initialization');
},
onDone: (job)=> {
// token used to query jobs
console.log("Scanning complete", { token: job.token });
// query the job with the token
fetch(`/yourapi/idv?job_token=${job.token}`);
// Simulate a mouse click:
window.location.href = "https://vouched.id/";
// Simulate an HTTP redirect:
window.location.replace("https://vouched.id/");
},
stepTitles: {
FrontId: 'Upload ID',
Face: 'Upload Headshot',
Done: 'Finished'
},
content: {
cameraButton: 'Take a Photo',
crossDeviceTitle: 'Identity Verification',
crossDeviceInstructions: 'We need to verify your identity. This requires government-issued photo ID as well as selfie. Please follow the instructions below to continue the verification process on your phone',
crossDeviceSuccess: 'Verification is complete, continue on your desktop',
review: 'Verification complete',
upperSuccess: 'Your photo uploads are complete!',
success: 'Please close this window to return your online visit.',
lowerSuccess: 'Thank you.',
upperIdInstructions:
'Before you start please have an approved Government ID (e.g. Passport / Driving License) in your hand.',
lowerIdInstructions: 'Please take a photo of your ID now',
upperFaceInstructions: 'Time to take a photo.',
lowerFaceInstructions: 'Please take a clear picture of your face, and make sure it does not include:',
upperFailure: 'Try Again',
verifyFail: 'Sorry for the inconvenience',
lowerFailure:
"The photo you shared can't be used for validation. Please take another picture, making sure the image of your face or your ID is clear."
},
theme: {
name: 'verbose',
font: 'Open Sans',
fontColor: '#413d3a',
iconLabelColor: '#413d3a',
bgColor: '#FFF',
baseColor: '#62ACDE',
navigationDisabledBackground: '#b3def1',
navigationDisabledText: '#a3d7ee',
logo: {
src: 'https://static.vouched.id/customers/blocktriangle/logo.jpg',
style: {
maxWidth: 150,
marginBottom: 30
}
},
navigationActiveText: '#413d3a',
iconColor: '#f6f5f3',
iconBackground: '#62ACDE' }
});
vouched.mount("#vouched-element");
})();
</script>
</head>
<body>
<div id='vouched-element' style="height: 100%"/>
</body>
Arguments
Parameter |
Type |
Required |
Description |
appId |
String |
* |
public key |
type |
String |
|
defaults to idv, idv - id with selfie verification, id - id only |
survey |
Bool |
|
Show an optional survey at the end |
token |
String |
|
Time limited session token used to restart a session |
crossDevice |
Bool |
|
Provides the ability to maintain the same session across multiple devices using the token retrieved from onInit. |
crossDeviceQRCode |
Bool |
|
If the user is on a desktop computer, a scannable QR Code enables the verification to continue on their mobile phone. Once completed, control is given back to the desktop. |
showUploadFirst |
Bool |
|
defaults to true, show the upload first instead of the camera |
face |
String |
|
defaults to camera, specify how user can submit their selfie. Valid values are both,camera,upload |
id |
String |
|
defaults to both, specify how user can submit their id. Valid values are both,camera,upload |
idLiveness |
String |
|
Only applicable for ID Card liveness check. Defaults to null/off. Add 'distance' to activate liveness check. idLiveness checks for user movements with ID Card |
liveness |
String |
|
Only applicable for selfie/headshot liveness check. Defaults to mouth, specify how Vouched should check for face liveness. Valid values are mouth,orientation, distance, and straight. The "mouth" liveness, checks for mouth movements, "orientation" checks the facial orientation, "distance" checks for user movements, and "straight" checks if the user is looking at the camera. |
properties |
[JobProperty] |
|
List of JobProperty - Arbitrary properties to add to the job, i.e. application ids |
content |
Object |
|
Content changes
Property |
Type |
Required |
Description |
success |
String |
|
successful submission |
review |
String |
|
the user disputes the results |
crossDeviceSuccess |
String |
|
|
crossDeviceInstructions |
String |
|
|
crossDeviceTitle |
String |
|
|
crossDeviceShowOff |
Bool |
|
Allows Handoff to continue on Desktop |
upperIdInstructions |
String |
|
Upper Instructions on ID Screen |
lowerIdInstructions |
String |
|
Lower Instructions on ID Screen |
upperFaceInstructions |
String |
|
Upper Instructions on Face Screen |
lowerFaceInstructions |
String |
|
Lower Instructions on Face Screen |
cameraButton |
String |
|
String text for camera button |
upperSuccess |
String |
|
Success message at the top |
lowerSuccess |
String |
|
Success message at the bottom |
upperFailure |
String |
|
Failure message at the top |
lowerFailure |
String |
|
Failure message at the bottom |
verifyPass |
String |
|
verification passed |
verifyFail |
String |
|
verification failed |
qrHandoffInstructions |
String |
|
Optional bottom Handoff Instructions |
startCompanyInstructions |
String |
|
Optional Start Screen Instruction |
carouselCompanyText |
Array of Strings |
|
Optional Carousel Instructions |
carouselCompanyImg |
Array of Strings |
|
Optional Carousel Image URLs |
|
verification |
Object |
|
optional verification properties
Property |
Type |
Required |
Description |
showResults |
Bool |
|
show the review results page. defaults to false if verification fields are included |
firstName |
String |
|
|
lastName |
String |
|
|
birthDate |
String |
|
|
email |
String |
|
Used for crosschecking identity |
phone |
String |
|
Used for crosschecking identity |
|
callbackURL |
String |
|
Upon the job’s completion, Vouched will POST the job results to the webhook. If the callbackURL is not given, Vouch will process the job in realtime. All callbackURL requests contain X-Signature in request headers. The X-Signature was created using HMAC-SHA1 using your private key as the key. To validate webhook response, perform the same signature procedure and compare if your generated signature and the sent signature match. Webhook contains the job here. |
stepTitles |
Object |
|
Property |
Type |
Required |
Description |
FrontId |
String |
* |
Front ID breadcrumb text |
Face |
String |
* |
Face breadcrumb text |
Done |
String |
* |
"Done verificating" breadcrumb text |
|
theme |
Object |
|
Property |
Type |
Required |
Description |
name |
String |
|
'classic' | 'verbose' | 'avant' |
iconLabelColor |
String |
|
Icon Label color |
bgColor |
String |
|
Background color |
logo |
String |
|
Logo |
navigationActiveText |
String |
|
|
iconColor |
String |
|
Icon color |
iconBackground |
String |
|
Icon Background |
baseColor |
String |
|
Main color |
fontColor |
String |
|
Font color |
font |
String |
|
Font Family |
navigationDisabledBackground |
String |
|
Background of disabled breadcrumbs |
navigationDisabledText |
String |
|
Text color on disabled breadcrumbs |
|
includeBarcode |
Bool |
|
Enable ID barcode capture and processing. Currently, only enabled for verbose and classic themes. |
onSubmit |
Function |
|
Javascript callback when a user submits a photo |
onCamera |
Function |
|
Javascript callback when camera initialization is complete |
onInit |
Function |
|
Javascript callback during initialization of the webapp |
onDone |
Function |
|
Javascript callback when a verification is complete |
Initialize the Vouched client for sending Vouched Now invites
<head>
....
<script src="https://static.vouched.id/widget/vouched-2.0.0.js"></script>
<script type='text/javascript'>
(function() {
var vouched = Vouched({
appId: "<PUBLIC_KEY>",
type: "invite"
});
vouched.mount("#vouched-element");
})();
</script>
</head>
<body>
<div id='vouched-element' style="height: 500px; width:800px;"/>
</body>
Arguments
Parameter |
Type |
Required |
Description |
appId |
String |
* |
public key |
type |
String |
* |
invite |
Unmount the Client
vouched.unmount('#vouched-element')
Layout considerations
When integrating Vouched component into your site design, consider
that Vouched component occupies 100% height of the parent container
(it has CSS rule height: 100% applied). That means that parent
container should be given height. Height should be given,
for example, by setting height value (height: 100%) on the
container or by using flex constraints (flex-grow: 1 in vertical
flex-box).
SDK Client API
Getting Started
- Obtain the FURY_AUTH token
- Obtain the private key
- Obtain the Client version, currently (0.0.6)
- Obtain the version number and FURY_AUTH token.
Update `requirements.txt` for:
--index-url https://${FURY_AUTH}@pypi.fury.io/woollylabs/
--extra-index-url https://pypi.org/simple/ private-package=0.0.1
vouched-client==<CLIENT_VERSION>
Install with pip:
FURY_AUTH=<FURY_AUTH_TOKEN> pip install --no-cache-dir -r ./requirements.txt
Some OSes does not allow the reading of environment variables in `requirements.txt`.
In this case, replace `${FURY_AUTH}` in `requirements.txt` with the actual token.
- Obtain the FURY_AUTH token
- Obtain the private key
lipvips is used to compress images. Installation instructions
for libvips found at https://github.com/lovell/sharp-libvips.
Obtain the Client version, currently (0.0.1-beta.15)
Update `package.json` for:
{
"dependencies": {
"@vouched/client": "<CLIENT_VERSION>"
}
}
Append the following to the project's `.npmrc`,
for details refer to https://docs.npmjs.com/files/npmrc:
@vouched:registry=https://npm.fury.io/woollylabs/
//npm.fury.io/woollylabs/:_authToken=${FURY_AUTH}
Run:
FURY_AUTH=<FURY_AUTH_TOKEN> npm install
Some OSes does not allow the reading of environment variables in `.npmrc`.
In this case, replace `${FURY_AUTH}` in `.npmrc` with the actual token.
go get github.com/vouched/vouched-golang
export PRIVATE_KEY=<your private Vouched key>
Include Maven dependency:
<groupId>com.vouched.sdk</groupId>
<artifactId>vouched-java</artifactId>
The header parameter `X-Api-Key` is required for all
GraphQL requests.
headers['X-Api-Key']=<private_key>
headers['Content-Type']='application/json'
The graphql endpoint is https://verify.vouched.id/graphql
The header parameter `X-Api-Key` is required for all
REST requests.
headers['X-Api-Key']=<private_key>
headers['Content-Type']='application/json'
The rest endpoint is https://verify.vouched.id/api
Create the Vouched client
const Client = require('@vouched/client').default;
const client = Client(private_key);
from vouched.api import Client
client = Client(private_key)
import (
client "github.com/vouched/vouched-golang"
)
c := client.New(private_key)
import com.vouched.sdk.Client;
import com.vouched.sdk.Config;
Client client = new Client(Config.get().getPrivateKey());
Arguments
Parameter |
Type |
Required |
Description |
key |
String |
* |
Private Key |
Returns
Parameter |
Type |
Required |
Description |
client |
Client |
* |
Vouched client |
Errors:
Update client key
secret_client_key = <SECRET>
data = client.update_secret_client_key(secret_client_key=secret_client_key)
params := map[string]interface{}{
"secretClientKey": "SECRET_KEY"}
if resp, err := c.UpdateSecretClientKey(params); err != nil {
fmt.Printf("Error: %+v\n", err)
} else {
fmt.Printf(" %+v\n", resp)
}
client.updateSecretClientKey("newKey");
const secretClientKey = <SECRET>
const data = client.updateSecretClientKey(secretClientKey);
mutation updateSecretClientKey($secretClientKey: String) {
updateSecretClientKey(secretClientKey: $secretClientKey) {
secretClientKey
}
}
POST api/account/secret-client-key
payload:
{
"secretClientKey": "your secret client key"
}
Arguments
Parameter |
Type |
Required |
Description |
secretClientKey |
String |
|
The secret key to be included in the header X-Api-Key of the webhook call. |
Returns
Parameter |
Type |
Required |
Description |
secretClientKey |
String |
|
The updated secretClientKey |
Errors:
- AuthenticationError
- ConnectionError
- InvalidRequestError
- UnknownSystemError
Submit a verification job
var idPhotoBase64 = client.ReadImage("./tests/oh-license.jpeg")
var userPhotoBase64 = client.ReadImage("./tests/oh-selfie.jpeg")
params := map[string]interface{}{
"userPhoto": userPhotoBase64,
"idPhoto": idPhotoBase64,
"callbackURL": "https://www.google.com",
"type": "id-verification",
"firstName": "Janice",
"dob": "06/22/1990", "lastName": "Way"}
if resp, err := c.Submit(params); err != nil {
fmt.Printf("Error: %+v\n", err)
} else {
fmt.Printf("Job: %+v\n", resp)
}
from vouched.utils import image_to_base64
user_photo_base64 = image_to_base64('/opt/app/tests/data/selfie.png')
id_photo_base64 = image_to_base64('/opt/app/tests/data/id.jpg')
job = client.submit(
user_photo=user_photo_base64,
id_photo=id_photo_base64,
properties=[
dict(name='internal_id',value='iid'),
dict(name='internal_username',value='bob'),
],
type='id-verification',
first_name='Janice',
dob='06/22/1990',
last_name='Way'
)
const utils = require('@vouched/client').utils;
const userPhotoBase64 = await utils.imageToBase64(
'/opt/app/tests/data/selfie.png'
);
const idPhotoBase64 = await utils.imageToBase64(
'/opt/app/tests/data/id.jpg'
);
const job = await client.submit({
userPhoto:userPhotoBase64,
idPhoto:idPhotoBase64,
type:'id-verification',
firstName:'Janice',
properties:[
{name:'internal_id',value:'iid'},
{name:'internal_username',value:'bob'}
],
dob:'06/22/1990',
lastName:'Way'
})
# X-Signature Algorithm
return crypto
.createHmac('sha1', private_key)
.update(Buffer.from(data, 'utf-8'))
.digest('base64');
String img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA" +
"AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO" +
"9TXL0Y4OHwAAAABJRU5ErkJggg==";
JobRequest jobRequest = new JobRequest();
jobRequest.parameters.userPhoto = img;
jobRequest.parameters.idPhoto = img;
jobRequest.parameters.firstName = "Thor Thunder";
jobRequest.parameters.lastName = "odinson";
jobRequest.parameters.dob = "06/22/1970";
Job job = client.submitJob(jobRequest);
fragment Job on Job {
id
status
request {
type
callbackURL
parameters {
idPhoto
userPhoto
firstName
lastName
dob
}
properties{
name
value
}
}
result {
success
successWithSuggestion
type
country
state
id
firstName
lastName
gender
expireDate
class
endorsements
motorcycle
birthDate
confidences {
id
selfie
idMatch
faceMatch
}
}
errors {
type
message
suggestion
}
submitted
}
input JobParams {
userPhoto: String
idPhoto: String
id: String
firstName: String
lastName: String
dob: String
}
input JobPropertyParam {
name: String!
value: String!
}
mutation submitJob(
$type: String!
$callbackURL: String
$pr: String
$params: JobParams
$properties: [JobPropertyParam]
) {
submitJob(
type: $type
callbackURL: $callbackURL
params: $params
properties: $properties
) {
...Job
}
}
POST api/jobs
payload:
{
"type": "id-verification",
"callbackURL": "https://yourwebsite.com",
"properties": [{
"name": "propertiesName",
"value": "propertiesValue"
}],
"params": {
"userPhoto": "data:image/png;base64,iVBRw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",
"idPhoto": "data:image/png;base64,iVBRw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
}
}
Arguments
Parameter |
Type |
Required |
Description |
type |
String |
* |
Type of AI job ("id-verification") |
accountGroupSid |
ID |
|
The account group ID |
callbackURL |
String |
|
Upon the job's completion, Vouched will POST the job results to the webhook. If the callbackURL is not given, Vouch will process the job in realtime.
All callbackURL requests contain X-Signature in request headers. The X-Signature was created using HMAC-SHA1 using your private key as the key. To validate webhook response, perform the same signature procedure and compare if your generated signature and the sent signature match. Webhook contains the job here.
|
properties |
[JobProperty] |
|
List of JobProperty - Arbitrary properties to add to the job, i.e. application ids |
parameters |
Object |
* |
Object for verification
Property |
Type |
Required |
Description |
userPhoto |
String, Buffer |
|
The user's id comparison photo. Supported types include image/png, image/jpeg |
idPhoto |
String, Buffer |
* |
The user's official identification photo. Supported types include image/png, image/jpeg |
firstName |
String |
|
The user's first name. |
lastName |
String |
|
The user's last name. |
dob |
String |
|
Date in the format MM/DD/YYYY. |
email |
String |
|
Used for crosschecking identity |
phone |
String |
|
Used for crosschecking identity |
enableCrossCheck |
Boolean |
|
Used to enable/disable crosscheck |
enableDarkWeb |
Boolean |
|
Used to enable/disable darkweb |
enableIPAddress |
Boolean |
|
Used to enable/disable ip address search |
enablePhysicalAddress |
Boolean |
|
Used to enable/disable address search |
enableAAMVA |
Boolean |
|
Used to enable/disable aamva search |
|
Returns
Parameter |
Type |
Required |
Description |
job |
Job |
* |
The newly created job. |
Errors:
- AuthenticationError
- ConnectionError
- InvalidRequestError
- UnknownSystemError
Remove a job
job = client.remove_job(
id='USkjk33'
)
if resp, err := c.RemoveJob("ZicnypPn"); err != nil {
fmt.Printf("Error: %+v\n", err)
} else {
fmt.Printf(" %+v\n", resp)
}
Job job = client.removeJob("someJobId");
const job = await client.remove({ id: 'ofm1k9xF' })
fragment Job on Job {
.... Refer to submitJob
}
mutation removeJob(
$id: ID!
) {
removeJob(
id: $id
) {
...Job
}
}
DELETE api/jobs/:id
Arguments
Parameter |
Type |
Required |
Description |
Returns
Parameter |
Type |
Required |
Description |
job |
Job |
* |
The removed job. |
Errors:
- AuthenticationError
- ConnectionError
- InvalidRequestError
- UnknownSystemError
Download a job
GET api/jobs/:id/download?confidences=true
Arguments
Parameter |
Type |
Required |
Description |
id |
ID |
|
The ID of the job to generate a PDF of |
confidences |
Boolean |
|
Include Confidence Scores in the PDF |
Returns
Parameter |
Type |
Required |
Description |
id |
ID |
|
The ID of the job to generate a PDF of |
confidences |
Boolean |
|
Include Confidence Scores in the PDF |
pdf |
String |
|
PDF of the job in base64 |
Errors:
- AuthenticationError
- ConnectionError
- InvalidRequestError
- UnknownSystemError
Provide results on jobs
const jobs = client.jobs({
page:1,
pageSize:2,
type:'id-verification',
status:'active',
token:<TOKEN_FROM_WEB_CLIENT>,
sortBy:'submitted',
sortOrder:'desc',
withPhotos:true,
fromDate:'2017-01-24T04:44:00+00:00',
toDate:'2020-12-24T04:44:00+00:00'
})
params := map[string]interface{}{
"page": 1,
"sortBy": "submitted",
"sortOrder": "desc",
"from": "1990-12-24T04:44:00+00:00",
"to": "2020-12-24T04:44:00+00:00",
"type": "id-verification",
"token": "SESSION_TOKEN",
"status": "active",
"withPhotos": false,
"pageSize": 2,
}
if resp, err := c.Jobs(params); err != nil {
fmt.Printf("Error: %+v\n", err)
} else {
fmt.Printf("Jobs: %+v\n", resp)
}
JobsFilter f = new JobsFilter();
f.id = "someJobId";
Jobs jobs = client.getJobs(f);
jobs = client.jobs(
page=1,
page_size=2,
type='id-verification',
token=<TOKEN_FROM_WEB_CLIENT>,
status='active',
sort_by='date',
sort_order='desc',
with_photos=True,
from_date='2017-01-24T04:44:00+00:00',
to_date='2020-12-24T04:44:00+00:00'
)
query jobs(
$id: ID
$token: String
$ids: [ID]
$type: String
$status: String
$to: String
$from: String
$withPhotos: Boolean
$sortOrder: String
$sortBy: String
$page: Int
$pageSize: Int
) {
jobs(
withPhotos: $withPhotos
id: $id
ids: $ids
status: $status
token: $token
type: $type
to: $to
from: $from
sortOrder: $sortOrder
sortBy: $sortBy
page: $page
pageSize: $pageSize
) {
total
totalPages
pageSize
page
items {
...Job
}
}
}
GET api/jobs?ids=["1","2"]&type=id-verification&page=1&pageSize=101&sortBy=submitted&sortOrder=asc&status=completed&from=2011-10-05T14:48:00.000Z&to=2019-10-05T14:48:00.000Z&withPhotos=true
or
GET api/jobs?id=1
Arguments:
Parameter |
Type |
Required |
Description |
id |
ID |
|
Filter by job ID. |
type |
String |
|
Type of job ("id-verification") |
ids |
[ID] |
|
Filter by a list of job IDs. |
token |
String |
|
The time limited session token from the web client. |
page |
Int |
|
Paginate list by page where the page starts at 1, defaults to 1. |
pageSize |
Int |
|
The number of items for a page, max 1000, defaults to 100 |
sortBy |
String |
|
Sort the list from ("submitted","updated", "status"). |
sortOrder |
String |
|
Order the sort from ("asc", "desc"). |
status |
String |
|
Filter by status from ("active","completed") |
from |
String |
|
Filter by submitted/updatedAt from ISO8601 date. |
to |
String |
|
Filter by submitted/updatedAt to ISO8601 date. |
toFrom |
String |
|
Defaults to submitted. Filter to and from by ("submitted","updatedAt") |
withPhotos |
Boolean |
|
Defaults to False. Job will contain idPhoto and userPhoto photos. Max pageSize will be 100. |
withPhotoUrls |
Boolean |
|
Defaults to False. Job will contain idPhotoUrl and userPhotoUrl signed. Max pageSize will be 100. |
Returns
Parameter |
Type |
Required |
Description |
jobs |
[Job] |
* |
List of paginated jobs |
totalPages |
Int |
* |
Total number of pages of jobs. |
pageSize |
Int |
* |
The requested page size. |
page |
Int |
* |
The requested page. |
total |
Int |
* |
Total number of filtered jobs. |
Errors:
- AuthenticationError
- ConnectionError
- InvalidRequestError
- UnknownSystemError
Update job with verified reviews
PUT api/jobs/:id/review
payload:
{
"idValid": true,
"selfieValid": true,
"faceMatch": null,
"nameMatch": null,
"birthDateMatch": null,
"firstName": "John",
"lastName": "Bao",
"docId": null,
"idType": null,
"birthDate": null,
"expireDate": null,
"state": null,
"country": null,
}
Arguments:
Parameter |
Type |
Required |
Description |
idValid |
Boolean |
|
Is the id valid. |
selfieValid |
Boolean |
|
Is the selfie valid. |
faceMatch |
Boolean |
|
Is the face match valid. |
birthDateMatch |
Boolean |
|
Does the birthdate match. |
nameMatch |
Boolean |
|
Does the name match. |
firstName |
String |
|
The first name. |
lastName |
String |
|
The last name. |
docId |
String |
|
The document id number. |
idType |
String |
|
The id type from ('passport', 'commercial-license', 'global-entry', 'identification', 'residence', 'employment', 'drivers-license', 'drivers-license-permit'). |
state |
String |
|
The state/province/territory ISO 3166-2 code |
country |
String |
|
The country ISO 3166-1 code. |
Returns
Parameter |
Type |
Required |
Description |
job |
Job |
* |
|
Errors:
- AuthenticationError
- ConnectionError
- InvalidRequestError
- UnknownSystemError
POST api/identity/authenticate
Arguments:
Parameter |
Type |
Required |
Description |
id |
String |
* |
The job id of the verified selfie to perform a face match |
userPhoto |
String |
* |
The user photo to perform a face match |
Returns
Parameter |
Type |
Required |
Description |
match |
Float |
* |
0-1, where 0.90 is a positive match |
Errors:
- AuthenticationError
- ConnectionError
- InvalidRequestError
- UnknownSystemError
Get a list of supported id documents
query identityDocuments
{
identityDocuments
{
documents: {
...IdentityDocument
}
}
}
`;
GET api/identity/documents
Arguments:
Returns
Parameter |
Type |
Required |
Description |
documents |
[IdentityDocuments] |
* |
List of identity documents. |
Errors:
- AuthenticationError
- ConnectionError
- InvalidRequestError
- UnknownSystemError
Send a Vouched Now invite
mutation sendInvite(
$firstName: String
$lastName: String
$phone: String
$email: String
$contact: String
) {
sendInvite(
firstName: $firstName
lastName: $lastName
phone: $phone
email: $email
contact: $contact
) {
...Invite
}
}
`;
POST api/invites
payload:
{
"email": "test@test.com",
"firstName": "John",
"lastName": "Bao",
"phone": "0004007007",
"contact": "email"
}
Arguments:
Parameter |
Type |
Required |
Description |
type |
String |
|
defaults to idv, idv - id with selfie verification, id - id only |
email |
String |
|
Email address to send to |
phone |
String |
|
10 digit phone number, US +1 and UK +44 numbers only |
contact |
String |
|
Contact method to use(email,phone) |
firstName |
String |
|
First Name |
lastName |
String |
|
Last Name |
templateEmail |
String |
|
The template to use for emails with variables $FIRST_NAME $LINK |
titleEmail |
String |
|
The title of the email |
templateText |
String |
|
The template to use for text messages with variables $FIRST_NAME $LINK |
send |
Boolean |
|
Defaults to true, send an message via the contact method |
internalId |
ID |
|
Application Internal Id |
Returns
Parameter |
Type |
Required |
Description |
invite |
Invite |
* |
The newly created invite. |
Errors:
- AuthenticationError
- ConnectionError
- InvalidRequestError
- UnknownSystemError
Submit an identity crosscheck
Provides a crosscheck of matching identities based on provided name, email, phone number, address, and IP address. The crosscheck is performed across a network of enriched data sources.
POST api/identity/crosscheck
payload:
{
firstName: 'John',
lastName: 'Bao',
email: 'baoman@mail.com',
phone: '917-343-3433',
ipAddress: '73.19.102.110',
address: {
streetAddress: '1 Main St',
city: 'Seattle',
postalCode: '98031',
state: 'WA',
country: 'US'
}
}
Arguments:
Parameter |
Type |
Required |
Description |
email |
String |
|
Email address |
phone |
String |
|
Phone number |
firstName |
String |
* |
First Name |
lastName |
String |
* |
Last Name |
ipAddress |
String |
|
IP Address |
address |
CrossCheckAddress |
|
Address |
Returns
Parameter |
Type |
Required |
Description |
id |
ID |
* |
ID of the request |
request |
CrossCheckRequest |
* |
|
result |
CrossCheckResult |
* |
|
Errors:
- AuthenticationError
- ConnectionError
- InvalidRequestError
- UnknownSystemError
Submit an aamva standalone job
Creates a standalone aamva job based on provided user details. Licensenumber, country, state are mandatory fields.
POST api/identity/aamva
payload:
{
"licenseNumber": "520AS4197",
"country": "US",
"lastName": "Testesraet",
"idType": "drivers-license",
"state": "IA",
"dob": "05/29/1988",
"issueDate": "05/29/1988",
"expirationDate":"05/29/1988"
}
Arguments:
Parameter |
Type |
Required |
Description |
licenseNumber |
String |
* |
License Id number |
country |
String |
* |
Country |
lastName |
String |
* |
Last Name |
idType |
String |
* |
Type of id, allowed drivers-license for the moment |
state |
String |
* |
State |
dob |
String |
|
Date of Birth |
issueDate |
String |
|
License Issue Date |
expirationDate |
String |
|
License Expiration Date |
Returns
Parameter |
Type |
Required |
Description |
id |
ID |
* |
Job Id |
request |
AamvaIndentityRequest |
* |
|
result |
AamvaIndentityResult |
* |
|
Errors:
- AuthenticationError
- ConnectionError
- InvalidRequestError
- UnknownSystemError
Resend a Vouched Now invites
mutation resendInvite($id: ID!) {
resendInvite(id: $id) {
...Invite
}
}
`;
POST api/invites/UUIKJw4kj/resend
Arguments:
Parameter |
Type |
Required |
Description |
id |
ID |
* |
The invite id to resend. |
Returns
Parameter |
Type |
Required |
Description |
invite |
[Invite] |
* |
The resent invite. |
Errors:
- AuthenticationError
- ConnectionError
- InvalidRequestError
- UnknownSystemError
List of Vouched Now invites
query smsInvites($id: ID, $page: Int, $pageSize: Int) {
smsInvites(id: $id, page: $page, pageSize: $pageSize) {
total
totalPages
page
items {
...Invite
}
}
}
`;
GET api/invites?pageSize=10&page=1
Arguments:
Parameter |
Type |
Required |
Description |
id |
ID |
|
The invite id |
page |
Int |
|
Paginate list by page where the page starts at 1, defaults to 1. |
pageSize |
Int |
|
The number of items for a page, defaults to 50 |
Returns
Parameter |
Type |
Required |
Description |
invites |
[Invite] |
* |
List of paginated invites. |
totalPages |
Int |
* |
Total number of pages. |
pageSize |
Int |
* |
The requested page size. |
page |
Int |
* |
The requested page. |
total |
Int |
* |
Total number of filtered jobs. |
Errors:
- AuthenticationError
- ConnectionError
- InvalidRequestError
- UnknownSystemError
Types
Address
Property |
Type |
Required |
Description |
unit |
String |
|
unit number |
streetNumber |
String |
|
|
street |
String |
|
|
city |
String |
|
|
state |
String |
|
ISO 3166-2 state/province/territory code |
postalCode |
String |
|
|
postalCodeSuffix |
string |
|
|
country |
String |
|
ISO 3166-1 country code |
Confidences
Property |
Type |
Description |
id |
Float |
Confidence score for an id photo, 0-1.0 |
idQuality |
Float |
Confidence score for image quality of the id, 0-1.0 |
idGlareQuality |
Float |
Confidence score for image quality of the id, 0-1.0 |
selfie |
Float |
Confidence score for a selfie photo, 0-1.0 |
idMatch |
Float |
Confidence score for matching data on the id, 0-1.0 |
idExpired |
Float |
Confidence score for id expiration date, 0-1.0 |
faceMatch |
Float |
Confidence score for matching faces, 0-1.0 |
birthDateMatch |
Float |
Confidence score for matching birth dates, 0-1.0 |
nameMatch |
Float |
Confidence score for matching names, 0-1.0 |
selfieSunglasses |
Float |
Confidence score for selfie with sunglasses, 0-1.0 |
selfieEyeglasses |
Float |
Confidence score for selfie with eyeglasses, 0-1.0 |
CrossCheckAddress
Property |
Type |
Required |
Description |
unit |
String |
|
|
streetAddress |
String |
* |
|
city |
String |
* |
|
state |
String |
* |
state/province/territory ISO 3166-2 code |
postalCode |
String |
* |
|
country |
String |
* |
ISO 3166-1 country code |
CrossCheckAgeRange
Parameter |
Type |
Required |
Description |
from |
Int |
* |
From age |
to |
Int |
* |
To age |
CrossCheckConfidences
Parameter |
Type |
Required |
Description |
identity |
Float |
* |
Overall identity risk confidence, 0-1.0, low: >= 0.50, medium: > 0.2, high: > 0.1, critical: <= 0.1 |
activity |
Float |
* |
Overall activity risk confidence, high: <= 0.1 |
CrossCheckIdentityAddress
Parameter |
Type |
Required |
Description |
errors |
[Error] |
* |
|
warnings |
[Error] |
* |
|
isValid |
Boolean |
* |
The address is a verified address |
isMatch |
Boolean |
* |
The name on the address matches the user |
name |
String |
|
The recorded name of the identity |
ageRange |
CrossCheckAgeRange |
|
The age range of the name on the address |
isForwarder |
Boolean |
|
The address is a freight forwarding address |
isCommercial |
Boolean |
|
The address is associated with a business |
type |
String |
|
'incomplete-address', 'po-box', 'multi-unit', 'single-unit', 'commercial-mail-drop', 'po-box-forward' ,'other' |
CrossCheckIdentityEmail
Parameter |
Type |
Required |
Description |
errors |
[Error] |
* |
|
warnings |
[Error] |
* |
|
isValid |
Boolean |
* |
The email is a valid email address |
isMatch |
Boolean |
* |
The name associated with the email address matches the user |
name |
String |
|
The recorded name of the identity |
ageRange |
CrossCheckAgeRange |
|
The age range of the name on the email address |
isAutoGenerated |
Boolean |
|
The email address could be autogenerated |
isDisposable |
Boolean |
|
The email address is disposable |
daysFirstSeen |
Int |
|
The number of days since the email address was first seen in the data network |
CrossCheckIdentityGender
Parameter |
Type |
Required |
Description |
man |
number |
|
frequency with a range 0-100 of the first name in men with a mininum found frequency of 0.0001 |
woman |
number |
|
frequency with a range 0-100 of the first name in women with a mininum found frequency of 0.0001 |
CrossCheckIdentityPhone
Parameter |
Type |
Required |
Description |
errors |
[Error] |
* |
|
warnings |
[Error] |
* |
|
isValid |
Boolean |
* |
The phone number is valid |
isMatch |
Boolean |
* |
The name associated with the phone number matches the user |
name |
String |
|
The recorded name of the identity |
type |
String |
|
'fixed-voip', 'landline', 'mobile','non-fixed-voip', 'premium-rate', 'tollfree', 'voicemail', 'other' |
ageRange |
CrossCheckAgeRange |
|
The age range of the name on the phone number |
carrier |
String |
|
The phone provider |
isPrepaid |
Boolean |
|
The phone number is on a prepaid plan |
isDisposable |
Boolean |
|
The phone number is disposable |
isCommercial |
Boolean |
|
The phone number is associated with a business |
CrossCheckDarkWeb
Parameter |
Type |
Required |
Description |
criminalCount |
number |
|
Count of instances email was observed to have been used in DarkWeb data collections |
criminalLastSeen |
String |
|
Last observed time email was observed to have been used in DarkWeb collections. |
criminalMaxScore |
number |
|
Score of the top ranking DarkWeb source associated with the email |
CrossCheckRequest
Parameter |
Type |
Required |
Description |
email |
String |
|
Email address |
phone |
String |
|
Phone number |
firstName |
String |
* |
First Name |
lastName |
String |
* |
Last Name |
darkWeb |
CrossCheckDarkWeb |
* |
Dark Web |
address |
CrossCheckAddress |
|
|
ipAddress |
String |
|
|
CrossCheckResult
Parameter |
Type |
Required |
Description |
address |
CrossCheckIdentityAddress |
|
|
email |
CrossCheckIdentityEmail |
|
|
phone |
CrossCheckIdentityPhone |
|
|
gender |
CrossCheckIdentityGender |
|
|
ageRange |
CrossCheckAgeRange |
|
|
ipAddress |
IPAddress |
|
|
darkWeb |
CrossCheckDarkWeb |
|
|
confidences |
CrossCheckConfidences |
* |
|
Aamva
Parameter |
Type |
Required |
Description |
enabled |
boolean |
|
A boolean determining whether or not AAMVA is enabled for the account this job ran under |
hasErrors |
boolean |
|
Representing if AAMVA returned any matching errors |
hasWarnings |
boolean |
|
Representing if there are any warnings on the AAMVA request |
createdAt |
ISO8601 date |
|
Representing when the AAMVA request was created |
updatedAt |
ISO8601 date |
|
Representing the last time the AAMVA verification data was updated |
status |
string |
|
Representing the state of the AAMVA verification request. Potential statuses are: Pending, In Progress, Error, Not Applicable, Completed |
statusMessage |
string |
|
An extra message giving information about the status of the verification request |
completedAt |
ISO8601 date |
|
Representing the time the verification request completed |
AamvaVerificationRequest
Parameter |
Type |
Required |
Description |
status |
string |
|
Representing the state of the AAMVA verification request |
licenseId |
string |
|
The document ID that was sent to AAMVA for verification |
requestData |
JSON |
|
The JSON data sent over to AAMVA for verification |
responseData |
JSON |
|
The JSON data returned from AAMVA for verification |
warnings |
JSON |
|
Warnings that were generated during the verification process |
errors |
JSON |
|
Errors that were generated during the verification process |
createdAt |
ISO8601 date |
|
Representing the time the verification request completed |
GenderDistribution
Parameter |
Type |
Required |
Description |
man |
number |
|
frequency with a range 0-100 of the first name in men with a mininum found frequency of 0.0001 |
woman |
number |
|
frequency with a range 0-100 of the first name in women with a mininum found frequency of 0.0001 |
Gender
Parameter |
Type |
Required |
Description |
gender |
String |
|
"man" or "woman" based on extracted fields from the ID |
genderDistribution |
GenderDistribution |
|
frequency with a range 0-100 of the first name in men and women with a mininum found frequency of 0.0001 |
Dimension
Parameter |
Type |
Required |
Description |
width |
Int |
* |
|
height |
Int |
* |
|
Error
Property |
Type |
Required |
Description |
type |
String |
* |
- InvalidRequestError - The request is invalid.
- FaceMatchError - Face match felled below the threshold
- NameMatchError - Name match felled below the threshold
- BirthDateMatchError - Birth date match felled below the threshold
- ExpiredIdError - The ID’s expiration date has passed
- InvalidIdPhotoError - The ID is invalid
- InvalidUserPhotoError - The user photo (selfie) is invalid
- UNAUTHENTICATED/AuthenticationError - The request could not be authenticated
- ConnectionError - A connection error occurred while communicating to the Vouched service
- UnknownSystemError - A unknown system error occurred
- InvalidIdError - The ID is invalid
|
message |
String |
* |
Details on the occurring error. |
warning |
Boolean |
* |
Is this a warning? |
suggestion |
String |
|
A suggestion for matching name, John Smith, Jon Smith. |
errors |
[Error] |
|
InvalidRequestError contains a sub list of errors or warnings |
Location
Property |
Type |
Required |
Description |
latitude |
Float |
|
|
longitude |
Float |
|
|
Invite
Property |
Type |
Required |
Description |
id |
ID |
* |
Invite id. |
qrCode |
String |
* |
Base64 Data Url image for the invite link |
phone |
String |
|
Phone number with the country code |
email |
String |
|
Email address |
send |
Boolean |
* |
Defaults to true, send an message via the contact method |
url |
String |
* |
The verification link sent to the user |
contact |
String |
|
The contact used to send the invite |
jobId |
ID |
* |
The associated job id if the status is active or completed |
firstName |
String |
|
The contact's first name |
lastName |
String |
|
The contact's last name |
updatedAt |
String |
* |
ISO8601 date |
createdAt |
String |
* |
ISO8601 date |
status |
String |
* |
- accepted
- queued
- sending
- sent
- failed
- delivered
- undelivered
- receiving
- received
- read (WhatsApp only)
- completed
- active
|
IdentityDocument
Property |
Type |
Required |
Description |
type |
String |
* |
The id type. |
country |
String |
* |
Issuing country in ISO 3166-1 2 code |
state |
String |
|
Issuing state/province/territory in ISO 3166-2 2 code |
properties |
[String] |
* |
Recognized extraction properties |
IPAddress
Property |
Type |
Required |
Description |
city |
String |
|
Originating City |
state |
String |
|
Originating State/Province/Territory in ISO 3166-2 code |
country |
String |
|
Originating Country in ISO 3166-1 2 code |
postalCode |
String |
|
postal code |
location |
Location |
|
|
isp |
String |
|
Name of the isp |
organization |
String |
|
Name of the organization associated with the IP address |
isAnonymous |
Boolean |
|
Is the IP address part of an anonymous network |
isAnonymousVpn |
Boolean |
|
Is the IP address part of an anonymous vpn network |
isAnonymousHosting |
Boolean |
|
Is the IP address part of an anonymous hosting network |
userType |
String |
|
-
business - the IP address belongs to a business ISP or a corporation.
-
cafe - an internet cafe or similar location.
-
cellular - the IP address is used to route traffic from devices connected to a cellular network.
-
college - the IP address belongs to a college, university, or similar institute of
higher education.
-
content_delivery_network - belongs to a CDN (Akamai, Cloudflare, Google Cloud, etc.).
-
dialup - belongs to a dial-up ISP.
-
government - the IP address belongs to a government organization.
-
hosting -- a commercial hosting provider.
-
library - used in a library.
-
military - used on a military base or similar.
-
residential - the IP address belongs to a residential ISP or is otherwise primarily used by home users.
-
router - a backbone or infrastructure router.
-
school - primary or secondary education.
-
search_engine_spider - a crawler or indexer for a search engine (Google, Bing, Yahoo, etc.).
-
traveler - the IP address is used at an airport, hotel, or similar location where the users are generally traveling from their primary residence.
|
Job
Property |
Type |
Required |
Description |
id |
ID |
* |
Job ID |
completed |
Boolean |
* |
Job is completed |
status |
String |
* |
Job status from ("active","removed","completed") |
submitted |
String |
* |
The submitted date ISO8601 date |
updatedAt |
String |
* |
The last updated date ISO8601 date |
reviewAt |
String |
|
The last updated review ISO8601 date |
reviewSuccess |
Boolean |
|
Review indicates the verification pass or failed |
review |
Object |
|
Review override object |
surveyPoll |
Int |
|
User survey rating 1-5 |
surveyMessage |
String |
|
User survey message |
surveyAt |
String |
|
ISO8601 date |
request |
Object |
* |
Object for 'id-verification'.
Property |
Type |
Required |
Description |
type |
String |
* |
Job type |
callbackURL |
String |
|
POST enabled webhook |
requestInfo |
RequestInfo |
|
User request information |
parameters |
JobParameters |
* |
Object for 'id-verification' |
|
result |
Object |
* |
Object For 'id-verification'
Property |
Type |
Required |
Description |
success |
Boolean |
* |
Did the id verification completed successfully with no errors? The verification could have warnings. |
warnings |
Boolean |
* |
Does the completed verification contain warnings. |
successWithSuggestion |
Boolean |
* |
Deprecated: Functionally this property is the same as success. The verification passed successfully with name suggested errors. |
gender |
Gender |
* |
Displays the gender stats for the Job |
type |
String |
|
The id type |
state |
String |
|
The issuing state/province/territory of the id as a ISO 3166-2 code |
country |
String |
|
The issuing country of the id |
id |
String |
|
The verified id number of the id |
expireDate |
String |
|
The verified expired date in the format MM/DD/YYYY. |
issueDate |
String |
|
The verified issued date in the format MM/DD/YYYY. |
idAddress |
Address |
|
The ID address |
crosscheck |
CrossCheckResult |
|
The crosscheck result |
aamva |
Aamva |
|
The aamva result |
ipAddress |
IPAddress |
|
The IP address |
class |
String |
|
The ID class value |
endorsements |
String |
|
The id endorsements |
motorcycle |
String |
|
The motorcycle property |
birthDate |
String |
|
The verified date in the format MM/DD/YYYY. |
firstName |
String |
|
The user's verified first name. |
middleName |
String |
|
The user's verified middle name. |
lastName |
String |
|
The user's verified last name. |
confidences |
Confidences |
|
Confidence scores |
|
errors |
[Error] |
|
List of errors for unsuccessful completed jobs. |
RequestInfo
Property |
Type |
Required |
Description |
ipaddress |
String |
|
The user's IP address. |
useragent |
String |
|
The user's browser agent. |
referer |
String |
|
The refering browser location. |
JobProperty
Property |
Type |
Required |
Description |
name |
String |
* |
Property name |
value |
String |
* |
Property value |
JobParameters
Property |
Type |
Required |
Description |
idPhoto |
String |
|
The user's official identification photo in base64. |
idPhotoUrl |
String |
|
The user's id photo as a timed (15 min) signed url |
idPhotoDetect |
String |
|
A cropped aligned version of the id photo in base64 |
idPhotoDetectUrl |
String |
|
A cropped aligned version of the id photo as timed (15 min) signed url |
idPhotoDetectDimensions |
Dimension |
|
|
idPhotoDimensions |
Dimension |
|
|
userPhoto |
String |
|
The user's selfie photo in base64. |
userPhotoUrl |
String |
|
The user's selfie photo as a timed (15 min) signed url |
userPhotoDetect |
String |
|
A cropped aligned version of the selfie photo in base64 |
userPhotoDetectUrl |
String |
|
A cropped aligned version of the selfie photo as timed (15 min) signed url |
userPhotoDetectDimensions |
Dimension |
|
|
userPhotoDimensions |
Dimension |
|
|
email |
String |
|
Used for crosschecking identity |
phone |
String |
|
Used for crosschecking identity |
dob |
String |
|
Date in the format MM/DD/YYYY. |
firstName |
String |
|
The user's first name. |
lastName |
String |
|
The user's last name. |