Developers
A REST API that returns reasons, not just verdicts
Create a verification, collect what you need from the customer, and receive a result whose every field tells you where it came from. Asynchronous outcomes arrive by webhook.
The verification lifecycle
Create
One POST creates the case and returns a hosted flow URL, or a session token for the embedded SDK.
Collect
The customer completes document capture and the selfie. You can also skip collection entirely for data-only checks.
Resolve
Checks run in parallel. The case moves to completed with a decision of approved, declined or review.
Monitor
Once completed, the subject is enrolled in ongoing screening. New matches arrive as webhook events for as long as monitoring stays enabled.
Examples
Create a person verification
POST /v1/verifications
Authorization: Bearer sk_live_...
Content-Type: application/json
{
"type": "person",
"method": "government_photo_id",
"reference": "customer_8842",
"person": {
"given_name": "Amelia",
"family_name": "Okonkwo",
"date_of_birth": "1991-04-17",
"address": {
"line1": "220 Portage Ave",
"city": "Winnipeg",
"region": "MB",
"postal_code": "R3C 0A5",
"country": "CA"
},
"phone": "+12045550188",
"email": "amelia@example.com"
},
"checks": ["document", "liveness", "face_match", "address", "phone", "email", "screening"]
}Completed result
{
"id": "ver_01JB7K2T9Q",
"status": "completed",
"decision": "approved",
"method": "government_photo_id",
"checks": {
"document": { "result": "pass", "type": "passport", "country": "CA" },
"liveness": { "result": "pass", "mode": "passive" },
"face_match": { "result": "pass", "similarity": 0.94 },
"address": { "result": "pass", "sources": 2 },
"phone": { "result": "pass", "line_type": "mobile" },
"email": { "result": "pass", "first_seen": "2013-08-02" },
"screening": { "result": "no_match", "sources_checked": 1428 }
},
"monitoring": { "enabled": true, "frequency": "continuous" },
"created_at": "2026-09-16T14:22:08Z",
"retention_until": "2033-09-16T14:22:08Z"
}Monitoring webhook
{
"event": "screening.match.created",
"verification_id": "ver_01JB7K2T9Q",
"match": {
"id": "mat_01JB9X4M2P",
"list": "OFAC SDN",
"published_at": "2026-09-14T00:00:00Z",
"score": 0.88,
"matched_fields": ["name", "date_of_birth"],
"conflicting_fields": ["nationality"]
}
}Illustrative payloads. Field names are stable within a major version; new fields may be added without a version bump, so parse defensively.
Practical notes
Authentication
Bearer keys, scoped per environment. Live keys never leave your server; the browser only ever holds a short-lived session token.
Idempotency
Send an idempotency key on every create. A retried request returns the original case rather than charging you twice.
Sandbox
A full sandbox with deterministic test identities for each outcome — pass, fail, review, sanctions hit, PEP hit.
Webhook security
Every delivery is signed. Verify the signature against the raw body before acting on the payload, and expect at-least-once delivery.
Rate limits
Per-key limits with clear headers. Burst allowances are raised on request for batch backfills.
Want sandbox access?
Tell us what you are building and we will issue test keys and walk your engineers through the first integration.