Skip to main content
Use these config fields inside each item of the features array for POST /v3/workflows/ and PATCH /v3/workflows/{settings_uuid}/.
The v3 workflow API builds a linear node-based workflow from the ordered features array. Send features in the exact execution order.
Which engine runs a feature — Didit’s own, or a third-party provider — is not one of the config fields below. It’s managed through the console’s Marketplace, which sets provider_key and fallback_to_native on the feature’s config object for you.

Validation rules

  • OCR defaults to all supported countries and document types when config.documents_allowed is omitted, null, or {}. If you send a custom documents_allowed object, it must contain at least one valid country and one enabled document type. Each document config can set sides to 1 for front-only capture or 2 for front-and-back capture.
  • QUESTIONNAIRE requires config.questionnaire_uuid.
  • KYB_DOCUMENTS requires config.kyb_required_document_groups.
  • FACE_MATCH must come after OCR in simple workflow requests.
  • NFC, DATABASE_VALIDATION, and person AML require OCR when they appear in the same workflow.
  • KYB sub-features such as KYB_DOCUMENTS and KYB_KEY_PEOPLE require KYB_REGISTRY earlier in the workflow.
  • A workflow is either a person (KYC) workflow or a business (KYB) workflow, never both. A workflow that uses any KYB feature (KYB_REGISTRY, KYB_DOCUMENTS, KYB_KEY_PEOPLE) may only combine it with AML, DOCUMENT_AI, QUESTIONNAIRE, PHONE_VERIFICATION, EMAIL_VERIFICATION, and IP_ANALYSIS. It cannot include person-only features such as OCR, LIVENESS, FACE_MATCH, NFC, PROOF_OF_ADDRESS, DATABASE_VALIDATION, or AGE_ESTIMATION, and a person workflow cannot include KYB features. On a business workflow DOCUMENT_AI compares any field marked is_full_name against the verified company instead of a person. To verify the people behind a company, build a separate KYC workflow and reference it from the KYB_KEY_PEOPLE node using kyb_ubo_verification_workflow, kyb_officer_verification_workflow, or kyb_shareholder_verification_workflow.
  • Action fields use DECLINE, REVIEW, or NO_ACTION unless the field below says it is restricted.
  • Score and threshold fields are numbers from 0 to 100 unless a narrower range is listed.

Common status rules

Every feature supports an optional status_rules array. Use it to override the feature status when a field condition matches.
Read the example above as: kyc.extra_fields.profession fuzzy matches Soft. Engineer with a minimum score of 80 → set the feature status to Declined. For ID Verification, target extracted extra_fields values such as kyc.extra_fields.profession, driver license class validity dates like kyc.extra_fields.dl_class_code_b_from and kyc.extra_fields.dl_class_code_b_to, or per-class restriction/information codes like kyc.extra_fields.dl_class_code_b_notes (column 12 of UK licences). These values come from the OCR result’s extra_fields object; they are not part of expected_details.
dl_class_code_*_from and dl_class_code_*_to are always either a valid ISO date or absent from extra_fields — Didit never returns unreadable OCR text in a date field. If the class-table cell can’t be read, the field is omitted rather than sent as a raw string, so use the is_empty operator to route unreadable class dates instead of assuming the field is always present.
For date fields, use value_type: "relative_date" with a value object shaped as { "direction": "past" | "future", "amount": number, "unit": "days" | "months" | "years" }. For example, operator: "less_than" with { "direction": "past", "amount": 3, "unit": "years" } matches dates older than three years from today.

OCR / ID Verification

Feature value: OCR.
Document liveness is configured with the six document_liveness_* thresholds above, not with per-signal action fields. portrait_replacement_action, printed_copy_action and screen_capture_action are account-level settings and are not accepted in a workflow feature config: the API strips unknown config keys on save, so sending them there has no effect. Each signal has a decline threshold and a review threshold on a 0-100 scale where a higher score means the document is more likely to be genuine.
Example:

Methods per country

methods is keyed by ISO 3166-1 alpha-3 country code. Each country carries up to three method objects; anything you leave out takes its default.
Validation the API applies on save:
  • An unknown country code, an unknown key inside a country, or an unknown key inside a method is rejected — nothing is silently dropped.
  • A country where no method is enabled is rejected: nobody there could verify.
  • fallback_to_document in a country where document.enabled is false declines at runtime, because there is nowhere to fall back to.
The current staging implementation applies id_lookup.response_fields to comparison output, optional gender and retained registry portraits. Required identity fields remain part of the verification record. This is not a guarantee that every intermediate provider payload is excluded from processing. Production rollout has not been verified for this change; confirm the behavior in your target environment before relying on field selection for retention requirements.
Read the capability catalog before you write methods — through the console’s Countries tab, or with the didit_workflow_get_id_verification_methods_catalog MCP tool. Behaviour, coverage and billing are on ID Verification methods.

NFC / ePassport

Feature value: NFC.

Liveness

Feature value: LIVENESS.

Face Match

Feature value: FACE_MATCH.

Age Estimation

Feature value: AGE_ESTIMATION.

Phone Verification

Feature value: PHONE_VERIFICATION. Phone Verification is disabled until the organization completes its first top-up.
Phone intelligence enrichment is an optional add-on. When phone_enrichment_enabled is true, each completed phone verification is enriched with phone intelligence and billed $0.05 per request in addition to the standard phone verification cost. The score-based actions only take effect once the enrichment score is available; the trust-index, phone-type and porting actions apply as soon as enrichment runs.The social footprint check is a second, separate add-on. When phone_social_enabled is true, each completed phone verification also reports which online platforms the number is registered on - messaging, social media, e-commerce and professional services - and is billed $0.05 per request. It can be enabled with or without phone_enrichment_enabled: the two add-ons are priced and billed independently. A lookup that finds the number on none of the platforms it covers is a valid, billable answer and triggers phone_no_social_presence_action. Use phone.social_profiles_registered (the number of platforms the number is registered on) to branch on the result in a workflow graph.

Email Verification

Feature value: EMAIL_VERIFICATION.
Email intelligence enrichment is an optional add-on. When email_enrichment_enabled is true, each completed email verification is enriched with email intelligence and billed $0.05 per request in addition to the standard email verification cost. The score-based action takes effect once the enrichment score is available; the breach actions apply as soon as enrichment runs.The social footprint check is a second, separate add-on. When email_social_enabled is true, each completed email verification also reports which online platforms the address is registered on - email providers, social media, professional, e-commerce and entertainment services - and is billed $0.05 per request. It can be enabled with or without email_enrichment_enabled: the two add-ons are priced and billed independently. A lookup that finds the address on none of the platforms it covers is a valid, billable answer and triggers email_no_social_presence_action. Use email.social_profiles_registered (the number of platforms the address is registered on) to branch on the result in a workflow graph.

Database Validation

Feature value: DATABASE_VALIDATION. Example:
database_validation_countries is what makes this step do anything. A DATABASE_VALIDATION feature saved without it is accepted and then runs no check at all, so always send at least one country with at least one service ID. Service IDs that do not belong to the country you list are dropped on save.

AML

Feature value: AML. For KYC person screening, use these fields: For KYB company screening, use these fields:

Device & IP Analysis

Feature value: IP_ANALYSIS. Example:
Use recovered_device_action separately from duplicated_device_action when you want to monitor high-confidence recovered devices before automatically declining them. This is useful during rollout because recovered-device matches are designed for fraud-ring detection but should still be calibrated against your own traffic.

Proof of Address

Feature value: PROOF_OF_ADDRESS.

Questionnaire

Feature value: QUESTIONNAIRE.

KYB Registry

Feature value: KYB_REGISTRY. kyb_registry_fields_config maps each configurable field key to {"enabled": bool, "required": bool}. enabled: false hides the field, enabled: true, required: false shows it as optional, and enabled: true, required: true makes it mandatory at submit. company_name, country_code, and region are always shown and required and cannot be configured. When the object is omitted, null, or {}, the default applies: only incorporation_date is required and every other field is optional.
Configurable field keys: 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, control_scheme. See configurable registry form fields for the end-user behavior and VAT validation for how vat_number is checked against VIES.

KYB Documents

Feature value: KYB_DOCUMENTS.

KYB Key People

Feature value: KYB_KEY_PEOPLE.

Document AI

Feature value: DOCUMENT_AI. Requests one or more documents from the user and extracts the named fields you define with a vision model. Each configured field becomes a branchable value document_ai.<key>, and the step’s outcome is document_ai.status. Each entry in document_ai_documents is a document: Each entry in a document’s fields is a field: Example: