Tenant Configuration
Verification behavior is configured per tenant by Inyo. This page is the reference for what you can ask for β at onboarding, or as a change later. There is no self-serve configuration API; send your Inyo contact the settings you want.
Configuration updates merge into what is already stored, so asking to change one setting leaves the rest untouched. Returning a setting to its platform default is an explicit request, not an omission.
Each setting is named by the exact key we set on your tenant. Quoting the key in a request removes any ambiguity about which behavior you mean β several have similar-sounding names, and review_threshold and review_verification_declines in particular do very different things.
Most keys live inside your tenant's config object, but webhook_url and branding sit outside it as siblings of config β marked below, and visible in the example payload.
Documents and Jurisdictions
| Setting | Accepted values | Default | Effect |
|---|---|---|---|
allowed_document_types | A non-empty list of passport, drivers_license, identity_card | All three | Which document types a customer may present. The widget offers only these, and requesting a session with an excluded prefill.document_type returns 422 |
accepted_jurisdictions | Object keyed by document type; each value a list of continent codes (AF, AN, AS, EU, NA, OC, SA) and/or ISO 3166-1 alpha-3 codes | All accepted | Per document type, which issuing countries you accept. A document from outside them fails the hard jurisdiction_accepted check |
For example:
{
"passport": ["SA", "USA"],
"drivers_license": ["NA"]
}
That example accepts passports from any South American country plus the USA, and driver's licenses from North America. Leaving a document type out accepts all jurisdictions for it.
Narrow these deliberately. Restricting document types simplifies your downstream data handling, but every restriction is a customer who cannot complete onboarding with the ID they have.
Decision Thresholds
| Setting | Accepted values | Default | Effect |
|---|---|---|---|
face_match_threshold | Number 0-100 | 90 | Minimum similarity between the document portrait and the selfie for the hard face_match check to pass |
liveness_threshold | Number 0-100 | 80 | Minimum liveness confidence for the hard liveness check to pass |
liveness_mode | selfie or rekognition_streaming | selfie | selfie derives liveness from a single selfie's quality and pose signals; the streaming mode runs an active liveness challenge |
name_match_threshold | Number 0-1 | 0.85 | Similarity at which a prefill name is accepted as matching the document. A multi-part surname containing yours scores 0.95 |
Raising the face-match threshold reduces false accepts and increases false rejects β real customers turned away. Both thresholds are quoted in the relevant check's detail on every result, so your integration can read the effective value rather than hardcoding it.
Review Routing
| Setting | Accepted values | Default | Effect |
|---|---|---|---|
review_threshold | Number 0-100, and above your face-match threshold (see below). 0 is off | 0 (off) | Routes a borderline approval to review. An auto-approval whose confidence falls below this value becomes in_review instead |
review_verification_declines | true or false | false | Holds a rejection for a human. A verification the checks rejected routes to in_review instead of declined, so an analyst confirms it |
Both are explained in full β including which checks count toward confidence, and why a threshold at or below your face-match threshold can never fire β on Manual Review. A threshold in that inert range is rejected at configuration time rather than silently accepted.
Enabling held rejections generates analyst work with no cap on the queue. Enable it when a false decline is costlier than a delayed decision.
Capture Behavior
| Setting | Accepted values | Default | Effect |
|---|---|---|---|
allow_file_upload | true or false | false | When on, the widget offers a file picker alongside the camera. Off means a customer cannot submit a stored photo of a document β a meaningful fraud control |
auto_capture | true or false | false | When on, the widget shoots automatically once the document is well framed and steady, instead of requiring a shutter tap |
auto_capture_fallback_seconds | Integer 0-300 | 30 | In auto-capture mode, how long a stalled capture waits before the manual shutter reappears. 0 shows it immediately |
max_capture_attempts | Integer 1-10 | 3 | Failed captures before the session is declined. A session can override this with its own max_capture_attempts |
record_selfie_video | true or false | true | Records a short clip while the selfie is taken, retained as evidentiary proof |
Enrichment Options
Each of these adds signal at a per-verification cost. Two are off by default for that reason, and one carries a compliance obligation.
| Setting | Accepted values | Default | Effect |
|---|---|---|---|
enable_ai_authenticity | true or false | true | AI document authenticity review. Adds the hard ai_authenticity check β the authoritative defense against tight-crop screen recaptures, print copies, photocopies, and forgeries |
enable_dldv | true or false | false | DMV record verification. Adds the soft dmv_record_match check, verifying extracted US license data against the issuing DMV. Automatically skipped for non-participating states and unavailable providers |
enable_selfie_description | true or false | false | Selfie appearance description. Adds selfie_description to the result β structured observable attributes for later re-verification comparison |
Appearance descriptions are sensitive personal data. They carry GDPR and biometric-privacy (for example BIPA) exposure, and the selfie is processed by an external vision service. Confirm you have a lawful basis, a data-processing agreement in place, and a documented retention justification before asking us to enable this.
Delivery and Presentation
| Setting | Accepted values | Default | Effect |
|---|---|---|---|
webhook_url (outside config) | A URL. http validates, but use https β results carry personal data | β | Where results are POSTed. Required for delivery.mode: "webhook" and for result notifications |
enable_result_notifications | true or false | true | Also delivers results for redirect-mode sessions and server-to-server verifications, and every later change to any outcome. Requires a webhook URL β enabling it without one is rejected |
default_language | A language code matching xx or xx-XX (e.g. en, pt, es, pt-BR) | en | The widget language when a session does not specify one |
branding (outside config) | Object β see below | Inyo default | Your logo, company name, and widget colors |
branding is an object of its own:
| Setting | Accepted values | Effect |
|---|---|---|
logo_url | A URL to an image; use https so the widget does not load mixed content | Shown in the widget chrome |
company_name | String, up to 80 characters | Displayed to the customer |
color_primary | 6-digit hex with # (e.g. #0F766E) | Buttons and accents |
color_background | 6-digit hex with # | Page background |
color_text | 6-digit hex with # | Body text |
Colors must be full 6-digit hex β 3-digit shorthand (#0F7) and 8-digit alpha (#0F766E80) are rejected.
The "Powered by Inyo 360" footer always renders and is intentionally not configurable.
Widget copy β labels, buttons, result screens, retry feedback β is served from Inyo's copy store rather than baked into the frontend, so per-tenant wording changes and additional languages do not require a release on your side. English, Portuguese, and Spanish ship complete; any other xx or xx-XX code is accepted, with untranslated strings falling back to English individually.
A Starting Configuration
If you are onboarding now and unsure what to ask for, this is a sensible baseline for consumer onboarding:
| Setting | Value | Why |
|---|---|---|
allowed_document_types | All three | Do not turn customers away over the ID they happen to hold |
allow_file_upload | false | Camera-only capture is a material fraud control |
face_match_threshold / liveness_threshold | Leave unset | Tune only once you have volume to measure against |
enable_ai_authenticity | true (default) | Your strongest recapture defense |
review_verification_declines | false initially | Turn on once you can absorb the review latency and have measured your false-decline rate |
enable_result_notifications | true (default) | Guarantees later decisions and reversals reach you |
max_capture_attempts | 3 (default) | Forgiving without being a free retry loop for an attacker |
Then revisit thresholds and review routing with real data rather than at integration time.
Sending Us a Configuration
Quoting the keys directly is the least ambiguous way to make a request. This is the shape we apply to your tenant, and it shows the nesting: webhook_url and branding are siblings of config, not members of it.
{
"webhook_url": "https://acme.example.com/kyc-result",
"branding": {
"company_name": "Acme Bank",
"logo_url": "https://acme.example.com/logo.png",
"color_primary": "#0F766E",
"color_background": "#FFFFFF",
"color_text": "#111827"
},
"config": {
"default_language": "pt-BR",
"allowed_document_types": ["passport", "drivers_license"],
"accepted_jurisdictions": {
"passport": ["SA", "USA"],
"drivers_license": ["NA"]
},
"allow_file_upload": false,
"max_capture_attempts": 3,
"review_verification_declines": true
}
}
Include only the keys you want to set β anything omitted keeps its current value, since updates merge rather than replace.
Next Steps
- Manual Review β review threshold and held rejections in depth
- Checks & Decisions β which checks each setting affects
- Widget Delivery β how branding and language appear to the customer
