Accepted documents
You decide which documents a verification will accept by passing
allowed_documents to POST /v1/verifications (or by configuring the document
step of a Flow). The applicant then picks one of them on the hosted page. If
you omit it, the applicant gets the default Mozambique surface.
The allowlist
allowed_documents is a list of { country, document_type } entries. The
country is an explicit ISO-3166-1 alpha-2 code — wildcards ("*") are
rejected at request time; always pin the countries you accept.
{ "type": "kyc", "allowed_documents": [ { "country": "MZ", "document_type": "bilhete_identidade" }, { "country": "MZ", "document_type": "passport" }, { "country": "PT", "document_type": "passport" } ]}The applicant flow follows from the list:
- One entry → pinned; the applicant goes straight to capture.
- Multiple → the applicant picks the issuing country first, then the document type allowed for it.
The three support tiers
Every (country, document_type) pair falls into one of three tiers. The tier
determines what treatment the run gets — never whether your request is accepted.
1. Tuned — full treatment
Pairs with per-country calibration: templates, MRZ rules, document-side
profiles, and tuned thresholds. The full range of assessments is available,
including no_material_concerns.
| Country | document_type | Document |
|---|---|---|
MZ | bilhete_identidade | Mozambique Bilhete de Identidade |
MZ | passport | Mozambique passport |
MX | national_id | Mexico national ID (INE) |
MX | passport | Mexico passport |
2. Uncalibrated — runs fully, review-floored
Documents approved to run without per-country calibration. This is the honest “any passport, any country” story: every country’s ICAO 9303 MRZ (TD3) passport is in this tier — deterministic check-digit validation works regardless of issuer — plus a small set of named MZ/MX documents:
| Country | document_type | Document |
|---|---|---|
| any explicit country | passport | ICAO 9303 TD3 machine-readable passport |
MZ | drivers_license | Carta de condução |
MZ | dire | DIRE residence permit |
MX | drivers_license | Licencia de conducir |
MX | residence_permit | Tarjeta de residente |
The pipeline executes fully — OCR, MRZ check-digits, authenticity, liveness,
face match — so the capture is never wasted and the evidence is real. The
difference is the outcome: the scorer floors the assessment at
manual_review_recommended with the reason uncalibrated_document_scope.
Never a clean pass, never a silent rejection — the run tells you honestly that
per-country calibration is still maturing, and hands your reviewer the full
evidence bundle.
So a foreigner resident in Mozambique can always verify with their home-country
passport: list { "country": "PT", "document_type": "passport" } (or whichever
countries you serve) alongside your MZ documents, and expect those runs to come
back review-floored.
3. Everything else — assessment_incomplete
Any other pair — say a national ID from a country without tuning — is not
rejected. The verification still runs its lifecycle, but the engine resolves
the assessment to assessment_incomplete (fail-closed) without spending the
pipeline. You’ll see it clearly in the result rather than getting a misleading
score.
How matching works
Validation is composed from open standards — no proprietary per-country template database:
- ICAO 9303 MRZ check-digits (TD3) — universal across machine-readable
passports; picking
passportlocks MRZ validation in. - Tuned per-country templates (MZ BI/passport, MX national ID/passport) — format-aware field validation and calibrated thresholds.
- Template-backed uncalibrated definitions for the named MZ/MX documents above — real registry templates, minus the calibration claim.
Adding a country to the tuned tier is a registration plus its calibration assets — the pipeline itself is country-agnostic, which is why passports run everywhere today.