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.