Didit MCP Server
OfficialThis server exposes Didit's compliance and identity-verification platform as 130+ MCP tools, letting AI clients manage KYC/KYB workflows, run AML and verification checks, and operate workspace settings through OAuth-based sessions.
Account & org: register/login, verify email, list orgs and applications, get context, reveal API keys, check balance/top up credits.
Sessions: create/search/list sessions, get verification decisions, approve/decline/resubmit, correct KYC or POA data, add reviews, generate PDFs, share/import sessions, and bulk import historical records.
Workflows & questionnaires: list/create/update/delete workflows, build simple linear or branching graph workflows, validate/edit/set graphs, manage drafts and publishing, and create/manage questionnaires.
Standalone verification APIs: verify IDs, proof-of-address, database lookups, KYB registry search/select, passive liveness, face match/search, age estimation, AML screening, and email/phone OTP verification.
Vendor users & businesses: create, read, update, delete, search, and change monitoring status for customers and companies across apps/orgs.
AML transactions: submit and monitor transactions, search/list transaction records, and screen crypto wallet addresses for AML risk.
Cases, lists & blocklists: search cases, manage allowlists/blocklists/custom lists and their entries, including uploading face images to lists.
Webhooks & branding: create/update/delete webhook destinations, list signing secrets, and customize verification UI branding images.
Cross-app analytics & reporting: aggregate sessions, transactions, vendor users, and verification analytics across all apps/orgs in single calls.
Enables ChatGPT and other OpenAI-compatible clients to access Didit's identity verification, KYC, KYB, AML, fraud screening, and workspace operations through the MCP server, allowing AI agents to perform compliance and identity tasks programmatically.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Didit MCP Serverrun a KYC check on user ID 12345"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Didit MCP Server
The official Model Context Protocol server for Didit — bring KYC, KYB, AML screening, transaction monitoring, biometrics, and full workspace operations to Claude, Cursor, VS Code, Windsurf, Zed, and any MCP client.
140+ tools across sessions, workflows, vendor users/businesses, transactions, networks, the standalone verification APIs, lists, cases, reports, webhooks, and billing.
Auth is "Log in with Didit" (OAuth 2.1 + PKCE) — the MCP acts as the signed-in user with their role's permissions. There is no API-key mode: every tool calls the user-scoped console endpoints, which only accept a Bearer token.
Tools call Didit REST endpoints. Session PDF generation returns a temporary download URL for the original PDF.
Full documentation: https://docs.didit.me/integration/mcp/overview
Session PDF downloads
didit_session_generate_pdf returns download_url, expires_at (UTC), and
expires_in (300 seconds). Fetch the URL without an Authorization header to save
the original Didit PDF. The server checks PDF access before issuing the link and
fetches the original report again at download time using the same user and organization.
It does not reconstruct the report from session data. If the session changes between
issuance and download, the download reflects the current report. Revoked or expired
user access can invalidate a link before its five-minute expiry.
Deployments must set MCP_PDF_DOWNLOAD_KEY to 32 cryptographically random bytes
encoded as 64 hexadecimal characters, shared across all replicas, and set
MCP_RESOURCE_URI to the public HTTPS MCP endpoint. Route
/downloads/session-report.pdf to this HTTP server. The authenticated-encryption
key protects the credentials embedded in the session-scoped link; rotating it
invalidates outstanding links. Treat links as secrets and redact the token query
parameter in proxy/access logs. Responses use Cache-Control: no-store.
Stdio deployments need a reachable HTTP deployment with the same key, API base URL,
and MCP_RESOURCE_URI; stdio alone cannot serve download links. Missing key
configuration produces an actionable tool error instead of inline PDF data.
Related MCP server: APIVerve MCP Server
Quick start
Hosted (recommended)
No install, no API key — point your client at the hosted URL and sign in via the browser:
https://mcp.didit.me/mcpClaude Code
claude mcp add --transport http didit https://mcp.didit.me/mcpCursor (~/.cursor/mcp.json)
{ "mcpServers": { "didit": { "url": "https://mcp.didit.me/mcp" } } }Windsurf / Zed (via the mcp-remote bridge)
{ "mcpServers": { "didit": { "command": "npx", "args": ["-y", "mcp-remote@latest", "https://mcp.didit.me/mcp"] } } }See per-client setup for Claude Desktop and VS Code.
Authentication
The MCP is an OAuth 2.1 resource server; the Didit console (business.didit.me) is the authorization server. On first connect your client opens a browser, you Log in with Didit and approve the scopes, and the MCP then acts as you — across every organization you belong to, with your role's permissions. Tokens are short-lived and refreshed automatically.
Scopes: didit:management (workspace operations), didit:verification (running checks) and didit:staff (Didit staff accounts only; the authorization server never issues it to anyone else). Your console role is enforced server-side on every call.
There is no API-key mode. Every tool targets the user-scoped console endpoints (
/organization/{org}/application/{app}/…), which authorize a Bearer token with per-role privileges and rejectx-api-key. (For raw REST access with an application API key — e.g. creating sessions from your backend — use the REST API directly, not this server.)
See Authentication.
Tools
140+ tools, grouped by area. The full catalogue with read/write/destructive markers is in docs/TOOLS.md and at docs.didit.me. Highlights:
Discovery & cross-app:
didit_context_get,didit_session_search,didit_transaction_search,didit_vendor_user_search,didit_analytics— aggregate across every org/app in one call.Sessions: create, list, get decision, update status, reviews, bulk import, webhook delivery log + resend (
didit_session_webhookswaits for a sandbox session's webhook so an integration can be verified end to end).Verification APIs:
didit_verify_id,didit_verify_aml,didit_verify_face_match,didit_verify_kyb_search, …Workflows (incl. branching graphs):
didit_workflow_search,didit_workflow_get_graph,didit_workflow_edit_graph— build conditional/branching workflows (fuzzy-match conditions, Document-AI steps) by sending small ops; large feature configs are kept server-side, never resent.didit_workflow_get_id_verification_methods_cataloganddidit_workflow_get_kyb_registry_cataloganswer the server-driven questions a config write depends on (which countries offer non-doc lookup / wallets, which KYB data tiers and monitoring a country's registries sell).Compliance: transaction monitoring, custom and preset rule management with backtesting, lists/blocklist/allowlist, cases, reports, audit logs, alerts.
Workspace: questionnaires, webhooks, members, billing, branding.
File inputs
Tools that consume files (face upload, ID/PoA/liveness/face/age verification, branding) accept the file in one of two forms:
*_path— an absolute path on the machine running the MCP server. Only works for local/stdio runs (e.g. Claude Code with a local server), where your files and the server share a filesystem.*_base64— the file content inline, as raw base64 or adata:URL. Use this against the hosted endpoint; it is how the Didit Console Copilot passes chat attachments (its agent resolves attachment references likeatt_1into base64 before the call reaches the MCP).
Both forms enforce the same 15MB cap and magic-bytes allow-list (png/jpg/jpeg/webp/gif/bmp/ico/pdf). The hosted transport's JSON body limit is 25MB (MCP_JSON_BODY_LIMIT).
Run it yourself
The hosted server above is the easy path — no install. To self-host, clone this repo and run it with Docker or Node. It authenticates the user the same way (OAuth, or a user Bearer token for headless runs); there is no API-key mode.
git clone https://github.com/didit-protocol/mcp.git && cd mcp
# Docker (recommended) — serves /mcp and /healthz on port 3000
docker build -t didit-mcp . && docker run -p 3000:3000 --env-file .env didit-mcp
# …or with Node
npm install && npm run build
node dist/http.js # hosted HTTP/OAuth
DIDIT_ACCESS_TOKEN=<user-access-token> node dist/index.js # stdio (headless)All Didit base URLs and OAuth endpoints are environment variables with public defaults (verification.didit.me, apx.didit.me, business.didit.me) — override them for a private deployment. See ARCHITECTURE.md and .env.example for the full reference.
Workflow feature configuration
Every workflow feature node takes a config object. The tables below are the complete
contract - what didit_workflow_create, didit_workflow_update, didit_workflow_validate_graph,
didit_workflow_set_graph and didit_workflow_edit_graph accept, and what the API stores.
A key that is not listed here is not part of the contract and is dropped silently on save.
didit_workflow_get_feature_config_schema returns the same data as JSON at runtime.
Generated from schema/feature-config-schema.json (contract sha256:a2c413a50107faf3ea47fa187089a930ac17d3d04893e24176f494a58470e982, schema version 1), which is a copy of the artifact service-didit-verification generates from its feature-config serializers. Do not edit by hand — run npm run schema:readme.
AGE_ESTIMATION
Configuration for Age Estimation feature.
Key | Type | Accepts | Meaning |
| integer | null | integer >=1 <=100 | |
| integer | null | integer >=1 <=100 | |
| boolean | null | boolean | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when an external capture device is detected. |
| boolean | null | boolean | Record the microphone during the selfie capture, so a reviewer can hear the session. Off by default. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a duplicate face is found on a user verified with a different date of birth. Another document of the same person (a passport after an identity card, a renewal, a document of a second country) is not flagged. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a duplicate face is found under a different name. |
| string | null | string | |
| integer | null | integer >=1 <=3 | |
| string | null | 'ACTIVE_3D'|'FLASHING'|'PASSIVE' | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when more than one face is present in the capture. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when this face matches a previously seen user. |
| number | null | number | |
| number | null | number | |
| boolean | null | boolean | Native SDK active liveness only. On, a capture whose liveness score falls strictly between face_liveness_score_decline_threshold and face_liveness_score_review_threshold is never decided, whichever verdict the engine attached to it: the person is told the result was unclear and asked to capture again, every time, outside the face_liveness_max_attempts budget (which still applies to captures the engine could not score). Off by default; the web flow ignores it. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the stored liveness recording contains a repeated moving sequence consistent with a looped video feed, measured server-side from the video itself, independently of the liveness score. It deliberately does NOT flag a frozen or near-motionless capture: frame statistics cannot separate an injected still from a genuine one (a subject holding still, or a flash that clips the exposure), so acting on that would decline real users. A frozen or pre-recorded injected feed is instead defeated by strict flash liveness (set face_liveness_flash_mode to "1" for strict), which binds the capture to a per-session colour-sequence challenge a recording cannot reproduce. Defaults to NO_ACTION (evidence is recorded, the verdict is unchanged). |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the selfie is brighter than |
| integer | null | integer >=0 <=100 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the selfie is darker than |
| integer | null | integer >=0 <=100 | |
| boolean | null | boolean | |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| boolean | null | boolean | Run the 1:N Face Search on the selfie: match it against previously verified users, the face blocklist and allowlist, and store its biometric template for later matching. On by default. Off skips the search, keeps no face template, and leaves the duplicate-face actions with nothing to act on. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when injected video frames are detected. |
| integer | null | integer >=1 <=100 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the selfie is a photo of a screen. |
| array | array | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a virtual camera feed is detected. |
AML
Configuration for AML feature (used for both KYC AML and KYB Company AML).
Key | Type | Accepts | Meaning |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| string | null | 'company'|'person' | Whether this node screens a |
| json | null | {"full_name"|"date_of_birth"|"nationality"|"document_number": {"source": "document_ai"|"questionnaire"|"expected_data", "key": "||expected_details.<expected_details field>|metadata."}} | Where this node reads the entity it screens, when the workflow has no ID Verification or KYB Registry step to supply it - a Document AI workflow over non-standardised documents (a tax certificate, an acta constitutiva). Same contract as |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the screening ran on less than a full identity (name, date of birth and country). |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| uuid | null | uuid | Which case blueprint the automatically-created case is built from. Only meaningful with |
| boolean | null | boolean | Open a case automatically when the screening returns a hit, instead of leaving the hit to be triaged from the session. Off by default. |
| boolean | null | boolean | |
| boolean | null | boolean | Keep screening the PERSON after the session is approved, raising a new hit when they later appear on a watchlist. Off by default. |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| boolean | null | boolean | The same, for the COMPANY on a KYB workflow. The two switches are independent. |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| string | null | string | |
| array | array |
BANK_VERIFICATION
Configuration for Bank Verification feature.
Bank Verification confirms who owns a bank account against an identity ANOTHER step established - it is not identity proof on its own. Put ID Verification, Database Validation or a questionnaire before it; first in a graph it has nothing to compare against and can only return
unknown. The node is opt-in and runs nothing whilebank_countriesis empty.
Key | Type | Accepts | Meaning |
| string | null | 'auto'|'user' | Whether the user picks which of the connected accounts is verified ( |
| boolean | null | boolean | Let the user skip the step instead of connecting a bank. A skip is then decided by |
| string | null | 'REVIEW'|'DECLINE' | Verdict when the user spent |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the institution types the holder as a business rather than a person. |
| integer | null | integer >=5 <=60 | How long a started connection stays open before the attempt is abandoned, 5 to 60 minutes. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the bank consent lapses after the step was already decided. Only meaningful with |
| json | null | {"": {"enabled": true|false, "institutions": ["<institution_id>", ...] | "all"}} | Which countries a user may connect a bank in - a WHITELIST, so an empty map means the node offers nothing and runs nothing. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the institution's country differs from the expected/document country. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the account currency is not in |
| array | null | array | Which account types the user may pick. Credit cards, loans and investment accounts are never eligible - they do not establish ownership of a payment account. Defaults to current/checking. |
| array | null | array | ISO 4217 currencies the account is expected to be in. Empty means any; a mismatch is reported through |
| json | null | {"full_name"|"first_name"|"last_name"|"address": {"source": "document_ai"|"questionnaire"|"expected_data", "key": "||expected_details.<expected_details field>|metadata."}} | Where to read a reference-identity field when no earlier step in the graph can fill it. The map's KEY is one of |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the account has more than one holder. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the available balance is below |
| integer | null | integer >=1 <=5 | How many connection attempts the user gets, 1 to 5. Spending them all without a successful connection is |
| number | null | number >=0 | Minimum available balance, in the account's own currency. Below it |
| integer | null | integer >=50 <=100 | At or above this score the holder name is a match. 50 to 100, defaults to 85. |
| string | null | 'REVIEW'|'DECLINE' | Verdict when the account holder is demonstrably not the verified person (best name score below |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the institution connected but returned no holder identity to compare. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the holder name lands between |
| integer | null | integer >=0 <=99 | Below this score the holder name is a no-match. 0 to 99, defaults to 70. The band between the floor and the threshold is the partial match, so the floor must be strictly below |
| string | null | 'auto'|'database_validation'|'expected_details'|'kyc'|'questionnaire' | Which earlier step supplies the identity the account holder is compared against: |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when no earlier step produced an identity to compare the holder against, so ownership can only be |
| boolean | null | boolean | Re-fetch the account's financial data after the step has already been decided, for as long as the bank consent lasts. Needs at least one of the |
| boolean | null | boolean | Also require the holder's address to match. A name that reached the threshold but whose address scores below it drops to a partial match. An institution that returns no address waives the requirement; a session with no address of its own to compare against does not, and lands on a partial match. Off by default. |
| boolean | null | boolean | Offer only institutions reachable over OAuth / app-to-app, never a provider's legacy credential-capture surface. Where open banking already makes OAuth the only route, this changes nothing. |
| json | null | {"ownership": true, "identifiers": true|false, "balances": true|false, "transactions": true|false, "income": true|false} | What the user is asked to consent to sharing. |
| boolean | null | boolean | Show the ownership result to the user inside the verification flow. Off means it is recorded on the session but never shown to them. |
| string | null | 'REVIEW'|'DECLINE' | Verdict when the user skipped the step. Only reachable with |
| boolean | null | boolean | Store the account identifiers unmasked rather than masked. Needs the |
| boolean | null | boolean | Keep the holder details the institution returned next to the ownership evidence. Off means only the comparison itself is retained: scores, match method and reason codes. |
| integer | null | integer >=30 <=365 | How far back transaction history is read, 30 to 365 days, defaulting to 90. Needs the |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the evidence could not be fetched after retries - a transient failure. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the user's bank is not supported and the node does not allow skipping. |
| boolean | null | boolean | Also read the institution's own holder-name score, and let it decide when it is higher than Didit's or when Didit had no holder name to score at all. A result decided that way reports |
| boolean | null | boolean | Whether a marketplace connection that cannot be established falls back to Didit's native route. Off by default: a silent fallback would spend your Didit balance on a session you expected to run on your own provider contract. A fallback connection is recorded as |
| string | null | string | Which route runs the step. Empty (the default) is Didit's native Bank Verification, a provider-independent product Didit routes to the regional open-banking vendor that serves the user's country and institution, on Didit's contracts and billing. A value names a MARKETPLACE provider whose own credentials this application has connected - the session then runs, is billed and is revoked on your provider account, and Didit charges only the marketplace platform fee. A provider that is not connected is refused on save. |
| array | array |
DATABASE_VALIDATION
Configuration for Database Validation feature.
The node is opt-in and does nothing while
database_validation_countriesis empty - the editor blocks publishing in that state and the compliance check reports it as a gap. Place it after the step that produces its inputs (usually OCR), and usedatabase_validation_field_sourcesonly for inputs no upstream step can fill.
Key | Type | Accepts | Meaning |
| json | null | {"": {"services": ["<service_id>", ...]}} | The databases to check, per country - this node runs NOTHING until at least one country carries at least one service id. Service ids come from the country's live catalog (e.g. |
| json | null | {"<db_validation_input_field>": {"source": "document_ai"|"questionnaire"|"expected_data", "key": "||expected_details.<expected_details field>|metadata."}} | Where to read a database input that no earlier step in the graph can fill. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the database returns no match at all. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when no selected database covers the holder's country or document. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the database matches some, but not all, of the submitted fields. |
| array | array |
DOCUMENT_AI
Configuration for the Document AI feature.
At most 3 documents per node, field keys unique within a document, and at most one field per document may set
is_full_name(it is optional - a document may mark none).
Key | Type | Accepts | Meaning |
| string | null | 'REVIEW'|'DECLINE' | Verdict when the document looks tampered with. |
| array | array | |
| string | null | 'REVIEW'|'DECLINE' | Verdict when the user runs out of |
| integer | null | integer >=2 <=5 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a field marked |
| integer | null | integer >=0 <=100 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the field flagged |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the uploaded document cannot be read at all. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the uploaded file type is not supported. |
| array | array |
EMAIL_VERIFICATION
Configuration for Email Verification feature.
Key | Type | Accepts | Meaning |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the address appears in a known credential breach. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when this address was flagged as fraudulent by another organization in the network. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the address belongs to a disposable-mail provider. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the address was already verified for this application. |
| boolean | null | boolean | |
| integer | null | integer >=4 <=8 | |
| boolean | null | boolean | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the enrichment score is worse than |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=1 <=5 | |
| integer | null | integer >=1 <=5 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the social footprint check ( |
| boolean | null | boolean | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the address appears in many breaches. |
| boolean | null | boolean | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the address appears in a recent breach. |
| array | array |
FACE_MATCH
Configuration for Face Match feature.
Key | Type | Accepts | Meaning |
| string | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when calibrated evidence says the eyes region is covered in the selfie. NO_ACTION records evidence without changing Face Match; REVIEW sends Face Match to review; DECLINE declines it. The signal remains shadow-only until the region reports calibrated=true. |
| string | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when calibrated evidence says the face region is covered in the selfie. NO_ACTION records evidence without changing Face Match; REVIEW sends Face Match to review; DECLINE declines it. The signal remains shadow-only until the region reports calibrated=true. |
| integer | null | integer >=1 <=3 | |
| string | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when calibrated evidence says the mouth region is covered in the selfie. NO_ACTION records evidence without changing Face Match; REVIEW sends Face Match to review; DECLINE declines it. The signal remains shadow-only until the region reports calibrated=true. |
| string | null | 'REVIEW'|'DECLINE' | Verdict when no face-match score could be produced (missing portrait or selfie). |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| array | array |
GEOLOCATION
Configuration for the Precise Location (GEOLOCATION) feature. Every threshold is bounded here rather than in the client: the browser and the native SDKs are told what to collect by the step data this config produces, and a value the server would refuse must never reach a user as a request their device cannot satisfy. The action keys all default to Review rather than Decline. A denied permission, a wide radius or a stale fix is not evidence of fraud, and a default that declined them would make the step a conversion trap.
Key | Type | Accepts | Meaning |
| string | null | 'approximate_allowed'|'precise' | |
| boolean | null | boolean | |
| boolean | null | boolean | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the user granted an approximate location while |
| boolean | null | boolean | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the device position is further from the document address than |
| integer | null | integer >=0 | |
| string | null | 'imperial'|'metric' | The unit the console shows |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the position cannot be placed inside or outside the fence because its accuracy circle reaches the boundary. Uncertainty is never reported as being outside. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the device position, and its whole uncertainty circle, falls outside |
| json | null | {"": {"allowed": true|false, "states"?: {"<ISO 3166-2 code>": {"allowed": true|false}} | null}} | Country and region allow/deny rules for the device's own position, applied only while |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a native client submitted a position with no device-attestation token. Defaults to No action; web clients are recorded as unsupported rather than missing, because no browser can attest. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the device position and the session's IP location are further apart than |
| integer | null | integer >=0 | |
| string | null | 'imperial'|'metric' | The unit the console shows |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when no attempt established the required precision: the best position has an uncertainty radius wider than |
| integer | null | integer | |
| string | null | 'imperial'|'metric' | The unit the console shows |
| integer | null | integer | |
| integer | null | integer | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the operating system reported the position as simulated rather than measured (Android mock provider, iOS simulated-by-software). |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the user declined or dismissed the location prompt on every allowed attempt. Defaults to Review: a refusal is a choice, not a fraud signal. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the position was measured more than |
| integer | null | integer | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when no position could be obtained - location services off or restricted, the positioning system returned nothing, the attempt timed out, the user skipped the step, or the client is too old to support it. |
| boolean | null | boolean | |
| array | array |
IP_ANALYSIS
Configuration for Device & IP Analysis feature.
Key | Type | Accepts | Meaning |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the session looks driven by automation rather than a person. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when this device was flagged as fraudulent by another organization in the network. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when this IP was flagged as fraudulent by another organization in the network. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the host application binary looks tampered with. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the device is on the organization's block list. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a debugger is attached to the host application. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the device is an emulator rather than real hardware. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when runtime hooking or instrumentation is detected. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when no platform device-integrity attestation was returned. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the device is rooted or jailbroken. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when this device was already used by another verified user. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when this IP was already used by another verified user. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the IP disagrees with the expected IP sent on the session. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the connecting IP's country is not allowed by |
| json | null | {"": {"allowed": true|false, "states"?: {"<state_code>": {"allowed": true|false}} | null}} | Country allow/deny rules for the connecting IP address, applied only while |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when no IP address identifying the end user was recorded, so the session has no IP location at all: country, city, ISP, coordinates and time zone are unavailable, and |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the IP country disagrees with the document's issuing country. |
| boolean | null | boolean | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the session was driven from more than one device. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the device reports a recovered or restored state. |
| array | array | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the connection comes through a VPN, proxy or Tor exit. |
KYB_DOCUMENTS
Key | Type | Accepts | Meaning |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a document is older than its configured freshness window. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a document contradicts the registry on a critical company detail. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the user runs out of |
| integer | null | integer >=1 <=5 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a document contradicts the registry on a minor detail. |
| json | null | {"<KYB_DOCUMENT_GROUP|KYB_DOCUMENT_SUBTYPE>": {"enabled": true|false, "max_age_days": <0-3650>|-1|null}} | Per-group or per-subtype switch and freshness window. Keys must be a known KYB document group or subtype code. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a company document looks tampered with. |
| json | null | ["<KYB_DOCUMENT_GROUP>", ...] | The company paperwork to collect, as a list of document-GROUP codes - each group is satisfied by any one of the document types it covers. The KYB Documents feature refuses to save with an empty list: a node that requires nothing is the same as not having the node. |
| array | array |
KYB_KEY_PEOPLE
The workflow ids here point at separate KYC workflows: a KYB graph verifies the company, and the people behind it are verified by the linked person workflows.
Key | Type | Accepts | Meaning |
| uuid | null | uuid | |
| json | null | [{"key": "", "label": "", "type": "text"|"number"|"date"|"phone"|"email", "required": true|false, "custom": true|false}] | Which company details are collected for a CORPORATE key person. Same list-of-descriptors shape and same rules as |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a key person's document disagrees with the details declared for them. |
| boolean | null | boolean | |
| json | null | [{"key": "", "label": "", "type": "text"|"number"|"date"|"phone"|"email", "required": true|false, "custom": true|false}] | Which personal details are collected for an individual key person, as an ORDERED LIST of field descriptors (not a map). |
| boolean | null | boolean | Pre-fill the key-people list from the company registry result, so the customer confirms and corrects rather than typing every officer and shareholder in. |
| boolean | null | boolean | |
| uuid | null | uuid | |
| boolean | null | boolean | |
| boolean | null | boolean | |
| boolean | null | boolean | |
| boolean | null | boolean | |
| boolean | null | boolean | |
| json | null | {"<role_key>": {"enabled"?: true|false, "require_kyc"?: true|false, "verification_workflow"?: ""|null, "allow_skip"?: true|false}} | Per-role rules for the people behind the company. Role keys come from the existing config - never invent one. A role with |
| integer | null | integer >=0 <=100 | |
| uuid | null | uuid | |
| integer | null | integer >=0 <=100 | |
| uuid | null | uuid | |
| boolean | null | boolean | |
| array | array |
KYB_REGISTRY
Key | Type | Accepts | Meaning |
| json | null | ["", ...] | Which company-registry countries the business may be incorporated in, as a list of ISO-2 codes (note: ISO-2 here, unlike the ISO-3 used by the OCR and IP allow-lists). An empty list or null accepts every supported registry. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the company could not be found in a registry and was entered by hand. |
| json | null | {"": {"enabled": true|false, "tier": "basic"|"shareholders"|"ubo"}} | Per-country registry routing configuration. Each enabled country selects the data tier charged when a company is selected. Only tiers marked available by the pricing endpoint can be enabled. At least one country must be enabled: a registry check that searches nowhere is rejected. Manual company entry does not use this configuration and is billed at its own flat fee of USD 0.75 per company. |
| json | null | {"<registry_field>": {"enabled"?: true|false, "required"?: true|false}} | Per-registry-field overrides controlling which company details are collected and which of them are mandatory. Field keys come from the backend's configurable-field catalog (registration_number, incorporation_date, legal_address, vat_number, alternative_names, tax_number, company_type, legal_entity_identifier, location_of_registration, nature_of_business, registered_capital_amount, registered_capital_currency, website, email, phone, ...); an unknown key, or any sub-key other than |
| boolean | null | boolean | Keep the COMPANY's registry record under continuous monitoring after a Shareholders or UBO result: changes of status, officers, ownership or address move the session back to review and fire a webhook. Only where the registry provider offers monitoring; USD 2.00 per company per year, cancellable at any time. Off by default. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the VAT number is rejected by the tax authority. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the VAT number could not be checked at all. |
| array | array |
LIVENESS
Configuration for Liveness feature.
Key | Type | Accepts | Meaning |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Deprecated and no longer applied. It treated a face as if it carried a fraud verdict. Use |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when other organizations in the network recorded identity-claim events for this same person in which the claimed identity did not match. Review or no action only - a decline set here is downgraded to review. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when an external capture device is detected. |
| boolean | null | boolean | Record the microphone during the selfie capture, so a reviewer can hear the session. Off by default. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a duplicate face is found on a user verified with a different date of birth. Another document of the same person (a passport after an identity card, a renewal, a document of a second country) is not flagged. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a duplicate face is found under a different name. |
| string | null | string | |
| integer | null | integer >=1 <=3 | |
| string | null | 'ACTIVE_3D'|'FLASHING'|'PASSIVE' | |
| string | null | string | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when more than one face is present in the capture. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when this face matches a previously seen user. |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| boolean | null | boolean | Native SDK active liveness only. On, a capture whose liveness score falls strictly between face_liveness_score_decline_threshold and face_liveness_score_review_threshold is never decided, whichever verdict the engine attached to it: the person is told the result was unclear and asked to capture again, every time, outside the face_liveness_max_attempts budget (which still applies to captures the engine could not score). Off by default; the web flow ignores it. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the stored liveness recording contains a repeated moving sequence consistent with a looped video feed, measured server-side from the video itself, independently of the liveness score. It deliberately does NOT flag a frozen or near-motionless capture: frame statistics cannot separate an injected still from a genuine one (a subject holding still, or a flash that clips the exposure), so acting on that would decline real users. A frozen or pre-recorded injected feed is instead defeated by strict flash liveness (set face_liveness_flash_mode to "1" for strict), which binds the capture to a per-session colour-sequence challenge a recording cannot reproduce. Defaults to NO_ACTION (evidence is recorded, the verdict is unchanged). |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the selfie is brighter than |
| integer | null | integer >=0 <=100 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the selfie is darker than |
| integer | null | integer >=0 <=100 | |
| boolean | null | boolean | |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| boolean | null | boolean | Run the 1:N Face Search on the selfie: match it against previously verified users, the face blocklist and allowlist, and store its biometric template for later matching. On by default. Off skips the search, keeps no face template, and leaves the duplicate-face actions with nothing to act on. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when injected video frames are detected. |
| json | {"": {"possible": 0-100, "high": 0-100}} | Per-demographic overrides of the face-similarity bands used against the allow-list and duplicate-face sets, so match rates stay even across groups. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the selfie is a photo of a screen. |
| array | array | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a virtual camera feed is detected. |
NFC
Configuration for NFC/ePassport feature.
Key | Type | Accepts | Meaning |
| boolean | null | boolean | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the user skips the NFC chip read (only reachable with |
| array | array | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when chip data-group hashes are intact but the certificate chain cannot be verified because the issuing country's CSCA trust anchor is not loaded. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the chip is read but its signature cannot be verified. |
OCR
Configuration for OCR/ID Verification feature.
Omitting
documents_allowedstores the full country/document catalog, so the node accepts everything. Put OCR before any feature that reads identity data from the document (FACE_MATCH, NFC, DATABASE_VALIDATION).
Key | Type | Accepts | Meaning |
| json | null | {"": {"minimum_age": 1-120, "maximum_age": 1-120|null, "states"?: {"<STATE_CODE>": {"minimum_age": 1-120, "maximum_age": 1-120|null}}}} | Per-country (and optionally per-state) age gate. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a critical printed field - an identity number, a name, the date of birth or the expiry date - was physically covered on the captured document. Defaults to REVIEW. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when this document was flagged as fraudulent by another organization in the network. |
| boolean | null | boolean | Record the microphone during document capture, so a reviewer can hear the session. Off by default. |
| json | null | {"": ["<blur_field_name>", ...]} | Fields to blur out of the stored document image, per country. Only fields the country's document layout supports are accepted. |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the document or personal number does not match the country's expected format. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the document-capture selfie matches, or possibly matches, the face of a user already verified in this application. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the document-capture selfie matches a user already verified with a different date of birth. Another document of the same person (a passport after an identity card, a renewal, a document of a second country) is not flagged. Can only escalate document_selfie_duplicated_face_action. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the document-capture selfie matches a user already verified under a different name. Can only escalate document_selfie_duplicated_face_action. |
| boolean | null | boolean | Run the 1:N Face Search on the selfie taken during document capture (needs is_document_selfie_portrait_match_enabled): match it against the face blocklist and previously verified users. The selfie is a probe only, its template is never stored. On by default. Off skips the search and leaves the document-selfie duplicate-face actions with nothing to act on; face_search_enabled off on the LIVENESS step skips it too, since that opt-out covers every selfie of the session. |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=0 <=100 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the scanned document family carries no portrait on any side. Node-config only - there is no account-level setting; the runtime default is REVIEW. |
| json | null | {"": {"<DOC_CODE>": {"enabled": 0|1, "sides"?: 1|2, "subtypes"?: ["<SUBTYPE_CODE>", ...]}}} | Which identity documents are accepted, per issuing country. Omit the key entirely to accept the full catalog; an empty object means the same thing. At least one document must end up enabled or the save is rejected. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the identity was already verified for this application. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the extracted identity contradicts the |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when no expiry date could be read from the document. |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=2 <=5 | |
| integer | null | integer >=0 <=100 | |
| array | null | ["CAMERA_SCAN" | "UPLOAD", ...] | Capture methods the end user may use for the document photo. Declared as a list of free strings, so the vocabulary is not in the field itself: CAMERA_SCAN (live capture) and UPLOAD (pick an existing file). An empty list falls back to the account default. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when overall document image quality is below the bar. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the captured document image is too blurry to trust. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the captured document image is overexposed. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the captured document image is underexposed. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the document's own fields contradict each other. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a document check digit or barcode fails validation. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the machine-readable zone is missing or inconsistent. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when a document authenticity validation fails. |
| boolean | null | boolean | |
| boolean | null | boolean | |
| boolean | null | boolean | Show the user a review screen after each document capture, letting them retake the photo before it is submitted. Off by default. |
| boolean | null | boolean | Let the user review and correct the extracted identity data before the step completes. Off by default. A correction is scored against |
| integer | null | integer >=1 <=120 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the holder is older than |
| json | null | {"": {"document": {"enabled": bool}, "id_lookup": {"enabled": bool, "source"?: "<source_id>"|null, "max_attempts": 1-5, "skip_liveness_and_face_match": bool, "on_partial_match": "fallback_to_document"|"decline", "on_no_match": "fallback_to_document"|"decline", "on_provider_error": "fallback_to_document"|"decline", "response_fields"?: ["<field_key>", ...]}, "wallet": {"enabled": bool, "providers": ["<wallet_id>", ...], "on_failure": "fallback_to_document"|"decline"}}} | Which ID verification methods each country may use: document capture (today's behaviour), non-doc lookup against a government or other authoritative source, and digital identity wallets. Omit the key, or a country, or a method, and that country is document only. Every method must be available for the country in the capability catalog (GET workflow-graph/id-verification-methods-catalog/); wallets are an accept-list with no ordering. Each fallback is |
| integer | null | integer >=1 <=120 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the holder is younger than |
| array | null | ["first_name" | "last_name" | "date_of_birth" | ...] | Which extracted identity fields count as critical when the user edits the OCR result, so a mismatch takes the critical action rather than the minor one. |
| string | null | 'REVIEW'|'DECLINE' | Verdict when the user's edit disagrees with OCR on a critical field. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the user's edit disagrees with OCR on a non-critical field. |
| array | array | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the document address could not be parsed into components. |
PHONE_VERIFICATION
Configuration for Phone Verification feature.
Key | Type | Accepts | Meaning |
| integer | null | integer >=4 <=8 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when this number was flagged as fraudulent by another organization in the network. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the number belongs to a disposable-number provider. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the number was already verified for this application. |
| boolean | null | boolean | |
| string | null | 'REVIEW'|'DECLINE' | Verdict when the number carries a high risk signal. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the trust index is below |
| boolean | null | boolean | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the enrichment score is worse than |
| integer | null | integer >=0 <=100 | |
| integer | null | integer >=1 <=5 | |
| integer | null | integer >=1 <=5 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the social footprint check ( |
| boolean | null | boolean | |
| boolean | null | boolean | |
| integer | null | integer >=0 <=100 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the line type itself is considered risky. |
| json | null | {"": {"<channel: sms|whatsapp|telegram|rcs|viber|zalo>": {"enabled": true|false, "max_retries": } | true|false}} | Which countries and delivery channels the one-time code may be sent through. It is a WHITELIST: a country absent from the map is not offered at all, and a channel absent from a listed country is skipped. |
| string | null | string | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the number was ported to a new carrier recently. |
| array | array | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the number is VoIP rather than a real subscriber line. |
PROOF_OF_ADDRESS
Configuration for Proof of Address feature.
Key | Type | Accepts | Meaning |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the document fails authenticity checks. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the document is damaged, cropped or otherwise unusable. |
| json | null | {"": {"<DOC_CODE>": {"enabled": 0|1, "sides"?: 1|2, "subtypes"?: ["<SUBTYPE_CODE>", ...]}}} | Which proof-of-address documents are accepted, per issuing country. Same shape as OCR's |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when no issue date could be read from the document. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the issuing company or authority cannot be identified. |
| json | null | {"<language_code>": 0|1} | Languages the proof-of-address document may be written in, as a flag per language code. Omit to accept every supported language. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the user runs out of |
| integer | null | integer >=2 <=5 | |
| integer | null | integer >=0 <=100 | |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the name or address on the document disagrees with the verified identity. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the address on the document cannot be parsed or is not a real address. |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the uploaded document is not one of |
| string | null | 'NO_ACTION'|'REVIEW'|'DECLINE' | Verdict when the document language is not one of |
| array | array |
QUESTIONNAIRE
Configuration for Questionnaire feature.
Key | Type | Accepts | Meaning |
| uuid | null | uuid | |
| boolean | null | boolean | |
| array | array |
Contributing
The feature-config contract above is generated - never hand-write a config key into a tool description. See CONTRIBUTING.md for the regeneration workflow and the checks that enforce it.
Issues and PRs welcome — see CONTRIBUTING.md. Run the hosted server at mcp.didit.me/mcp, or self-host from this repo (Docker / Node) — see Run it yourself.
License
MIT © Didit Protocol
Available Tools
121 toolsdidit_account_loginBInspect
Login to existing Didit account. Returns access_token and refresh_token.
Inputs: email (required), password (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_account_registerAInspect
Register a new Didit account. A 6-character verification code is sent to the email. Follow up with didit_account_verify_email.
Inputs: email (required), password (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_account_resend_otpAInspect
Resend the 6-character email verification code for a pending registration. Codes expire after 10 minutes.
Inputs: email (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_account_verify_emailAInspect
Verify email with the 6-character code. Returns access_token, refresh_token, organization, application (with client_id and api_key).
Inputs: email (required), code (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_alert_configureCInspect
Configure an alert by type.
Inputs: alert_type (required), organization_id, application_id, data. Returns: Structured result. Fields vary by tool; see the success payload.
didit_alert_listARead-onlyInspect
List configured alerts.
Inputs: organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_allowlist_addAInspect
Add an entry to the allowlist (trusted, bypasses some checks).
Inputs: organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_analyticsARead-onlyInspect
Aggregate verification analytics ACROSS ALL your apps and organizations in one call — the efficient way to answer questions like "how many people tried phone verification but dropped off in the last 15 days?". Returns summed status counts (request_breakdown), a feature_funnel (how many sessions REACHED each step, e.g. PHONE_VERIFICATION), and a recomputed conversion_rate, for a date window. Omit organization_id/application_id to span everything; pass them to narrow.
Inputs: date_from, date_to, last_n_days, include_timeseries, +2 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_audit_log_listARead-onlyInspect
List audit-log entries for the application (who changed what).
Inputs: organization_id, application_id, cursor. Returns: Structured result. Fields vary by tool; see the success payload.
didit_blocklist_addBInspect
Add an entry to the blocklist (e.g. by vendor_data, document number, face).
Inputs: organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_blocklist_getARead-onlyInspect
List blocklist entries (blocked users/identifiers).
Inputs: organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_blocklist_removeBDestructiveInspect
Remove an entry from the blocklist.
Inputs: organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_branding_getARead-onlyInspect
Get the current branding customization (logos, colors) applied to your verification UI.
Inputs: no named parameters. Returns: Structured result. Fields vary by tool; see the success payload.
didit_branding_updateBInspect
Update verification UI branding images. Provide absolute file paths for the images you want to set.
Inputs: image_square_path, image_rectangular_path, image_favicon_path. Returns: Structured result. Fields vary by tool; see the success payload.
didit_case_createCInspect
Create a case.
Inputs: organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_case_getBRead-onlyInspect
Get a case with its details.
Inputs: case_id (required), organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_case_listARead-onlyInspect
List investigation/compliance cases for ONE app; with multiple apps (or no scope) it auto-spans all your apps. For a cross-app query prefer didit_case_search.
Inputs: organization_id, application_id, status, cursor. Returns: Structured result. Fields vary by tool; see the success payload.
didit_case_manageBDestructiveInspect
Act on a case: assign, resolve, reopen, escalate, comment, or update.
Inputs: case_id (required), action (required), organization_id, application_id, +1 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_case_searchARead-onlyInspect
Search case-management cases ACROSS ALL your apps and organizations in one call. Omit organization_id/application_id to span everything; pass them to narrow. Returns newest first, each tagged with its org/app.
Inputs: status, search, date_from, date_to, +4 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_case_statisticsARead-onlyInspect
Get case statistics (counts by status, etc.).
Inputs: organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_context_getARead-onlyInspect
Return ALL organizations you can access with their applications nested, plus the default org/app when unambiguous — in ONE call (replaces didit_org_list + per-org didit_org_list_applications). Call this first to discover ids.
Inputs: no named parameters. Returns: Structured result. Fields vary by tool; see the success payload.
didit_lists_createAInspect
Create an allowlist or custom list. System blocklists are auto-provisioned (one per entry type) and cannot be created. name must be unique per application.
Inputs: name (required), list_type (required), entry_type (required), description. Returns: Structured result. Fields vary by tool; see the success payload.
didit_lists_deleteADestructiveInspect
Delete an allowlist/custom list and all its entries. System blocklists cannot be deleted.
Inputs: list_uuid (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_lists_entries_listARead-onlyInspect
List entries in a specific list. Use search to filter by value or label.
Inputs: list_uuid (required), search, limit, offset. Returns: Structured result. Fields vary by tool; see the success payload.
didit_lists_entry_createAInspect
Add an entry to a blocklist/allowlist/custom list. Pass value directly, or reference_session_id to auto-extract from a session (face, document, phone, email, IP, device). Pass both to disambiguate when a session has multiple values of the same type. For face entries without a session, use didit_lists_entry_upload_face instead.
Inputs: list_uuid (required), value, reference_session_id, reference_object_uuid, +3 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_lists_entry_deleteADestructiveInspect
Remove an entry from a list. Also unblocks the underlying user/business if applicable.
Inputs: list_uuid (required), entry_uuid (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_lists_entry_upload_faceAInspect
Add a face entry to a face list by uploading an image directly (no session needed). Use this when you have a photo but no reference_session_id.
Inputs: list_uuid (required), image_path (required), display_label, comment. Returns: Structured result. Fields vary by tool; see the success payload.
didit_lists_getARead-onlyInspect
Get a single list's details by UUID.
Inputs: list_uuid (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_lists_listARead-onlyInspect
List all lists (blocklists, allowlists, custom) for the application. Filter by list_type or entry_type.
Inputs: list_type, entry_type, limit, offset. Returns: Structured result. Fields vary by tool; see the success payload.
didit_lists_updateAInspect
Rename or update the description of an allowlist/custom list. System blocklists are immutable.
Inputs: list_uuid (required), name, description. Returns: Structured result. Fields vary by tool; see the success payload.
didit_org_get_applicationARead-onlyInspect
Get application details (client_id etc.). The api_key is REDACTED — a masked preview + api_key_set flag are returned, never the raw secret. Use didit_org_reveal_application_api_key to obtain the raw key.
Inputs: organization_id (required), application_id (required), access_token. Returns: Structured result. Fields vary by tool; see the success payload.
didit_org_get_balanceARead-onlyInspect
Get current credit balance and auto-refill settings.
Inputs: no named parameters. Returns: Structured result. Fields vary by tool; see the success payload.
didit_org_invite_memberBInspect
Invite a member to the organization (email + role).
Inputs: email (required), organization_id, role. Returns: Structured result. Fields vary by tool; see the success payload.
didit_org_listARead-onlyInspect
List the organizations you belong to (each has an id to pass as organization_id to other tools). In hosted OAuth mode no arguments are needed; in stdio mode pass access_token from login/verify_email.
Inputs: access_token. Returns: Structured result. Fields vary by tool; see the success payload.
didit_org_list_api_keysBRead-onlyInspect
List API keys (pass application_id for an app's keys).
Inputs: organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_org_list_applicationsBRead-onlyInspect
List the applications in an organization (each has an id to pass as application_id). In hosted OAuth mode pass only organization_id.
Inputs: organization_id (required), access_token. Returns: Structured result. Fields vary by tool; see the success payload.
didit_org_list_membersBRead-onlyInspect
List the organization's members.
Inputs: organization_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_org_list_rolesBRead-onlyInspect
List the roles available in the organization.
Inputs: organization_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_org_remove_memberCDestructiveInspect
Remove a member from the organization.
Inputs: member_id (required), organization_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_org_reveal_application_api_keyADestructiveInspect
Return the RAW, un-redacted api_key for an application. This exposes a LIVE SECRET — only call when a human explicitly needs the key to integrate; never log or persist it. Requires confirm:true AND an explicit organization_id + application_id (no defaults).
Inputs: organization_id (required), application_id (required), confirm (required), access_token. Returns: Structured result. Fields vary by tool; see the success payload.
didit_org_top_upADestructiveInspect
Create a Stripe checkout session to top up credits. Returns a checkout URL.
Inputs: amount_in_dollars (required), success_url, cancel_url. Returns: Structured result. Fields vary by tool; see the success payload.
didit_org_update_memberCInspect
Update a member's role.
Inputs: member_id (required), organization_id, role. Returns: Structured result. Fields vary by tool; see the success payload.
didit_questionnaire_createAInspect
Create a custom questionnaire. The backend expects title + form_elements (an array of form-element objects, each with an UPPERCASE element_type) — NOT questions.
Inputs: title (required), form_elements (required), description. Returns: Structured result. Fields vary by tool; see the success payload.
didit_questionnaire_deleteBDestructiveInspect
Delete a questionnaire.
Inputs: questionnaire_id (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_questionnaire_getARead-onlyInspect
Get full details of a specific questionnaire (questions, options, translations).
Inputs: questionnaire_id (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_questionnaire_listARead-onlyInspect
List all custom questionnaires for your application.
Inputs: no named parameters. Returns: Structured result. Fields vary by tool; see the success payload.
didit_questionnaire_updateAInspect
Update a questionnaire's title, description, or form_elements (array of form-element objects with UPPERCASE element_type).
Inputs: questionnaire_id (required), title, description, form_elements. Returns: Structured result. Fields vary by tool; see the success payload.
didit_report_exportCRead-onlyInspect
Start an export report. kind ∈ sessions | transactions | businesses | vendor-users | vendor-businesses.
Inputs: kind (required), organization_id, application_id, data. Returns: Structured result. Fields vary by tool; see the success payload.
didit_report_getARead-onlyInspect
Get a report's status/details.
Inputs: report_id (required), organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_report_get_download_urlCRead-onlyInspect
Get a signed download URL for a finished report.
Inputs: report_id (required), organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_report_listBRead-onlyInspect
List generated export reports.
Inputs: organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_add_reviewAInspect
Add a review note to a session's audit trail, optionally changing its status.
Inputs: session_id (required), comment, new_status. Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_batch_deleteADestructiveInspect
Delete multiple sessions by session numbers, or delete all sessions.
Inputs: session_numbers, delete_all. Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_createAInspect
Create a verification session. Requires workflow_id (created in the Console Workflows page) — the workflow defines which steps run and whether the session is KYC or KYB. Returns session_id, url, and session_token.
Inputs: workflow_id (required), vendor_data, callback, callback_method, +5 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_create_importBInspect
Create a bulk import job from a hosted CSV/NDJSON file (e.g. migrating historical verifications into Didit). Pass source_file_url. All imports use Didit's canonical schema. To label a record's source, include the optional per-row provider column in the file itself (defaults to generic) — there is no provider request field.
Inputs: source_file_url (required), import_type, source_format, workflow_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_deleteADestructiveInspect
Permanently delete a single verification session and all associated data.
Inputs: session_id (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_generate_pdfBRead-onlyInspect
Generate a PDF verification report for a session.
Inputs: session_id (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_get_decisionARead-onlyInspect
Get the full verification decision and all extracted data for a session.
Inputs: session_id (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_get_importARead-onlyInspect
Get the status and summary of a bulk import job.
Inputs: import_id (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_get_import_errorsARead-onlyInspect
List per-row errors for a bulk import job (rows that failed validation or processing).
Inputs: import_id (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_get_import_templateARead-onlyInspect
Download the canonical import template (column headers and format) used by didit_session_create_import.
Inputs: no named parameters. Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_listARead-onlyInspect
List verification sessions for ONE app. If you have multiple apps (or pass no scope) this automatically spans every app, newest first — but didit_session_search is the canonical cross-app tool and what to reach for to answer "my last N sessions". status accepts session-level values: Not Started, In Progress, In Review, Approved, Declined, Expired, Abandoned, Kyc Expired, Resubmitted, Awaiting User.
Inputs: status, session_kind, vendor_data, workflow_id, +5 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_list_reviewsBRead-onlyInspect
List the review history and activity log for a session.
Inputs: session_id (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_searchARead-onlyInspect
Search verification sessions ACROSS ALL your apps and organizations in a single call — the efficient way to answer "the last 5 in-review sessions across my apps". Aggregates server-side and returns newest matches first, each tagged with its organization/application. Omit organization_id/application_id to span everything; pass them to narrow scope. status accepts: Not Started, In Progress, In Review, Approved, Declined, Expired, Abandoned, Kyc Expired, Resubmitted, Awaiting User.
Inputs: status, session_kind, workflow_id, search, +6 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_update_dataAInspect
Correct the KYC data extracted from the ID document on a session (reviewer override). Only send the fields you want to change.
Inputs: session_id (required), document_type, document_subtype, document_number, +14 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_update_poa_dataAInspect
Correct the Proof of Address data extracted from the POA document on a session (reviewer override). Only send the fields you want to change.
Inputs: session_id (required), issuing_state, document_type, document_language, +6 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_session_update_statusAInspect
Approve, decline, or request resubmission of a session. For resubmission, pass new_status='Resubmitted' and nodes_to_resubmit; already-approved steps are kept.
Inputs: session_id (required), new_status (required), comment, nodes_to_resubmit, +3 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_transaction_createBInspect
Submit a transaction for monitoring and rule evaluation. transaction_details and subject shapes depend on transaction_category.
Inputs: transaction_id (required), transaction_category (required), transaction_details (required), subject (required), +7 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_transaction_getARead-onlyInspect
Get a single monitored transaction and its rule-evaluation result.
Inputs: transaction_id (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_transaction_listARead-onlyInspect
List monitored transactions for ONE app; with multiple apps (or no scope) it auto-spans all your apps. For a cross-app query prefer didit_transaction_search. Supports limit/offset pagination.
Inputs: limit, offset. Returns: Structured result. Fields vary by tool; see the success payload.
didit_transaction_screen_walletAInspect
Screen a single crypto wallet address for AML risk WITHOUT creating a transaction. Returns risk_score, severity, sanctions_hit, source/destination of funds. Requires transaction monitoring to be configured (a provider key) or returns 409.
Inputs: wallet_address (required), blockchain (required), direction. Returns: Structured result. Fields vary by tool; see the success payload.
didit_transaction_searchARead-onlyInspect
Search transaction-monitoring (AML) transactions ACROSS ALL your apps and organizations in one call. Omit organization_id/application_id to span everything; pass them to narrow. Returns newest first, each tagged with its org/app.
Inputs: status, search, date_from, date_to, +4 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_business_createCInspect
Create a business record manually (KYB).
Inputs: vendor_data, display_name, legal_name, registration_number, +3 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_business_deleteADestructiveInspect
Batch delete businesses by vendor_data list and/or didit_internal_id list, or delete all businesses.
Inputs: vendor_data_list, didit_internal_id_list, delete_all. Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_business_getARead-onlyInspect
Get details of a specific business by its vendor_data identifier.
Inputs: vendor_data (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_business_listARead-onlyInspect
List verified businesses (KYB, grouped by vendor_data) for ONE app; with multiple apps (or no scope) it auto-spans all your apps. For a cross-app lookup prefer didit_vendor_business_search. Supports limit/offset pagination.
Inputs: limit, offset. Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_business_searchARead-onlyInspect
Find vendor businesses (KYB companies) ACROSS ALL your apps and organizations in one call. Omit organization_id/application_id to span everything; pass them to narrow. Each hit is tagged with its org/app.
Inputs: search, vendor_data, status, date_from, +5 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_business_updateBInspect
Update a business's profile fields. Only send the fields you want to change.
Inputs: vendor_data (required), display_name, legal_name, registration_number, +3 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_business_update_statusBInspect
Set a business's monitoring status (ACTIVE, FLAGGED, or BLOCKED).
Inputs: vendor_data (required), status (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_user_createBInspect
Create a user record manually (e.g. to pre-register a vendor_data identity or attach allowlisted emails/phones).
Inputs: vendor_data (required), full_name, display_name, date_of_birth, +5 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_user_deleteADestructiveInspect
Batch delete users by vendor_data list, or delete all users.
Inputs: vendor_data_list, delete_all. Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_user_getARead-onlyInspect
Get details of a specific user by their vendor_data identifier.
Inputs: vendor_data (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_user_listARead-onlyInspect
List verified users (grouped by vendor_data) for ONE app; with multiple apps (or no scope) it auto-spans all your apps. For a cross-app customer lookup prefer didit_vendor_user_search. Supports limit/offset pagination.
Inputs: limit, offset. Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_user_searchARead-onlyInspect
Find vendor users (your end customers) ACROSS ALL your apps and organizations in one call — e.g. locate a customer by vendor_data/email/name without knowing which app they're in. Omit organization_id/application_id to span everything; pass them to narrow. Each hit is tagged with its org/app.
Inputs: search, vendor_data, status, date_from, +5 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_user_updateAInspect
Update a user's profile fields. Only send the fields you want to change. To change ONLY the monitoring status, prefer didit_vendor_user_update_status.
Inputs: vendor_data (required), full_name, display_name, date_of_birth, +5 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_vendor_user_update_statusBInspect
Set a user's monitoring status (ACTIVE, FLAGGED, or BLOCKED).
Inputs: vendor_data (required), status (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_ageBInspect
Estimate a person's age from a facial image. Also performs passive liveness check.
Inputs: image_path (required), organization_id, application_id, vendor_data. Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_amlBInspect
AML screening against global watchlists, PEP lists, sanctions, and (optionally) adverse media. Supports person and company entity types.
Inputs: full_name (required), organization_id, application_id, entity_type, +7 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_databaseCInspect
Validate identity data against national and global authoritative data sources. issuing_state (ISO 3166-1 alpha-2) is required and selects which sources run.
Inputs: issuing_state (required), organization_id, application_id, first_name, +15 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_email_checkAInspect
Verify the OTP code sent to an email. Max 3 attempts per code.
Inputs: email (required), code (required), organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_email_sendAInspect
Send a one-time verification code to an email address. Code valid for 5 minutes.
Inputs: email (required), organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_face_matchAInspect
Compare two facial images to determine if they belong to the same person (1:1 face matching). The score is symmetric, so image order does not affect the result.
Inputs: image_1_path (required), image_2_path (required), organization_id, application_id, +1 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_face_searchAInspect
Search for a face against a database of previously verified faces (1:N face matching).
Inputs: image_path (required), organization_id, application_id, vendor_data. Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_idAInspect
Verify an identity document by submitting front (and optionally back) images. Returns structured OCR data and authenticity checks.
Inputs: front_image_path (required), organization_id, application_id, back_image_path, +4 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_kyb_searchAInspect
Search official company registries for a business by name and/or registration number. Returns candidate matches; pass a candidate's kyb_response_id to didit_verify_kyb_select to pull the full record.
Inputs: country_code (required), organization_id, application_id, name, +5 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_kyb_selectAInspect
Resolve a candidate from didit_verify_kyb_search into a full company registry record. kyb_response_id is the per-search candidate handle returned by the search.
Inputs: kyb_response_id (required), organization_id, application_id, vendor_data, +2 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_passive_livenessAInspect
Passive liveness detection -- verify a person is physically present from a single image (no interaction required).
Inputs: image_path (required), organization_id, application_id, vendor_data. Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_phone_checkAInspect
Verify the OTP code sent to a phone number. Max 3 attempts per code.
Inputs: phone_number (required), code (required), organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_phone_sendAInspect
Send a one-time verification code to a phone number via SMS. Code valid for 5 minutes.
Inputs: phone_number (required), organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_verify_poaBInspect
Proof of Address verification. Submit a single document image to extract and validate address information.
Inputs: document_image_path (required), organization_id, application_id, vendor_data, +4 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_webhook_createAInspect
Create a webhook destination. The response includes the signing secret used to verify the X-Signature header on delivered events.
Inputs: label (required), url (required), enabled, webhook_version, +1 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_webhook_deleteADestructiveInspect
Delete a webhook destination so it stops receiving events.
Inputs: destination_uuid (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_webhook_getARead-onlyInspect
Get a single webhook destination, including its signing secret.
Inputs: destination_uuid (required). Returns: Structured result. Fields vary by tool; see the success payload.
didit_webhook_listARead-onlyInspect
List configured webhook destinations. Each destination has its own URL, version, enabled flag, subscribed events, and signing secret.
Inputs: no named parameters. Returns: Structured result. Fields vary by tool; see the success payload.
didit_webhook_updateAInspect
Update a webhook destination's URL, version, enabled flag, or subscribed events.
Inputs: destination_uuid (required), label, url, enabled, +2 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_createAInspect
Create a SIMPLE (linear) verification workflow from an ordered list of features. Send features (uppercase feature values, in execution order) — NOT flat is_*_enabled flags or a workflow_type (those are rejected with 400). Put dependency features first (e.g. OCR before FACE_MATCH/NFC/DATABASE_VALIDATION). KYB workflows use KYB_REGISTRY/KYB_DOCUMENTS/KYB_KEY_PEOPLE. For BRANCHING / conditional logic (e.g. decline on a status, route on an extracted field, Document-AI proof-of-funds), use the graph tools instead: didit_workflow_get_field_definitions → build a graph → didit_workflow_validate_graph → didit_workflow_set_graph.
Inputs: features (required), organization_id, application_id, workflow_label, +7 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_create_draftAInspect
Create an editable DRAFT version from a published workflow (graph/config edits require a DRAFT). Returns the new draft's uuid.
Inputs: workflow_id (required), organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_deleteADestructiveInspect
Delete a verification workflow. Existing sessions using it are not affected.
Inputs: workflow_id (required), organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_edit_graphAInspect
MODIFY an existing workflow's graph with small OPERATIONS — the right tool for editing a live workflow. You send only the deltas; the MCP fetches the full current graph SERVER-SIDE, applies your ops, validates, auto-creates a DRAFT (the live version is never touched), and saves. This means huge feature configs (documents_allowed, poa_documents_allowed, phone countries) are preserved exactly and you NEVER resend them. Validation failures return applied:false with the errors (nothing saved). Example to insert a branch after OCR and rejoin the existing pipeline at the Liveness node: ops = [ {op:'set_next', node_id:'<ocr_node>', next:'branch1'}, {op:'set_node', node_id:'branch1', node:{node_type:'branch', branches:[{id:'declined',logic:'or',rules:[{field:'kyc.status',operator:'equals',value:'Declined'}],goto:'decline1'},{id:'eng',logic:'and',rules:[{field:'kyc.extra_fields.profession',operator:'fuzzy_match',value:'Software Engineer',score:80}],goto:'pof1'}], next:'<liveness_node>'}}, {op:'set_node', node_id:'decline1', node:{node_type:'status',session_status:'Declined'}}, {op:'set_node', node_id:'pof1', node:{node_type:'feature',feature:'DOCUMENT_AI',config:{document_ai_documents:[...]},next:'<liveness_node>'}} ].
Inputs: workflow_id (required), operations (required), publish, organization_id, +1 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_getBRead-onlyInspect
Get the full configuration of a specific workflow.
Inputs: workflow_id (required), organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_get_branch_fieldsARead-onlyInspect
Given a candidate graph and a branch node, return the fields actually available at that point (only features that completed on every path reaching the branch, plus dynamically-derived Document-AI/questionnaire fields).
Inputs: workflow_id (required), graph (required), node_id, organization_id, +1 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_get_field_definitionsARead-onlyInspect
List every field you can branch on plus the operators valid for each (e.g. kyc.status, kyc.extra_fields.profession with fuzzy_match, document_ai., aml.risk_score). Call this before building branch rules so the field/operator pairs are valid.
Inputs: workflow_id (required), organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_get_graphARead-onlyInspect
Get the node/graph for a workflow (the structure: nodes, branches, conditions, Document-AI steps) + status/version/is_editable. Large feature configs (documents_allowed, poa_documents_allowed, phone countries) are SUMMARIZED by default so the response never overflows — set include_config:true for the raw config. Pass just workflow_id; the owning org/app is resolved automatically. To MODIFY the graph, prefer didit_workflow_edit_graph (small ops, no need to resend big configs).
Inputs: workflow_id (required), include_config, organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_listARead-onlyInspect
List verification workflows. With multiple apps (or no scope) it auto-spans every app, each row tagged with its org/app. To find one workflow by id/label across all apps, prefer didit_workflow_search.
Inputs: organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_publishAInspect
Publish a draft workflow version — makes it the live version for NEW sessions. Existing sessions are unaffected.
Inputs: workflow_id (required), organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_searchARead-onlyInspect
Find verification workflows ACROSS ALL your apps/orgs in one call. Pass workflow_id to locate a specific workflow by its version uuid OR stable workflow_id (returns which org/app it lives in), or search to match by label. Use this instead of guessing the application when you only have a workflow id.
Inputs: workflow_id, search, limit, organization_id, +1 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_set_graphAInspect
Replace a workflow's ENTIRE node/graph. Use this only to build a NEW/small workflow from scratch — to modify an EXISTING workflow prefer didit_workflow_edit_graph (you'd otherwise have to resend every node incl. multi-100KB allow-lists). If the workflow is published, a DRAFT is auto-created and the graph applied there (a live version is NEVER mutated); reviewable DRAFT unless publish:true. Validate first. Example graph: OCR → branch[ kyc.status==Declined → status(Declined); kyc.extra_fields.profession fuzzy_match 'Software Engineer' score 80 → DOCUMENT_AI(proof of funds) → status(Determine) ; else → status(Determine) ].
Inputs: workflow_id (required), graph (required), publish, organization_id, +1 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_updateAInspect
Update a SIMPLE (linear) workflow's top-level settings or its flat features array (same shape as create). This does NOT add branching — to add conditional branches, a Document-AI step, or any node/graph logic, use didit_workflow_set_graph (it never flattens a graph into a linear list). Editing features retroactively affects how past sessions' decisions are read, so change deliberately.
Inputs: workflow_id (required), organization_id, application_id, workflow_label, +8 more. Returns: Structured result. Fields vary by tool; see the success payload.
didit_workflow_validate_graphARead-onlyInspect
Dry-run validate a graph WITHOUT saving. Returns per-node errors (bad field/operator, missing dependency, branching on a field before its feature runs, etc.). Always validate before didit_workflow_set_graph.
Inputs: workflow_id (required), graph (required), organization_id, application_id. Returns: Structured result. Fields vary by tool; see the success payload.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
TDQS
Scored across 121 tools
Each tool targets a specific action on a distinct entity (e.g., session, vendor, workflow) with clear, detailed descriptions. Even similarly named tools like list vs. search are explicitly differentiated by scope and purpose, leaving no ambiguity.
All tools follow the pattern `didit_<domain>_<verb>` in snake_case. Verbs are consistent (create, list, get, delete, update, search, etc.), and the naming is predictable across all 121 tools.
At 121 tools, the server is extremely heavy. While the domain (identity verification and compliance) is broad, the granularity exceeds typical expectations—many sub-actions are separate tools rather than parameters. This strains discoverability and selection.
The tool surface covers account management, verification (multiple types), sessions, cases, workflows, webhooks, reporting, and vendor management with full CRUD. Minor gaps exist (e.g., no bulk user update), but the domain is comprehensively addressed.
Maintenance
Related MCP Connectors
Context and control for any AI. Agent identity, scoped access, and proof across tools.
The OpenRouter for tools. One MCP connection gives any AI agent 254 hosted tools, pay per call.
Verified, pay-per-use API tools for AI agents through one authenticated connection.
100+ MCP tools for AI agents: content metadata, trade intelligence, business-expertise analysis.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA comprehensive Model Context Protocol toolkit that transforms AI assistants into autonomous agents capable of executing real-world tasks across filesystems, web requests, Git workflows, databases, system commands, and AI integrations.MIT

APIVerve MCP Serverofficial
AlicenseNot gradedqualityCmaintenanceProvides access to 249+ production-ready APIs through the Model Context Protocol, enabling AI assistants to fetch weather, news, geocoding, validation, and more data.2 npm4MIT- AlicenseNot gradedqualityDmaintenanceEnables AI agents to perform identity verification, KYC/KYB, PEP & sanctions screening, bank statement analysis, and workflow automation via the Model Context Protocol.MIT
- AlicenseBqualityDmaintenanceProvides AI agents with 40 tools for structured data storage, querying, web search, URL fetching, scheduled jobs, and execution through the Model Context Protocol.4454 npmMIT