Inyo

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

SettingAccepted valuesDefaultEffect
allowed_document_typesA non-empty list of passport, drivers_license, identity_cardAll threeWhich document types a customer may present. The widget offers only these, and requesting a session with an excluded prefill.document_type returns 422
accepted_jurisdictionsObject 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 codesAll acceptedPer 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

SettingAccepted valuesDefaultEffect
face_match_thresholdNumber 0-10090Minimum similarity between the document portrait and the selfie for the hard face_match check to pass
liveness_thresholdNumber 0-10080Minimum liveness confidence for the hard liveness check to pass
liveness_modeselfie or rekognition_streamingselfieselfie derives liveness from a single selfie's quality and pose signals; the streaming mode runs an active liveness challenge
name_match_thresholdNumber 0-10.85Similarity 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

SettingAccepted valuesDefaultEffect
review_thresholdNumber 0-100, and above your face-match threshold (see below). 0 is off0 (off)Routes a borderline approval to review. An auto-approval whose confidence falls below this value becomes in_review instead
review_verification_declinestrue or falsefalseHolds 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

SettingAccepted valuesDefaultEffect
allow_file_uploadtrue or falsefalseWhen 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_capturetrue or falsefalseWhen on, the widget shoots automatically once the document is well framed and steady, instead of requiring a shutter tap
auto_capture_fallback_secondsInteger 0-30030In auto-capture mode, how long a stalled capture waits before the manual shutter reappears. 0 shows it immediately
max_capture_attemptsInteger 1-103Failed captures before the session is declined. A session can override this with its own max_capture_attempts
record_selfie_videotrue or falsetrueRecords 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.

SettingAccepted valuesDefaultEffect
enable_ai_authenticitytrue or falsetrueAI document authenticity review. Adds the hard ai_authenticity check β€” the authoritative defense against tight-crop screen recaptures, print copies, photocopies, and forgeries
enable_dldvtrue or falsefalseDMV 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_descriptiontrue or falsefalseSelfie 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

SettingAccepted valuesDefaultEffect
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_notificationstrue or falsetrueAlso 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_languageA language code matching xx or xx-XX (e.g. en, pt, es, pt-BR)enThe widget language when a session does not specify one
branding (outside config)Object β€” see belowInyo defaultYour logo, company name, and widget colors

branding is an object of its own:

SettingAccepted valuesEffect
logo_urlA URL to an image; use https so the widget does not load mixed contentShown in the widget chrome
company_nameString, up to 80 charactersDisplayed to the customer
color_primary6-digit hex with # (e.g. #0F766E)Buttons and accents
color_background6-digit hex with #Page background
color_text6-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:

SettingValueWhy
allowed_document_typesAll threeDo not turn customers away over the ID they happen to hold
allow_file_uploadfalseCamera-only capture is a material fraud control
face_match_threshold / liveness_thresholdLeave unsetTune only once you have volume to measure against
enable_ai_authenticitytrue (default)Your strongest recapture defense
review_verification_declinesfalse initiallyTurn on once you can absorb the review latency and have measured your false-decline rate
enable_result_notificationstrue (default)Guarantees later decisions and reversals reach you
max_capture_attempts3 (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